0x10 SQL與NoSQL,數(shù)據(jù)橋梁Sqoop

SQL處理二維表格數(shù)據(jù)庶香,是一種最樸素的工具甲棍,NoSQL是Not Only SQL,即不僅僅是SQL赶掖。從MySQL導(dǎo)入數(shù)據(jù)到HDFS文件系統(tǒng)中感猛,最簡單的一種方式就是使用Sqoop,然后將HDFS中的數(shù)據(jù)和Hive建立映射奢赂。通過Sqoop作為數(shù)據(jù)橋梁陪白,將傳統(tǒng)的數(shù)據(jù)也存入到NoSQL中來了,有了數(shù)據(jù)膳灶,猴戲才剛剛開始咱士。

0x10.jpg

01 猴年伊始

《云戒云》系列的第一章16篇,從0x00到0x0F已經(jīng)完成轧钓,感興趣可以查找歷史記錄閱讀序厉。這是猴年第一篇,從本篇開始毕箍,文章標題的符號便從0x1開始弛房。

SQL處理二維表格數(shù)據(jù),是一種最樸素的工具霉晕,查詢庭再、更新捞奕、修改、刪除這四種對數(shù)據(jù)的基本操作拄轻,是處理數(shù)據(jù)的一個巨大進步颅围。近些年,各種新的數(shù)據(jù)處理技術(shù)興起了恨搓,都想革SQL的命院促,這些技術(shù)也被大家統(tǒng)稱為NoSQL。

NoSQL最初的意思是No SQL斧抱,估計應(yīng)該是想和SQL劃清界線常拓,就像GNU的遞歸縮寫GNU is Not Unix一樣。后來發(fā)現(xiàn)辉浦,雖然大量的NoSQL技術(shù)起來了弄抬,但SQL還是活得好好的,照樣發(fā)揮著很多不可替代的作用宪郊。漸漸地掂恕,大家也發(fā)現(xiàn),原來這些新技術(shù)弛槐,也只是在不同的應(yīng)用場景下對SQL的補充懊亡,因此也慢慢為NoSQL正名了,原來是Not Only SQL乎串,即不僅僅是SQL店枣,還有很多其它的處理非結(jié)構(gòu)化數(shù)據(jù)和應(yīng)用于各種場景的技術(shù)。甚至很多技術(shù)叹誉,雖然是在NoSQL的框架下鸯两,但也慢慢的又往SQL方向發(fā)展。

NoSQL是一種技術(shù)或者框架的統(tǒng)稱长豁,包括以Mongodb甩卓,Hadoop,Hive蕉斜,Cassandra,Hbase缀棍,Redis等為代表的框架技術(shù)宅此,這些都在特定的領(lǐng)域有很多實際的應(yīng)用。而SQL領(lǐng)域的開源代表自然是MySQL了爬范。


知識星球.jpeg

很多企業(yè)中父腕,業(yè)務(wù)數(shù)據(jù)都是存放在MySQL數(shù)據(jù)庫中的,當數(shù)據(jù)量太大后青瀑,單機版本的MySQL很難滿足業(yè)務(wù)分析的各種需求璧亮。此時萧诫,可能就需要將數(shù)據(jù)存入Hadoop集群環(huán)境中,那么本文的主角Sqoop便適時的出現(xiàn)了枝嘶,用來架起SQL與NoSQL之間的數(shù)據(jù)橋梁帘饶。

02 MySQL導(dǎo)入HDFS

從MySQL導(dǎo)入到HDFS文件系統(tǒng)中,是最簡單的一種方式了群扶,相當于直接將表的內(nèi)容及刻,導(dǎo)出成文件,存放到HDFS中竞阐,以便后用缴饭。

Sqoop最簡單的使用方式,就是一條命令骆莹,唯一需要的是配置相應(yīng)的參數(shù)颗搂。sqoop可以將所有參數(shù)寫在一行上,也可以寫在配置文件里面幕垦。因為導(dǎo)入的選項過多丢氢,通常我們都把參數(shù)寫在配置文件里面,以便更好的調(diào)試智嚷。在導(dǎo)入到HDFS的過程中卖丸,需要配置以下參數(shù):

  • 使用import指令
  • 數(shù)據(jù)源配置:驅(qū)動程序,IP地址盏道,庫稍浆,表,用戶名猜嘱,密碼
  • 導(dǎo)入路徑衅枫,以及是否刪除存在的路徑
  • 并行進程數(shù),以及使用哪個字段進行切分
  • 字段選擇朗伶,以及字段分隔符
  • 查詢語句:自定義查詢弦撩,Limit可以在此處使用
  • 查詢條件:自定義條件

