使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到Hive和HBase

原文地址 http://www.cnblogs.com/wgp13x/p/5028220.html
基礎(chǔ)環(huán)境
sqoop:sqoop-1.4.5+cdh5.3.6+78,
hive:hive-0.13.1+cdh5.3.6+397,
hbase:hbase-0.98.6+cdh5.3.6+115
Sqool和Hive、HBase簡介
Sqoop
Sqoop是一個用來將Hadoop和關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)相互轉(zhuǎn)移的開源工具,可以將一個關(guān)系型數(shù)據(jù)庫(例如 : MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導(dǎo)進到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進到關(guān)系型數(shù)據(jù)庫中。
Hive
不想用程序語言開發(fā)MapReduce的朋友比如DB們,熟悉SQL的朋友可以使用Hive開離線的進行數(shù)據(jù)處理與分析工作。Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行。注意Hive現(xiàn)在適合在離線下進行數(shù)據(jù)的操作,就是說不適合在掛在真實的生產(chǎn)環(huán)境中進行實時的在線查詢或操作,因為一個字“慢”。
Hive起源于FaceBook,在Hadoop中扮演數(shù)據(jù)倉庫的角色。建立在Hadoop集群的最頂層,對存儲在Hadoop群上的數(shù)據(jù)提供類SQL的接口進行操作。你可以用 HiveQL進行select、join,等等操作。如果你有數(shù)據(jù)倉庫的需求并且你擅長寫SQL并且不想寫MapReduce jobs就可以用Hive代替。
Hive的內(nèi)置數(shù)據(jù)類型可以分為兩大類:
(1)、基礎(chǔ)數(shù)據(jù)類型;
(2)、復(fù)雜數(shù)據(jù)類型。
其中,基礎(chǔ)數(shù)據(jù)類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
下面的表格列出這些基礎(chǔ)類型所占的字節(jié)以及從什么版本開始支持這些類型。

類型

復(fù)雜類型包括ARRAY、MAP、STRUCT、UNION,這些復(fù)雜類型是由基礎(chǔ)類型組成的。
HBase
HBase作為面向列的數(shù)據(jù)庫運行在HDFS之上,HDFS缺乏隨即讀寫操作,HBase正是為此而出現(xiàn)。HBase以Google BigTable為藍本,以鍵值對的形式存儲。項目的目標(biāo)就是快速在主機內(nèi)數(shù)十億行數(shù)據(jù)中定位所需的數(shù)據(jù)并訪問它。
HBase是一個數(shù)據(jù)庫,一個NoSql的數(shù)據(jù)庫,像其他數(shù)據(jù)庫一樣提供隨即讀寫功能,Hadoop不能滿足實時需要,HBase正可以滿足。如果你需要實時訪問一些數(shù)據(jù),就把它存入HBase。
你可以用Hive作為靜態(tài)數(shù)據(jù)倉庫,HBase作為數(shù)據(jù)存儲,放那些進行一些會改變的數(shù)據(jù)。在Hive中,普通表是存儲在HDFS中,而你可以通過創(chuàng)建EXTERNAL TABLE外表來指定數(shù)據(jù)存儲位置,可以是系統(tǒng)目錄,也可以是ElasticSearch,還可以是HBase。
在使用Sqoop從Mysql導(dǎo)出數(shù)據(jù)入Hadoop時,就需要考慮是直接入Hive(此時是普通表),還是導(dǎo)入數(shù)據(jù)到HBase,Sqoop同時支持導(dǎo)入這兩種導(dǎo)入。
測試Sqoop
測試

以上Sqoop語句執(zhí)行過后,可以確認Sqoop運行正常,Sqoop連接MySQL正常。
使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到Hive
使用復(fù)雜SQL
SQL

注意:
由于使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到Hive需要指定target-dir,因此導(dǎo)入的是普通表而不能為外部表。
以下簡要列舉了Sqoop的執(zhí)行過程:
執(zhí)行

可以看出,–split-by設(shè)置后,job按設(shè)置值切分,切分個數(shù)為-m設(shè)置值(-m 5 不設(shè)置的話默認job切分數(shù)是4)。經(jīng)檢驗,此種較復(fù)雜的SQL語句,Sqoop支持得很好。
調(diào)整Hive數(shù)據(jù)類型
上面任務(wù)執(zhí)行成功后,經(jīng)過檢測,發(fā)現(xiàn)Hive表結(jié)構(gòu)中的數(shù)據(jù)類型與MySQL對應(yīng)列有如下關(guān)系:
關(guān)系

可以看出MySQL的decimal類型變成了Hive中的double類型。此時需要在導(dǎo)入時通過–map-column-hive 作出映射關(guān)系指定,如下所示:
指定

以上命令可以執(zhí)行成功,然而Hive列類型設(shè)置為DECIMAL時,從Mysql[decimal(12,2)]–>Hive[decimal]會導(dǎo)致導(dǎo)入后小數(shù)丟失。
注意:
對于cost=”DECIMAL(10,2)”這樣指定精確度的映射語句的執(zhí)行,在Sqoop1.4.5中執(zhí)行失敗。這是Sqoop1.4.5的一個BUG,詳情見:https://issues.apache.org/jira/browse/SQOOP-2103,它在1.4.7版本中修復(fù)。
不斷更新
將上面Sqoop語句執(zhí)行兩次,在執(zhí)行第二次時會出現(xiàn)錯誤:
錯誤

這表示HDFS中已經(jīng)存在相應(yīng)存儲,此時需要執(zhí)行Sqoop-Hive的增量導(dǎo)入語句。
注意:
由于Hive沒有rowkey,其hdfs存儲決定了Sqoop-Hive只能添加,update更新導(dǎo)入無法進行。
使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到HBase
使用復(fù)雜SQL
導(dǎo)入

上面SQL語句較簡單。經(jīng)檢驗,更復(fù)雜的SQL語句,Sqoop支持得很好,導(dǎo)入正常。
不斷更新
以上指定了HBase的Rowkey后,再次執(zhí)行從MySQL導(dǎo)入數(shù)據(jù)到HBase的Sqoop語句,基于相同的Rowkey值,HBase內(nèi)相應(yīng)的行會進行更新替換。
Hive使用HBase數(shù)據(jù)
數(shù)據(jù)

關(guān)于Hive使用存儲在HBase中的數(shù)據(jù),更多詳細信息可以查看《使用Hive或Impala執(zhí)行SQL語句,對存儲在HBase中的數(shù)據(jù)操作》一文。
關(guān)于Sqoop2
架構(gòu)上,Sqoop1使用MapOnly作業(yè)進行Hadoop(HDFS/HBase/Hive)同關(guān)系數(shù)據(jù)庫進行數(shù)據(jù)的導(dǎo)入導(dǎo)出,用戶使用命令行方式與之交互,數(shù)據(jù)傳輸和數(shù)據(jù)格式緊密耦合;易用性欠佳,Connector數(shù)據(jù)格式支持有限,安全性不好,對Connector的限制過死。Sqoop2則建立了集中化的服務(wù),負責(zé)管理完整的MapReduce作業(yè),提供多種用戶交互方式(CLI/WebUI/RESTAPI),具有權(quán)限管理機制,具有規(guī)范化的Connector,使得它更加易用,更加安全,更加專注。
綜上所述
使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到HBase要比導(dǎo)入到Hive方便,使用Hive對HBase數(shù)據(jù)操作時,也無decimal精度相關(guān)BUG,并且可以很好的支持更新。因此建議使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到HBase,而非直接Hive。
經(jīng)過測試,使用Sqoop從MySQL導(dǎo)入數(shù)據(jù)到HBase,100萬條需花費7~12分鐘。impala對于hbase的查詢效率也沒有對hdfs效率高。
總結(jié)
在大數(shù)據(jù)領(lǐng)域浸染的多了,才知道當(dāng)前社會上的公司對于大數(shù)據(jù)方向的技術(shù)都是什么樣的理解。有的公司數(shù)據(jù)量足夠大,但數(shù)據(jù)并無價值或者價值不夠大,我們稱之為LU(large but unavailable)類型公司;有的公司數(shù)據(jù)量不多,但都價值連城,我們稱之為SV(small but valuable)類型公司;有的公司數(shù)據(jù)量很大,數(shù)據(jù)也都很有價值,我們稱之為LV(large and valuable)類型公司。
LU公司市場上有很多,造成數(shù)據(jù)無價值的因素可能是有數(shù)據(jù)本身的原因,也有產(chǎn)品的原因,他們也經(jīng)常想要在當(dāng)前環(huán)境下試下大數(shù)據(jù)的水,這便要細心甄別。SV公司也有不少,對于他們而言,好的數(shù)據(jù)分析師比大數(shù)據(jù)平臺更重要,欲要試水大數(shù)據(jù),還是要對數(shù)據(jù)量有清晰的預(yù)估。LV公司是最需要搭建大數(shù)據(jù)平臺的,但又往往他們沒有技術(shù)與欲望去做這件事,這也比較可恨。
簡而言之,想做的不一定需要,不做的不一定不需要。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容