最簡(jiǎn)單的方式就是購(gòu)買一個(gè)etl工具,可以實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)之間的交流。再不行就做一個(gè)程序?qū)iT針對(duì)mysql與SQLserver之間數(shù)據(jù)的轉(zhuǎn)換,反正也沒(méi)有幾個(gè)表,用hibernate(java),nhibernate(C#)二級(jí)緩存機(jī)制將表中字段轉(zhuǎn)為一個(gè)個(gè)對(duì)象實(shí)現(xiàn)不同數(shù)據(jù)庫(kù)之間的交流。
創(chuàng)新互聯(lián)建站長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為白堿灘企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,白堿灘網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
首先介紹下 pt-stalk,它是 Percona-Toolkit 工具包中的一個(gè)工具,說(shuō)起 PT 工具包大家都不陌生,平時(shí)常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于這個(gè)工具包,這里就不多介紹了。
pt-stalk 的主要功能是在出現(xiàn)問(wèn)題時(shí)收集 OS 及 MySQL 的診斷信息,這其中包括:
1. OS 層面的 CPU、IO、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)等信息;
2. MySQL 層面的行鎖等待、會(huì)話連接、主從復(fù)制,狀態(tài)參數(shù)等信息。
而且 pt-stalk 是一個(gè) Shell腳本,對(duì)于我這種看不懂 perl 的人來(lái)說(shuō)比較友好,腳本里面的監(jiān)控邏輯與監(jiān)控命令也可以拿來(lái)參考,用于構(gòu)建自己的監(jiān)控體系。
三、使用
接著我們來(lái)看下如何使用這個(gè)工具。
pt-stalk 通常以后臺(tái)服務(wù)形式監(jiān)控 MySQL 并等待觸發(fā)條件,當(dāng)觸發(fā)條件時(shí)收集相關(guān)診斷數(shù)據(jù)。
觸發(fā)條件相關(guān)的參數(shù)有以下幾個(gè):
function:
°?默認(rèn)為 status,代表監(jiān)控 SHOW GLOBAL STATUS 的輸出;
°?也可以設(shè)置為 processlist,代表監(jiān)控 show processlist 的輸出;
variable:
°?默認(rèn)為 Threads_running,代表 監(jiān)控參數(shù),根據(jù)上述監(jiān)控輸出指定具體的監(jiān)控項(xiàng);
threshold:
°?默認(rèn)為 25,代表 監(jiān)控閾值,監(jiān)控參數(shù)超過(guò)閾值,則滿足觸發(fā)條件;
°?監(jiān)控參數(shù)的值非數(shù)字時(shí),需要配合 match 參數(shù)一起使用,如 processlist 的 state 列;
cycles:
°?默認(rèn)為 5,表示連續(xù)觀察到五次滿足觸發(fā)條件時(shí),才觸發(fā)收集;
連接參數(shù):host、password、port、socket。
其他一些重要參數(shù):
iterations:該參數(shù)指定 pt-stalk 在觸發(fā)收集幾次后退出,默認(rèn)會(huì)一直運(yùn)行。
run-time:觸發(fā)收集后,該參數(shù)指定收集多長(zhǎng)時(shí)間的數(shù)據(jù),默認(rèn) 30 秒。
sleep:該參數(shù)指定在觸發(fā)收集后,sleep 多久后繼續(xù)監(jiān)控,默認(rèn) 300 秒。
interval:指定狀態(tài)參數(shù)的檢查頻率,判斷是否需要觸發(fā)收集,默認(rèn) 1 秒。
dest:監(jiān)控?cái)?shù)據(jù)存放路徑,默認(rèn)為 /var/lib/pt-stalk。
retention-time :監(jiān)控?cái)?shù)據(jù)保留時(shí)長(zhǎng),默認(rèn) 30 天。
daemonize:以后臺(tái)服務(wù)運(yùn)行,默認(rèn)不開(kāi)啟。
log:后臺(tái)運(yùn)行日志,默認(rèn)為 /var/log/pt-stalk.log。
collect:觸發(fā)發(fā)生時(shí)收集診斷數(shù)據(jù),默認(rèn)開(kāi)啟。
°?collect-gdb:收集 GDB 堆棧跟蹤,需要 gdb 工具。
°?collect-strace:收集跟蹤數(shù)據(jù),需要 strace 工具。
°?collect-tcpdump:收集 tcpdump 數(shù)據(jù),需要 tcpdump 工具。
實(shí)現(xiàn)兩個(gè)Mysql數(shù)據(jù)庫(kù)之間同步同步原理:
MySQL 為了實(shí)現(xiàn)replication 必須打開(kāi)bin-log 項(xiàng),也是打開(kāi)二進(jìn)制的MySQL 日志記錄選項(xiàng)。MySQL 的bin log 二
進(jìn)制日志,可以記錄所有影響到數(shù)據(jù)庫(kù)表中存儲(chǔ)記錄內(nèi)容的sql 操作,如insert / update / delete 操作,而不記錄
select 這樣的操作。因此,我們可以通過(guò)二進(jìn)制日志把某一時(shí)間段內(nèi)丟失的數(shù)據(jù)可以恢復(fù)到數(shù)據(jù)庫(kù)中(如果二進(jìn)制日
志中記錄的日志項(xiàng),包涵數(shù)據(jù)庫(kù)表中所有數(shù)據(jù),那么, 就可以恢復(fù)本地?cái)?shù)據(jù)庫(kù)的全部數(shù)據(jù)了)。 而這個(gè)二進(jìn)制日志,
如果用作遠(yuǎn)程數(shù)據(jù)庫(kù)恢復(fù),那就是replication 了。這就是使用replication 而不用sync 的原因。這也是為什么要設(shè)
置bin-log = 這個(gè)選項(xiàng)的原因。
在同步過(guò)程中,最重要的同步參照物,就是同步使用那一個(gè)二進(jìn)制日志文件,從那一條記錄開(kāi)始同步。下面就介紹
下怎樣實(shí)現(xiàn)兩個(gè)Mysql數(shù)據(jù)庫(kù)之間的主從同步。
一、 概述
MySQL從3.23.15版本以后提供數(shù)據(jù)庫(kù)復(fù)制(replication)功能,利用該功能可以實(shí)現(xiàn)兩個(gè)數(shù)據(jù)庫(kù)同步、主從模式、
互相備份模式的功能。本文檔主要闡述了如何在linux系統(tǒng)中利用mysql的replication進(jìn)行雙機(jī)熱備的配置。
二、 環(huán)境
操作系統(tǒng):Linux 2.6.23.1-42.fc8 # SMP(不安裝XEN)
Mysql版本:5.0.45-4.fc8
設(shè)備環(huán)境:PC(或者虛擬機(jī))兩臺(tái)
三、 配置
數(shù)據(jù)庫(kù)同步復(fù)制功能的設(shè)置都在MySQL的配置文件中體現(xiàn),MySQL的配置文件(一般是my.cnf):在本環(huán)境下
為/etc/my.cnf。
3.1 設(shè)置環(huán)境:
IP的設(shè)置:
A主機(jī) IP:10.10.0.119
Mask:255.255.0.0
B主機(jī) IP:10.10.8.112
Mask:255.255.0.0
在IP設(shè)置完成以后,需要確定兩主機(jī)的防火墻確實(shí)已經(jīng)關(guān)閉。可以使用命令service iptables status查看防火墻狀態(tài)
。如果防火墻狀態(tài)為仍在運(yùn)行。使用service iptables stop來(lái)停用防火墻。如果想啟動(dòng)關(guān)閉防火墻,可以使用setup命
令來(lái)禁用或定制。
最終以兩臺(tái)主機(jī)可以相互ping通為佳。
3.2 配置A主(master) B從(slave)模式
3.2.1 配置A 為master
1、增加一個(gè)用戶同步使用的帳號(hào):
GRANT FILE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;
GRANTREPLICATION SLAVE ON *.* TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;
賦予10.10.8.112也就是Slave機(jī)器有File權(quán)限,只賦予Slave機(jī)器有File權(quán)限還不行,還要給它REPLICATION SLAVE的權(quán)
限才可以。
2、增加一個(gè)數(shù)據(jù)庫(kù)作為同步數(shù)據(jù)庫(kù):
create databbse test;
3、創(chuàng)建一個(gè)表結(jié)構(gòu):
create table mytest (username varchar(20),password varchar(20));
4、修改配置文件:
修改A的/etc/my.cnf文件,在my.cnf配置項(xiàng)中加入下面配置:
server-id = 1 #Server標(biāo)識(shí)
log-bin
binlog-do-db=test #指定需要日志的數(shù)據(jù)庫(kù)
5、重起數(shù)據(jù)庫(kù)服務(wù):
service mysqld restart
查看server-id:
show variable like ‘server_id’;
實(shí)例:
mysql show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.00 sec)
6、用show master status/G命令看日志情況。
正常為:
mysql show master status/G
*************************** 1. row ***************************
File: mysqld-bin.000002
positiion: 198
Binlog_Do_DB: test,test
Binlog_Ignore_DB:
1 row in set (0.08 sec)
3.2.2 配置B 為slave
1、增加一個(gè)數(shù)據(jù)庫(kù)作為同步數(shù)據(jù)庫(kù):
create databbse test;
2、創(chuàng)建一個(gè)表結(jié)構(gòu):
create table mytest (username varchar(20),password varchar(20));
3、修改配置文件:
修改B的/etc/my.cnf文件,在my.cnf配置項(xiàng)中加入下面配置:
server-id=2
master-host=10.10. 0.119
master-user=backup #同步用戶帳號(hào)
master-password=1234
master-port=3306
master-connect-retry=60 #預(yù)設(shè)重試間隔60秒
replicate-do-db=test #告訴slave只做backup數(shù)據(jù)庫(kù)的更新
5、重起數(shù)據(jù)庫(kù)服務(wù):
service mysqld restart
查看server-id:
show variables like ‘server_id’;
實(shí)例:
mysql show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
6、用show slave status/G命令看日志情況。
正常為:
mysql show slave status/G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.0.119
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 236
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test,test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 236
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.01 sec)
3.2.3 驗(yàn)證配置
分別使用insert, delete , update在A主機(jī)進(jìn)行增刪改查數(shù)據(jù)庫(kù);查看B主機(jī)的數(shù)據(jù)庫(kù)是否與A主機(jī)一致;若一致,則配
置成功。
3.3雙機(jī)互備模式
如果在A主機(jī)加入slave設(shè)置,在B主機(jī)加入master設(shè)置,則可以做B-A的同步。
1、在A主機(jī)的配置文件中 mysqld配置項(xiàng)加入以下設(shè)置:
master-host=10.10.8.112
master-user=backup
master-password=1234
replicate-do-db=test
master-connect-retry=10
2、在B的配置文件中 mysqld配置項(xiàng)加入以下設(shè)置:
log-bin
binlog-do-db=test
注意:當(dāng)有錯(cuò)誤產(chǎn)生時(shí),*.err日志文件同步的線程退出,當(dāng)糾正錯(cuò)誤后,要讓同步機(jī)制進(jìn)行工作,運(yùn)行slave
start。
重起A、B機(jī)器,則可以實(shí)現(xiàn)雙向的熱備份。
總之,成功完成以上配置后,在主服務(wù)器A的test庫(kù)里添加數(shù)據(jù)或刪除數(shù)據(jù),在從服務(wù)器B的test庫(kù)里馬上也能
看到相應(yīng)的變更。兩臺(tái)服務(wù)器的同步操作可以說(shuō)是瞬間完成的。
MYSQL數(shù)據(jù)如何實(shí)時(shí)備份
依次單擊:開(kāi)始--程序--Microsoft SQL Server--企業(yè)管理器--SQL Server組--管理--數(shù)據(jù)庫(kù)維護(hù)計(jì)劃
在右側(cè)空白處右鍵單擊,新建維護(hù)計(jì)劃--勾選要備份的數(shù)據(jù)庫(kù)--下一步
指定數(shù)據(jù)庫(kù)備份計(jì)劃--調(diào)度--單擊"更改"--設(shè)置備份的時(shí)間,備份周期--下一步
每日頻率即是每天什么時(shí)間開(kāi)始進(jìn)行備份
發(fā)生頻率即是執(zhí)行的周期
指定備份磁盤(pán)目錄--修改"使用此目錄"的路徑作為備份數(shù)據(jù)庫(kù)的存放路徑.勾選刪除早于此時(shí)間的文件,我這里選擇一周,即是數(shù)據(jù)庫(kù)備份文件把一周前的進(jìn)行刪除
給此任務(wù)計(jì)劃填寫(xiě)一個(gè)名字:back 2單擊"完成",就可以在數(shù)據(jù)庫(kù)維護(hù)計(jì)劃中看到剛才新建的計(jì)劃.
注意事項(xiàng)
一定要開(kāi)啟sql server agent服務(wù)
kettle是一個(gè)ETL工具,ETL(Extract-Transform-Load的縮寫(xiě),即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過(guò)程)。
kettle中文名稱叫水壺,該項(xiàng)目的主程序員MATT 希望把各種數(shù)據(jù)放到一個(gè)壺里,然后以一種指定的格式流出。
所以他的重心是用于數(shù)據(jù)
oozie是一個(gè)工作流,Oozie工作流是放置在控制依賴DAG(有向無(wú)環(huán)圖 Direct Acyclic Graph)中的一組動(dòng)作(例如,Hadoop的Map/Reduce作業(yè)、Pig作業(yè)等),其中指定了動(dòng)作執(zhí)行的順序。
oozie工作流中是有數(shù)據(jù)流動(dòng)的,但是重心是在于工作流的定義。
二者雖然都有相關(guān)功能及數(shù)據(jù)的流動(dòng),但是其實(shí)用途是不一樣的。
查看幫助
列舉出所有l(wèi)inux上的數(shù)據(jù)庫(kù)
列舉出所有Window上的數(shù)據(jù)庫(kù)
查看數(shù)據(jù)庫(kù)下的所有表
(1)確定mysql服務(wù)啟動(dòng)正常
查詢控制端口和查詢進(jìn)程來(lái)確定,一下兩種辦法可以確認(rèn)mysql是否在啟動(dòng)狀態(tài)
辦法1:查詢端口
MySQL監(jiān)控的TCP的3306端口,如果顯示3306,證明MySQL服務(wù)在運(yùn)行中
辦法二:查詢進(jìn)程
可以看見(jiàn)mysql的進(jìn)程
沒(méi)有指定數(shù)據(jù)導(dǎo)入到哪個(gè)目錄,默認(rèn)是/user/root/表名
原因:
如果表中有主鍵,m的值可以設(shè)置大于1的值;如果沒(méi)有主鍵只能將m值設(shè)置成為1;或者要將m值大于1,需要使用--split-by指定一個(gè)字段
設(shè)置了-m 1 說(shuō)明只有一個(gè)maptask執(zhí)行數(shù)據(jù)導(dǎo)入,默認(rèn)是4個(gè)maptask執(zhí)行導(dǎo)入操作,但是必須指定一個(gè)列來(lái)作為劃分依據(jù)
導(dǎo)入數(shù)據(jù)到指定目錄
在導(dǎo)入表數(shù)據(jù)到HDFS使用Sqoop導(dǎo)入工具,我們可以指定目標(biāo)目錄。使用參數(shù) --target-dir來(lái)指定導(dǎo)出目的地,使用參數(shù)—delete-target-dir來(lái)判斷導(dǎo)出目錄是否存在,如果存在就刪掉
查詢導(dǎo)入
提示:must contain '$CONDITIONS' in WHERE clause。
where id =1 匹配條件
$CONDITIONS:傳遞作用。
如果 query 后使用的是雙引號(hào),則 $CONDITIONS前必須加轉(zhuǎn)義符,防止 shell 識(shí)別為自己的變量。
--query時(shí)不能使用--table一起使用
需要指定--target-dir路徑
導(dǎo)入到hdfs指定目錄并指定要求
數(shù)據(jù)導(dǎo)出儲(chǔ)存方式(數(shù)據(jù)存儲(chǔ)文件格式---( textfil parquet)--as-textfileImports data as plain text (default)--as-parquetfile Imports data to Parquet Files)
導(dǎo)入表數(shù)據(jù)子集到HDFS
sqoop導(dǎo)入blob數(shù)據(jù)到hive
對(duì)于CLOB,如xml文本,sqoop可以遷移到Hive表,對(duì)應(yīng)字段存儲(chǔ)為字符類型。
對(duì)于BLOB,如jpg圖片,sqoop無(wú)法直接遷移到Hive表,只能先遷移到HDFS路徑,然后再使用Hive命令加載到Hive表。遷移到HDFS后BLOB字段存儲(chǔ)為16進(jìn)制形式。
2.1.3導(dǎo)入關(guān)系表到Hive
第一步:導(dǎo)入需要的jar包
將我們mysql表當(dāng)中的數(shù)據(jù)直接導(dǎo)入到hive表中的話,我們需要將hive的一個(gè)叫做hive-exec-1.1.0-cdh5.14.0.jar的jar包拷貝到sqoop的lib目錄下
第二步:開(kāi)始導(dǎo)入
導(dǎo)入關(guān)系表到hive并自動(dòng)創(chuàng)建hive表
們也可以通過(guò)命令來(lái)將我們的mysql的表直接導(dǎo)入到hive表當(dāng)中去
通過(guò)這個(gè)命令,我們可以直接將我們mysql表當(dāng)中的數(shù)據(jù)以及表結(jié)構(gòu)一起倒入到hive當(dāng)中去
--incremental 增量模式。
append id 是獲取一個(gè)某一列的某個(gè)值。
lastmodified “2016-12-15 15:47:35” 獲取某個(gè)時(shí)間后修改的所有數(shù)據(jù)
-append 附加模式
-merge-key id 合并模式
--check-column 用來(lái)指定一些列,可以去指定多個(gè)列;通常的是指定主鍵id
--last -value 從哪個(gè)值開(kāi)始增量
==注意:增量導(dǎo)入的時(shí)候,一定不能加參數(shù)--delete-target-dir 否則會(huì)報(bào)錯(cuò)==
第一種增量導(dǎo)入方式(不常用)
1.Append方式
使用場(chǎng)景:有個(gè)訂單表,里面每個(gè)訂單有一個(gè)唯一標(biāo)識(shí)的自增列id,在關(guān)系型數(shù)據(jù)庫(kù)中以主鍵的形式存在。之前已經(jīng)將id在0-1000之間的編號(hào)的訂單導(dǎo)入到HDFS 中;如果在產(chǎn)生新的訂單,此時(shí)我們只需指定incremental參數(shù)為append,--last-value參數(shù)為1000即可,表示只從id大于1000后開(kāi)始導(dǎo)入。
(1)創(chuàng)建一個(gè)MySQL表
(2)創(chuàng)建一個(gè)hive表(表結(jié)構(gòu)與mysql一致)
注意:
append 模式不支持寫(xiě)入到hive表中
2.lastModify方式
此方式要求原有表有time字段,它能指定一個(gè)時(shí)間戳,讓sqoop把該時(shí)間戳之后的數(shù)據(jù)導(dǎo)入到HDFS;因?yàn)楹罄m(xù)訂單可能狀體會(huì)變化,變化后time字段時(shí)間戳也會(huì)變化,此時(shí)sqoop依然會(huì)將相同狀態(tài)更改后的訂單導(dǎo)入HDFS,當(dāng)然我們可以只當(dāng)merge-key參數(shù)為order-id,表示將后續(xù)新的記錄和原有記錄合并。
# 將時(shí)間列大于等于閾值的數(shù)據(jù)增量導(dǎo)入HDFS
使用 lastmodified 方式導(dǎo)入數(shù)據(jù),要指定增量數(shù)據(jù)是要 --append(追加)還是要 --merge-key(合并)last-value 指定的值是會(huì)包含于增量導(dǎo)入的數(shù)據(jù)中。
第二種增量導(dǎo)入方式(推薦)
==通過(guò)where條件選取數(shù)據(jù)更加精準(zhǔn)==
2.1.5從RDBMS到HBase
會(huì)報(bào)錯(cuò)
原因:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自動(dòng)創(chuàng)建 HBase 表的功能。
解決方案:手動(dòng)創(chuàng)建 HBase 表
導(dǎo)出前,目標(biāo)表必須存在與目標(biāo)數(shù)據(jù)庫(kù)中
默認(rèn)操作是將文件中的數(shù)據(jù)使用insert語(yǔ)句插入到表中
數(shù)據(jù)是在HDFS當(dāng)中的如下目錄/sqoop/emp,數(shù)據(jù)內(nèi)容如下
第一步:創(chuàng)建MySQL表
第二步:執(zhí)行導(dǎo)出命令
通過(guò)export來(lái)實(shí)現(xiàn)數(shù)據(jù)的導(dǎo)出,將hdfs的數(shù)據(jù)導(dǎo)出到mysql當(dāng)中去
全量導(dǎo)出
增量導(dǎo)出
更新導(dǎo)出
總結(jié):
參數(shù)介紹
--update-key 后面也可以接多個(gè)關(guān)鍵字列名,可以使用逗號(hào)隔開(kāi),Sqoop將會(huì)匹配多個(gè)關(guān)鍵字后再執(zhí)行更新操作。
--export-dir 參數(shù)配合--table或者--call參數(shù)使用,指定了HDFS上需要將數(shù)據(jù)導(dǎo)入到MySQL中的文件集目錄。
--update-mode updateonly和allowinsert。 默認(rèn)模式為updateonly,如果指定--update-mode模式為allowinsert,可以將目標(biāo)數(shù)據(jù)庫(kù)中原來(lái)不存在的數(shù)據(jù)也導(dǎo)入到數(shù)據(jù)庫(kù)表中。即將存在的數(shù)據(jù)更新,不存在數(shù)據(jù)插入。
組合測(cè)試及說(shuō)明
1、當(dāng)指定update-key,且關(guān)系型數(shù)據(jù)庫(kù)表存在主鍵時(shí):
A、allowinsert模式時(shí),為更新目標(biāo)數(shù)據(jù)庫(kù)表存的內(nèi)容,并且原來(lái)不存在的數(shù)據(jù)也導(dǎo)入到數(shù)據(jù)庫(kù)表;
B、updateonly模式時(shí),為更新目標(biāo)數(shù)據(jù)庫(kù)表存的內(nèi)容,并且原來(lái)不存在的數(shù)據(jù)也不導(dǎo)入到數(shù)據(jù)庫(kù)表;
2、當(dāng)指定update-key,且關(guān)系型數(shù)據(jù)庫(kù)表不存在主鍵時(shí):
A、allowinsert模式時(shí),為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫(kù)表;
B、updateonly模式時(shí),為更新目標(biāo)數(shù)據(jù)庫(kù)表存的內(nèi)容,并且原來(lái)不存在的數(shù)據(jù)也不導(dǎo)入到數(shù)據(jù)庫(kù)表;
3、當(dāng)不指定update-key,且關(guān)系型數(shù)據(jù)庫(kù)表存在主鍵時(shí):
A、allowinsert模式時(shí),報(bào)主鍵沖突,數(shù)據(jù)無(wú)變化;
B、updateonly模式時(shí),報(bào)主鍵沖突,數(shù)據(jù)無(wú)變化;
4、當(dāng)不指定update-key,且關(guān)系型數(shù)據(jù)庫(kù)表不存在主鍵時(shí):
A、allowinsert模式時(shí),為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫(kù)表;
B、updateonly模式時(shí),為全部數(shù)據(jù)追加導(dǎo)入到數(shù)據(jù)庫(kù)表;
實(shí)際案例:
(1)mysql批量導(dǎo)入hive
使用shell腳本:
筆者目前用sqoop把mysql數(shù)據(jù)導(dǎo)入到Hive中,最后實(shí)現(xiàn)命令行導(dǎo)入,sqoop版本1.4.7,實(shí)現(xiàn)如下
最后需要把這個(gè)導(dǎo)入搞成job,每天定時(shí)去跑,實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)化增量導(dǎo)入,sqoop支持job的管理,可以把導(dǎo)入創(chuàng)建成job重復(fù)去跑,并且它會(huì)在metastore中記錄增值,每次執(zhí)行增量導(dǎo)入之前去查詢
創(chuàng)建job命令如下
創(chuàng)建完job就可以去執(zhí)行它了
sqoop job --exec users
可以把該指令設(shè)為L(zhǎng)inux定時(shí)任務(wù),或者用Azkaban定時(shí)去執(zhí)行它
hive導(dǎo)出到MySQL時(shí),date類型數(shù)據(jù)發(fā)生變化?
問(wèn)題原因:時(shí)區(qū)設(shè)置問(wèn)題,date -R查看服務(wù)器時(shí)間,show VARIABLES LIKE "%time_zone"查看Mysql時(shí)間,system并不表示中國(guó)的標(biāo)準(zhǔn)時(shí)間,要將時(shí)間設(shè)置為東八區(qū)
(1):對(duì)市面上最流行的兩種調(diào)度器,給出以下詳細(xì)對(duì)比,以供技術(shù)選型參考??傮w來(lái)說(shuō),ooize相比azkaban是一個(gè)重量級(jí)的任務(wù)調(diào)度系統(tǒng),功能全面,但配置使用也更復(fù)雜。如果可以不在意某些功能的缺失,輕量級(jí)調(diào)度器azkaban是很不錯(cuò)的候選對(duì)象。
(2):功能:
兩者均可以調(diào)度mapreduce,pig,java,腳本工作流任務(wù);
兩者均可以定時(shí)執(zhí)行工作流任務(wù);
(3):工作流定義:
Azkaban使用Properties文件定義工作流;
Oozie使用XML文件定義工作流;
(4):工作流傳參:
Azkaban支持直接傳參,例如${input};
Oozie支持參數(shù)和EL表達(dá)式,例如${fs:dirSize(myInputDir)};
(5):定時(shí)執(zhí)行:
Azkaban的定時(shí)執(zhí)行任務(wù)是基于時(shí)間的;
Oozie的定時(shí)執(zhí)行任務(wù)基于時(shí)間和輸入數(shù)據(jù);
(6):資源管理:
Azkaban有較嚴(yán)格的權(quán)限控制,如用戶對(duì)工作流進(jìn)行讀/寫(xiě)/執(zhí)行等操作;
Oozie暫無(wú)嚴(yán)格的權(quán)限控制;
(7):工作流執(zhí)行:
Azkaban有兩種運(yùn)行模式,分別是solo server mode(executor server和web server部署在同一臺(tái)節(jié)點(diǎn))和multi server mode(executor server和web server可以部署在不同節(jié)點(diǎn));
Oozie作為工作流服務(wù)器運(yùn)行,支持多用戶和多工作流;
(8):工作流管理:
Azkaban支持瀏覽器以及ajax方式操作工作流;
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流;
瀏覽器頁(yè)面訪問(wèn)
使用Oozie時(shí)通常整合hue,用戶數(shù)據(jù)倉(cāng)庫(kù)調(diào)度
就是剛才選擇的腳本
腳本里需要的參數(shù),盡量設(shè)置為動(dòng)態(tài)自動(dòng)獲取,如 ${date}
第一步的參數(shù)是所有文件和當(dāng)天日期,后面的只需要日期,最后一步是導(dǎo)出所有結(jié)果,相應(yīng)填入
添加文件和設(shè)置相應(yīng)參數(shù)
運(yùn)行后會(huì)有狀態(tài)提示頁(yè)面,可以看到任務(wù)進(jìn)度
點(diǎn)擊調(diào)度任務(wù)的頁(yè)面情況
修改定時(shí)任務(wù)名和描述
添加需要定時(shí)調(diào)度的任務(wù)
sm-workflow的參數(shù)都是寫(xiě)死的,沒(méi)有設(shè)置動(dòng)態(tài),這里的下拉列表就不會(huì)有可選項(xiàng)。
設(shè)置參數(shù)
將sm-workflow的日期修改為 ${do_date},保存
進(jìn)入定時(shí)計(jì)劃sm-dw中,會(huì)看到有參數(shù) do_date
填入相應(yīng)參數(shù),前一天日期
Oozie常用系統(tǒng)常量
當(dāng)然,也可以通過(guò)這樣將參數(shù)傳入workflow任務(wù)中,代碼或者shell中需要的參數(shù)。
如,修改sm-workflow 中的 sqoop_import.sh,添加一個(gè)參數(shù) ${num}。
編輯文件(需要登陸Hue的用戶有對(duì)HDFS操作的權(quán)限),修改shell中的一個(gè)值為參數(shù),保存。
在workflow中,編輯添加參數(shù) ${num} ,或者num=${num} 保存。
進(jìn)入schedule中,可以看到添加的參數(shù),編輯輸入相應(yīng)參數(shù)即可。
Bundle統(tǒng)一管理所有定時(shí)調(diào)度,階段劃分:Bundle Schedule workflow
mysql 數(shù)據(jù)庫(kù),更新字段語(yǔ)句:
一、UPDATE:
UPDATE的功能是更新表中的數(shù)據(jù)。這的語(yǔ)法和INSERT的第二種用法相似。必須提供表名以及SET表達(dá)式,在后面可以加WHERE以限制更新的記錄范圍。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, ...
WHERE ... 。
如下面的語(yǔ)句將users表中id等于123的記錄的age改為24。
UPDATE users SET age = 24 WHERE id = 123。
同樣,可以使用UPDATE更新多個(gè)字段的值 UPDATE users SET age = 24, name = 'Mike' WHERE id = 123。
上面的UPDATE語(yǔ)句通過(guò)WHERE指定一個(gè)條件,否則,UPDATE將更新表中的所有記錄的值。