配置文件示例:

# 文件名:your_table.options
import

--connect
jdbc:mysql://1.2.3.4/db_name
--username
your_username
--password
your_passwd
--table
your_table

--null-string
NULL

--columns
id, name

# --query
# select id, name, concat(id,name) from your_table where $CONDITIONS limit 100

# --where
# "status != 'D'"

--delete-target-dir
--target-dir
/pingjia/open_model_detail

--fields-terminated-by
'\001'

--split-by
id
--num-mappers
1

示例參數(shù)說明:

  1. import指令,說明是導(dǎo)入论皆,這兒的“入”是相對于hdfs來說的益楼,即從MySQL導(dǎo)入到hdfs文件系統(tǒng)中。
  2. 以雙橫線開頭的是參數(shù)点晴,其中connect配置數(shù)據(jù)庫驅(qū)動及來源感凤,此處配置了mysql及ip地址和數(shù)據(jù)庫名。
  3. username, password配置用戶名密碼粒督。table配置來源表名陪竿,此處需要注意,如果后面使用了query的方式屠橄,即指定了查詢語句族跛,此處table需要注釋闰挡。
  4. columns配置了從表中讀取的字段,可以是全部礁哄,也可以是部分长酗。同上所求,如果指定了query則不需要配置columns
  5. query是自己指定導(dǎo)出的sql語句姐仅,如果需要自定義導(dǎo)出花枫,則使用。注意掏膏,這兒有一個where條件劳翰,無論是否使用條件,都需要帶上where $CONDITIONS馒疹,$CONDITIONS是后面配置的條件佳簸。
  6. where用于單獨設(shè)置查詢條件
  7. target-dir用于指定導(dǎo)入的目錄,從mysql中導(dǎo)入到hdfs中的數(shù)據(jù)是直接導(dǎo)入到目錄颖变,而不是直接指定文件生均,文件名會自動生成。另外腥刹,如果需要在hive中使用分區(qū)马胧,此處應(yīng)該用子分區(qū)的名字。比如衔峰,增加一個year=2015的分區(qū)佩脊,那么,建立目錄的時候垫卤,把數(shù)據(jù)存入子目錄year=2015中去威彰,這樣后面在hive中直接增加分區(qū)映射即可。delete-target-dir是如果目錄存在便刪除穴肘,否則會報錯歇盼。
  8. fields-terminated-by用于配置導(dǎo)出的各字段之間,使用的分隔符评抚,為防止數(shù)據(jù)內(nèi)容里面包括空格豹缀,通常不推薦用空格,'\001'也是Hive中推薦的字段分隔符慨代,當然耿眉,我們也是為了更好的在Hive中使用數(shù)據(jù)才這樣設(shè)置。
  9. num-mappers是指定并行的mapper(進程數(shù))鱼响,這也是使用sqoop的一大優(yōu)勢,并行可以加快速度组底,默認使用4個進程并行丈积。同時筐骇,split-by需要設(shè)置為一個字段名,通常是id主鍵江滨,即在這個字段上進行切分成4個部分铛纬,每個進程導(dǎo)入一部分。另外唬滑,配置幾個進程數(shù)告唆,最后目錄中生成的文件便是幾個,因此對于小表晶密,建立設(shè)置num-mappers為1擒悬,最后只生成一個文件。

上面使用了配置文件的方式稻艰,在配置文件中懂牧,可以使用#注釋,也可以使用空行尊勿,這樣方便做調(diào)試僧凤。配置好上面的參數(shù)文件,即可調(diào)用測試:

sqoop --options-file your_table.options

如果不報錯元扔,最后會顯示導(dǎo)入的文件大小與文件行數(shù)躯保。

這是一個導(dǎo)入速度的記錄,供參考:

Transferred 3.9978 GB in 811.4697 seconds (5.0448 MB/sec)
Retrieved 18589739 records.

Transferred 3.4982 GB in 350.2751 seconds (10.2266 MB/sec)
Retrieved 16809945 records.

Transferred 846.5802 MB in 164.0938 seconds (5.1591 MB/sec)
Retrieved 5242290 records.

Transferred 172.9216 MB in 72.2055 seconds (2.3949 MB/sec)
Retrieved 1069275 records.

03 增量導(dǎo)入

HDFS文件系統(tǒng)是不允許對記錄進行修改的澎语,只能對文件進行刪除途事,或者追加新文件到目錄中。但Mysql數(shù)據(jù)中的增咏连、刪盯孙、改是最基本的操作,因此導(dǎo)入的數(shù)據(jù)祟滴,可能一會兒就過期了振惰。

從這兒也可以看出,并非所有數(shù)據(jù)都適合導(dǎo)入到HDFS垄懂,通常是日志數(shù)據(jù)或者非常大的需要統(tǒng)計分析的數(shù)據(jù)骑晶。通常不太大的表,也建議直接完整導(dǎo)入草慧,因為本身導(dǎo)入速度已經(jīng)夠快了桶蛔,千萬級別的數(shù)據(jù),也只是幾分鐘而已漫谷。

如果不考慮數(shù)據(jù)的修改問題仔雷,只考慮數(shù)據(jù)的增加問題,可以使用append模式導(dǎo)入。如果需要考慮數(shù)據(jù)修改碟婆,則使用lastmodified的模式电抚。

增量的方式,需要指定以下幾個參數(shù):

--check-column
filed_name
--incremental
append|lastmodified
--last-value
value
  • check_colume:配置檢查增量的字段竖共,通常是id字段蝙叛,或者時間字段
  • incremental: 增量的方式,追加或者最后修改公给,追加從上一次id開始借帘,只追加大于這個id的數(shù)據(jù),通常用于日志數(shù)據(jù)淌铐,或者數(shù)據(jù)不常更新的數(shù)據(jù)肺然。最后修改,需要本身在Mysql里面匣沼,數(shù)據(jù)每次更新狰挡,都更新維護一個時間字段。在此释涛,表示從指定的時間開始加叁,大于這個時間的數(shù)據(jù)都是更新過的,都要導(dǎo)入
  • last-value: 指定了上一次的id值或者上一次的時間

04 映射到hive

導(dǎo)入到HDFS中的數(shù)據(jù)唇撬,要進行統(tǒng)計分析它匕,甚至會需要對多個文檔進行關(guān)聯(lián)分析,還是有不便之處窖认,此時可以再使用Hive來進行數(shù)據(jù)關(guān)聯(lián)豫柬。

首先,需要在Hive中建立表結(jié)構(gòu)扑浸,只選擇性的建立導(dǎo)入的數(shù)據(jù)字段烧给,比如導(dǎo)入了id和name兩個字段,則Hive表也只建立這兩個字段喝噪。

另外础嫡,最好通過external關(guān)鍵字指定建立外部表,這樣Hive只管理表的元數(shù)據(jù)酝惧,真實的數(shù)據(jù)還是由HDFS來存儲和手工進行更新榴鼎。即使刪除了Hive中的表红柱,數(shù)據(jù)依然會存在于HDFS中器联,還可以另做它用绊含。

建表垫言,要指定字段的數(shù)據(jù)格式,通常只需要用四數(shù)據(jù)來替換Mysql的數(shù)據(jù):

string ==> 替換char,varchar
int ==> 替換int
float ==> 替換float
timestamp ==> 替換datetime

另外该窗,還需要指定存儲格式疟呐,字符分隔符和分區(qū)等羊娃,常用的一個建表語句如:

CREATE external TABLE your_table (
id int,
name string
)
PARTITIONED BY (pdyear string)
ROW FORMAT DELIMITED fields terminated by '\001'
STORED AS TEXTFILE
LOCATION '/path/your_table';

上面指定了一個分區(qū)pdyear,字段分隔符為'\001'闽瓢,存儲成TEXTFILE格式号阿,數(shù)據(jù)文件的目錄為/path/your_table(從MySQL導(dǎo)入到HDFS的目錄)。

如果導(dǎo)入的數(shù)據(jù)鸳粉,配置了分區(qū),即如下目錄結(jié)構(gòu):

/path/your_table/pdyear=2015
/path/your_table/pdyear=2016

則建立表后园担,表里面沒有對應(yīng)上數(shù)據(jù)届谈,需要添加分區(qū)到hive表中,在hive中執(zhí)行以下語句:

alter table your_table add partition (pdyear='2015') location '/path/your_table/pdyear=2015';
alter table your_table add partition (pdyear='2016') location '/path/your_table/pdyear=2016';

完成上面的操作后弯汰,即可以在Hive中進行查詢和測試艰山,查看是否有數(shù)據(jù)。Hive的hql語法咏闪,源于mysql的語法曙搬,只是對部分細節(jié)支持不一樣,因此可能需要調(diào)試一下鸽嫂。


知識星球.jpeg

05 HDFS導(dǎo)出到MySQL

在Hive中進行了一系列的復(fù)雜統(tǒng)計分析后纵装,最后的結(jié)論可能還是需要存儲到Mysql中,那么可以在Hive語句中据某,將分析結(jié)果導(dǎo)出到HDFS中存儲起來橡娄,最后再使用Sqoop將HDFS的文件導(dǎo)入到MySQL表中,方便業(yè)務(wù)使用癣籽。

導(dǎo)出的配置示例:

export

--connect
jdbc:mysql://1.2.3.4/db_name
--username
your_username
--password
your_passwd
--table
your_table

--input-null-string
'\\N'

--update-mode
allowinsert
--update-key
id
--export-dir
/path/your_table/
--columns
id,name
--input-fields-terminated-by
'\001'

參數(shù)說明:

export:指令說明是導(dǎo)出
update-mode:allowinsert挽唉,配置了,使用更新模式筷狼,即如果Mysql中已經(jīng)有數(shù)據(jù)了瓶籽,則進行更新,如果沒有埂材,則插入塑顺。判斷的字段使用update-key參數(shù)配置,需要這個字段是唯一索引的字段楞遏。
input-null-string:Hive中茬暇,導(dǎo)出的NULL為字符\N,要還原到Mysql中寡喝,依然為MyQL的Null的話糙俗,需要使用這個配置,指定NULL的字符串為'\N'

另外预鬓,導(dǎo)出的時候巧骚,如果Mysql表中有自動增長的主鍵字段赊颠,可以留空,生成數(shù)據(jù)的時候會自動填充劈彪。

06 猴戲開始

將MySQL中的數(shù)據(jù)導(dǎo)入到HDFS中竣蹦,又將HDFS中的數(shù)據(jù)建立了到Hive表的映射。至此沧奴,通過Sqoop工具作為SQL與NoSQL的數(shù)據(jù)橋梁痘括,將傳統(tǒng)的數(shù)據(jù)也存入到NoSQL中來了,有了數(shù)據(jù)滔吠,便是開始纲菌。

本篇文章結(jié)束了,卻也正是猴年的開始疮绷,不要走開翰舌,猴戲才剛剛開始,精彩更在后面冬骚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椅贱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子只冻,更是在濱河造成了極大的恐慌庇麦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属愤,死亡現(xiàn)場離奇詭異女器,居然都是意外死亡,警方通過查閱死者的電腦和手機住诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門驾胆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱呐,你說我怎么就攤上這事丧诺。” “怎么了奄薇?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵驳阎,是天一觀的道長。 經(jīng)常有香客問我馁蒂,道長呵晚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任沫屡,我火速辦了婚禮饵隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沮脖。我一直安慰自己金矛,他們只是感情好芯急,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驶俊,像睡著了一般娶耍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饼酿,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天榕酒,我揣著相機與錄音,去河邊找鬼故俐。 笑死奈应,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的购披。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肩榕,長吁一口氣:“原來是場噩夢啊……” “哼刚陡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起株汉,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤筐乳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乔妈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙云,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年路召,在試婚紗的時候發(fā)現(xiàn)自己被綠了勃刨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡股淡,死狀恐怖身隐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唯灵,我是刑警寧澤贾铝,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站埠帕,受9級特大地震影響垢揩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敛瓷,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一叁巨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琐驴,春花似錦俘种、人聲如沸秤标。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍姜。三九已至,卻和暖如春悬包,著一層夾襖步出監(jiān)牢的瞬間衙猪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工布近, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垫释,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓撑瞧,卻偏偏與公主長得像棵譬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子预伺,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容