sqoop命令,mysql導入到hdfs、hbase、hive
1.測試MySQL連接
bin/sqoop list-databases --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ‘mysql‘ --password ‘111111‘
2.檢驗SQL語句
bin/sqoop eval --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ‘mysql‘ --password ‘111111‘ --query "SELECT * FROM TB_REGION WHERE REGION_ID = ‘00A1719A489D4F49906A8CA9661CCBE8‘"
3.導入hdfs
3.1 導入
bin/sqoop import --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ‘mysql‘ --password ‘111111‘ --table TB_REGION --target-dir /sqoop/mysql/trade_dev/tb_region -m 5 --columns "code,name,category,farthercode,visible,regionlevel,region_id" --direct
3.2驗證
hdfs dfs -cat /sqoop/mysql/trade_dev_tb_region/*01
4.導入hbase
4.1新建hbase表
hbase shell
create ‘mysql_trade_dev‘, ‘region‘
4.2導入mysql數據到hbase
bin/sqoop import --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ‘mysql‘ --password ‘111111‘ --table TB_REGION --hbase-table mysql_trade_dev --hbase-row-key REGION_ID --column-family region
4.3驗證
scan ‘mysql_trade_dev‘
count ‘mysql_trade_dev‘
5.導入hive
bin/sqoop import --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ‘mysql‘ --password ‘111111‘ --table TB_REGION --hive-import --create-hive-table --target-dir /user/hive/warehouse/tb_region --hive-table tb_region
6.增量hive
6.1 初始化導入hdfs
bin/sqoop job import --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username mysql --password 111111 --table TB_DICTIONARY -m 1 --target-dir /sqoop/mysql/trade_dev/tb_dic --incremental append --check-column DIC_ID
返回數據:
16/09/07 10:27:06 INFO tool.ImportTool: --incremental append
16/09/07 10:27:06 INFO tool.ImportTool: --check-column DIC_ID
16/09/07 10:27:06 INFO tool.ImportTool: --last-value 287
16/09/07 10:27:06 INFO tool.ImportTool: (Consider saving this with ‘sqoop job --create‘)
6.2 創建hive外部表
CREATE EXTERNAL TABLE tb_dic (DIC_ID int, DOMAIN_ID STRING, DIC_TYPE_ID int, DESCRIPTION STRING, CODE int, NAME STRING, MNEMONIC STRING, ATTRIBUTE STRING, MARK_FOR_DEFAULT int, MARK_FOR_DELETE int, OPT_COUNTER int, CREATE_DATE STRING, CREATE_BY STRING, LAST_MODIFIED_DATE STRING, LAST_MODIFIED_BY STRING, ATTRIBUTE1 int, ATTRIBUTE2 int, ATTRIBUTE3 STRING, ATTRIBUTE4 STRING, ATTRIBUTE5 STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,‘ STORED AS TEXTFILE location ‘/sqoop/mysql/trade_dev/tb_dic‘;
mysql建表語句
DROP TABLE IF EXISTS `TB_DICTIONARY`;
CREATE TABLE `TB_DICTIONARY` (
`DIC_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘字典ID‘,
`DOMAIN_ID` varchar(45) NOT NULL DEFAULT ‘domain1‘ COMMENT ‘服務域區分的ID‘,
`DIC_TYPE_ID` int(11) NOT NULL COMMENT ‘字典類型ID-外鍵-TB_DICTIONARY_TYPE‘,
`DESCRIPTION` varchar(1024) NOT NULL COMMENT ‘轉義碼解釋‘,
`CODE` tinyint(2) NOT NULL COMMENT ‘轉義碼‘,
`NAME` varchar(45) NOT NULL COMMENT ‘轉義碼對應含義‘,
`MNEMONIC` varchar(45) DEFAULT NULL COMMENT ‘助記碼‘,
`ATTRIBUTE` varchar(45) DEFAULT NULL COMMENT ‘當前字典屬性:如計量單位的量綱類型‘,
`MARK_FOR_DEFAULT` tinyint(2) NOT NULL DEFAULT ‘0‘ COMMENT ‘默認標記(1為默認,0為非默認)‘,
`MARK_FOR_DELETE` tinyint(2) NOT NULL DEFAULT ‘1‘ COMMENT ‘是否有效,1:有效;0:無效‘,
`OPT_COUNTER` int(5) DEFAULT NULL COMMENT ‘版本管理標誌‘,
`CREATE_DATE` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘創建日期‘,
`CREATE_BY` varchar(45) NOT NULL DEFAULT ‘admin‘ COMMENT ‘創建人ID‘,
`LAST_MODIFIED_DATE` datetime DEFAULT NULL COMMENT ‘修改日期‘,
`LAST_MODIFIED_BY` varchar(45) DEFAULT NULL COMMENT ‘修改人ID‘,
`ATTRIBUTE1` int(11) DEFAULT NULL,
`ATTRIBUTE2` int(11) DEFAULT NULL,
`ATTRIBUTE3` varchar(45) DEFAULT NULL,
`ATTRIBUTE4` varchar(45) DEFAULT NULL,
`ATTRIBUTE5` date DEFAULT NULL,
PRIMARY KEY (`DIC_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=290 DEFAULT CHARSET=utf8 COMMENT=‘字典表-李思宇‘;
SET FOREIGN_KEY_CHECKS = 1;
6.3 更新增量數據
bin/sqoop job --create incjob -- import --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username mysql --password 111111 --table TB_DICTIONARY -m 1 --target-dir /sqoop/mysql/trade_dev/tb_dic --incremental append --check-column DIC_ID --last-value 287
bin/sqoop job --exec incjob
6.4 驗證
select count(*) from tb_dic;
返回數據:
第一次
Time taken: 0.068 seconds, Fetched: 489 row(s)
第二次
Time taken: 0.068 seconds, Fetched: 490 row(s)
7.整庫導入測試
7.1新建hbase表
hbase shell
create ‘new_table‘,‘data‘
7.2導入mysql數據到hbase
bin/sqoop import-all-tables --connect jdbc:mysql://192.168.1.187:3306/new_schema --username mysql --password 111111 --hbase-create-table --hbase-table new_table --column-family data --hbase-bulkload
註意
整庫導入要求每個表都有主鍵,不然會報錯
16/09/08 15:03:50 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-xdata/compile/070fa1eda1e77fc70eaa0c532cfa94b8/nopk.jar
16/09/08 15:03:50 ERROR tool.ImportAllTablesTool: Error during import: No primary key could be found for table nopk. Please specify one with --split-by or perform a sequential import with ‘-m 1‘.
或者每個表同一個可以做rowkey的字段(如id),增加--hbase-row-key id
7.3驗證
scan ‘new_table‘
count ‘new_table‘
Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。
用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲。
具有可靠、高效、可伸縮的特點。
Hadoop的核心是YARN,HDFS和Mapreduce
下圖是hadoop生態系統,集成spark生態圈。在未來一段時間內,hadoop將於spark共存,hadoop與spark
都能部署在yarn、mesos的資源管理系統之上
下面將分別對以上各組件進行簡要介紹,具體介紹參見後續系列博文。
2、HDFS(Hadoop分布式文件系統)
源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版。
HDFS是Hadoop體系中數據存儲管理的基礎。它是一個高度容錯的系統,能檢測和應對硬件故障,用於在低成本的通用硬件上運行。
HDFS簡化了文件的一致性模型,通過流式數據訪問,提供高吞吐量應用程序數據訪問功能,適合帶有大型數據集的應用程序。
它提供了一次寫入多次讀取的機制,數據以塊的形式,同時分布在集群不同物理機器上。
3、Mapreduce(分布式計算框架)
源自於google的MapReduce論文,發表於2004年12月,Hadoop MapReduce是google MapReduce 克隆版。
MapReduce是一種分布式計算模型,用以進行大數據量的計算。它屏蔽了分布式計算框架細節,將計算抽象成map和reduce兩部分,
其中Map對數據集上的獨立元素進行指定的操作,生成鍵-值對形式中間結果。Reduce則對中間結果中相同“鍵”的所有“值”進行規約,以得到最終結果。
MapReduce非常適合在大量計算機組成的分布式並行環境裏進行數據處理。
4. HBASE(分布式列存數據庫)
源自Google的Bigtable論文,發表於2006年11月,HBase是Google Bigtable克隆版
HBase是一個建立在HDFS之上,面向列的針對結構化數據的可伸縮、高可靠、高性能、分布式和面向列的動態模式數據庫。
HBase采用了BigTable的數據模型:增強的稀疏排序映射表(Key/Value),其中,鍵由行關鍵字、列關鍵字和時間戳構成。
HBase提供了對大規模數據的隨機、實時讀寫訪問,同時,HBase中保存的數據可以使用MapReduce來處理,它將數據存儲和並行計算完美地結合在一起。
5. Zookeeper(分布式協作服務)
源自Google的Chubby論文,發表於2006年11月,Zookeeper是Chubby克隆版
解決分布式環境下的數據管理問題:統一命名,狀態同步,集群管理,配置同步等。
Hadoop的許多組件依賴於Zookeeper,它運行在計算機集群上面,用於管理Hadoop操作。
6. HIVE(數據倉庫)
由facebook開源,最初用於解決海量結構化的日誌數據統計問題。
Hive定義了一種類似SQL的查詢語言(HQL),將SQL轉化為MapReduce任務在Hadoop上執行。通常用於離線分析。
HQL用於運行存儲在Hadoop上的查詢語句,Hive讓不熟悉MapReduce開發人員也能編寫數據查詢語句,然後這些語句被翻譯為Hadoop上面的MapReduce任務。
7.Pig(ad-hoc腳本)
由yahoo!開源,設計動機是提供一種基於MapReduce的ad-hoc(計算在query時發生)數據分析工具
Pig定義了一種數據流語言—Pig Latin,它是MapReduce編程的復雜性的抽象,Pig平臺包括運行環境和用於分析Hadoop數據集的腳本語言(Pig Latin)。
其編譯器將Pig Latin翻譯成MapReduce程序序列將腳本轉換為MapReduce任務在Hadoop上執行。通常用於進行離線分析。
8.Sqoop(數據ETL/同步工具)
Sqoop是SQL-to-Hadoop的縮寫,主要用於傳統數據庫和Hadoop之前傳輸數據。數據的導入和導出本質上是Mapreduce程序,充分利用了MR的並行化和容錯性。
Sqoop利用數據庫技術描述數據架構,用於在關系數據庫、數據倉庫和Hadoop之間轉移數據。
9.Flume(日誌收集工具)
Cloudera開源的日誌收集系統,具有分布式、高可靠、高容錯、易於定制和擴展的特點。
它將數據從產生、傳輸、處理並最終寫入目標的路徑的過程抽象為數據流,在具體的數據流中,數據源支持在Flume中定制數據發送方,從而支持收集各種不同協議數據。
同時,Flume數據流提供對日誌數據進行簡單處理的能力,如過濾、格式轉換等。此外,Flume還具有能夠將日誌寫往各種數據目標(可定制)的能力。
總的來說,Flume是一個可擴展、適合復雜環境的海量日誌收集系統。當然也可以用於收集其他類型數據
10.Mahout(數據挖掘算法庫)
Mahout起源於2008年,最初是Apache Lucent的子項目,它在極短的時間內取得了長足的發展,現在是Apache的頂級項目。
Mahout的主要目標是創建一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。
Mahout現在已經包含了聚類、分類、推薦引擎(協同過濾)和頻繁集挖掘等廣泛使用的數據挖掘方法。
除了算法,Mahout還包含數據的輸入/輸出工具、與其他存儲系統(如數據庫、MongoDB 或Cassandra)集成等數據挖掘支持架構。
11. Oozie(工作流調度器)
Oozie是一個可擴展的工作體系,集成於Hadoop的堆棧,用於協調多個MapReduce作業的執行。它能夠管理一個復雜的系統,基於外部事件來執行,外部事件包括數據的定時和數據的出現。
Oozie工作流是放置在控制依賴DAG(有向無環圖 Direct Acyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。
Oozie使用hPDL(一種XML流程定義語言)來描述這個圖。
12. Yarn(分布式資源管理器)
YARN是下一代MapReduce,即MRv2,是在第一代MapReduce基礎上演變而來的,主要是為了解決原始Hadoop擴展性較差,不支持多計算框架而提出的。
Yarn是下一代 Hadoop 計算平臺,yarn是一個通用的運行時框架,用戶可以編寫自己的計算框架,在該運行環境中運行。
用於自己編寫的框架作為客戶端的一個lib,在運用提交作業時打包即可。該框架為提供了以下幾個組件:
- 資源管理:包括應用程序管理和機器資源管理
- 資源雙層調度
- 容錯性:各個組件均有考慮容錯性
- 擴展性:可擴展到上萬個節點
13. Mesos(分布式資源管理器)
Mesos誕生於UC Berkeley的一個研究項目,現已成為Apache項目,當前有一些公司使用Mesos管理集群資源,比如Twitter。
與yarn類似,Mesos是一個資源統一管理和調度的平臺,同樣支持比如MR、steaming等多種運算框架。
14. Tachyon(分布式內存文件系統)
Tachyon(/‘t?ki:??n/ 意為超光速粒子)是以內存為中心的分布式文件系統,擁有高性能和容錯能力,
能夠為集群框架(如Spark、MapReduce)提供可靠的內存級速度的文件共享服務。
Tachyon誕生於UC Berkeley的AMPLab。
15. Tez(DAG計算模型)
Tez是Apache最新開源的支持DAG作業的計算框架,它直接源於MapReduce框架,核心思想是將Map和Reduce兩個操作進一步拆分,
即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,
這樣,這些分解後的元操作可以任意靈活組合,產生新的操作,這些操作經過一些控制程序組裝後,可形成一個大的DAG作業。
目前hive支持mr、tez計算模型,tez能完美二進制mr程序,提升運算性能。
16. Spark(內存DAG計算模型)
Spark是一個Apache項目,它被標榜為“快如閃電的集群計算”。它擁有一個繁榮的開源社區,並且是目前最活躍的Apache項目。
最早Spark是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的並行計算框架。
Spark提供了一個更快、更通用的數據處理平臺。和Hadoop相比,Spark可以讓你的程序在內存中運行時速度提升100倍,或者在磁盤上運行時速度提升10倍
17. Giraph(圖計算模型)
Apache Giraph是一個可伸縮的分布式叠代圖處理系統, 基於Hadoop平臺,靈感來自 BSP (bulk synchronous parallel) 和 Google 的 Pregel。
最早出自雅虎。雅虎在開發Giraph時采用了Google工程師2010年發表的論文《Pregel:大規模圖表處理系統》中的原理。後來,雅虎將Giraph捐贈給Apache軟件基金會。
目前所有人都可以下載Giraph,它已經成為Apache軟件基金會的開源項目,並得到Facebook的支持,獲得多方面的改進。
18. GraphX(圖計算模型)
Spark GraphX最先是伯克利AMPLAB的一個分布式圖計算框架項目,目前整合在spark運行框架中,為其提供BSP大規模並行圖計算能力。
19. MLib(機器學習庫)
Spark MLlib是一個機器學習庫,它提供了各種各樣的算法,這些算法用來在集群上針對分類、回歸、聚類、協同過濾等。
20. Streaming(流計算模型)
Spark Streaming支持對流數據的實時處理,以微批的方式對實時數據進行計算
21. Kafka(分布式消息隊列)
Kafka是Linkedin於2010年12月份開源的消息系統,它主要用於處理活躍的流式數據。
活躍的流式數據在web網站應用中非常常見,這些數據包括網站的pv、用戶訪問了什麽內容,搜索了什麽內容等。
這些數據通常以日誌的形式記錄下來,然後每隔一段時間進行一次統計處理。
22. Phoenix(hbase sql接口)
Apache Phoenix 是HBase的SQL驅動,Phoenix 使得Hbase 支持通過JDBC的方式進行訪問,並將你的SQL查詢轉換成Hbase的掃描和相應的動作。
23. ranger(安全管理工具)
Apache ranger是一個hadoop集群權限框架,提供操作、監控、管理復雜的數據權限,它提供一個集中的管理機制,管理基於yarn的hadoop生態圈的所有數據權限。
24. knox(hadoop安全網關)
Apache knox是一個訪問hadoop集群的restapi網關,它為所有rest訪問提供了一個簡單的訪問接口點,能完成3A認證(Authentication,Authorization,Auditing)和SSO(單點登錄)等
25. falcon(數據生命周期管理工具)
Apache Falcon 是一個面向Hadoop的、新的數據處理和管理平臺,設計用於數據移動、數據管道協調、生命周期管理和數據發現。它使終端用戶可以快速地將他們的數據及其相關的處理和管理任務“上載(onboard)”到Hadoop集群。
26.Ambari(安裝部署配置管理工具)
Apache Ambari 的作用來說,就是創建、管理、監視 Hadoop 的集群,是為了讓 Hadoop 以及相關的大數據軟件更容易使用的一個web工具。
Hive起源於FaceBook,在Hadoop中扮演數據倉庫的角色。建立在Hadoop集群的最頂層,對存儲在Hadoop群上的數據提供類SQL的接口進行操作。你可以用 HiveQL進行select、join,等等操作。如果你有數據倉庫的需求並且你擅長寫SQL並且不想寫MapReduce jobs就可以用Hive代替。
Hive的內置數據類型可以分為兩大類:
(1)、基礎數據類型;
(2)、復雜數據類型。
其中,基礎數據類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
下面的表格列出這些基礎類型所占的字節以及從什麽版本開始支持這些類型。
復雜類型包括ARRAY、MAP、STRUCT、UNION,這些復雜類型是由基礎類型組成的。
HBase
HBase作為面向列的數據庫運行在HDFS之上,HDFS缺乏隨即讀寫操作,HBase正是為此而出現。HBase以Google BigTable為藍本,以鍵值對的形式存儲。項目的目標就是快速在主機內數十億行數據中定位所需的數據並訪問它。
HBase是一個數據庫,一個NoSql的數據庫,像其他數據庫一樣提供隨即讀寫功能,Hadoop不能滿足實時需要,HBase正可以滿足。如果你需要實時訪問一些數據,就把它存入HBase。
你可以用Hive作為靜態數據倉庫,HBase作為數據存儲,放那些進行一些會改變的數據。在Hive中,普通表是存儲在HDFS中,而你可以通過創建EXTERNAL TABLE外表來指定數據存儲位置,可以是系統目錄,也可以是ElasticSearch,還可以是HBase。
在使用Sqoop從Mysql導出數據入Hadoop時,就需要考慮是直接入Hive(此時是普通表),還是導入數據到HBase,Sqoop同時支持導入這兩種導入。
測試Sqoop
測試
以上Sqoop語句執行過後,可以確認Sqoop運行正常,Sqoop連接MySQL正常。
使用Sqoop從MySQL導入數據到Hive
使用復雜SQL
SQL
註意:
由於使用Sqoop從MySQL導入數據到Hive需要指定target-dir,因此導入的是普通表而不能為外部表。
以下簡要列舉了Sqoop的執行過程:
執行
可以看出,–split-by設置後,job按設置值切分,切分個數為-m設置值(-m 5 不設置的話默認job切分數是4)。經檢驗,此種較復雜的SQL語句,Sqoop支持得很好。
調整Hive數據類型
上面任務執行成功後,經過檢測,發現Hive表結構中的數據類型與MySQL對應列有如下關系:
關系
可以看出MySQL的decimal類型變成了Hive中的double類型。此時需要在導入時通過–map-column-hive 作出映射關系指定,如下所示:
指定
以上命令可以執行成功,然而Hive列類型設置為DECIMAL時,從Mysql[decimal(12,2)]–>Hive[decimal]會導致導入後小數丟失。
註意:
對於cost=”DECIMAL(10,2)”這樣指定精確度的映射語句的執行,在Sqoop1.4.5中執行失敗。這是Sqoop1.4.5的一個BUG,詳情見:https://issues.apache.org/jira/browse/SQOOP-2103,它在1.4.7版本中修復。
不斷更新
將上面Sqoop語句執行兩次,在執行第二次時會出現錯誤:
錯誤
這表示HDFS中已經存在相應存儲,此時需要執行Sqoop-Hive的增量導入語句。
註意:
由於Hive沒有rowkey,其hdfs存儲決定了Sqoop-Hive只能添加,update更新導入無法進行。
使用Sqoop從MySQL導入數據到HBase
使用復雜SQL
導入
上面SQL語句較簡單。經檢驗,更復雜的SQL語句,Sqoop支持得很好,導入正常。
不斷更新
以上指定了HBase的Rowkey後,再次執行從MySQL導入數據到HBase的Sqoop語句,基於相同的Rowkey值,HBase內相應的行會進行更新替換。
Hive使用HBase數據
數據
關於Hive使用存儲在HBase中的數據,更多詳細信息可以查看《使用Hive或Impala執行SQL語句,對存儲在HBase中的數據操作》一文。
關於Sqoop2
架構上,Sqoop1使用MapOnly作業進行Hadoop(HDFS/HBase/Hive)同關系數據庫進行數據的導入導出,用戶使用命令行方式與之交互,數據傳輸和數據格式緊密耦合;易用性欠佳,Connector數據格式支持有限,安全性不好,對Connector的限制過死。Sqoop2則建立了集中化的服務,負責管理完整的MapReduce作業,提供多種用戶交互方式(CLI/WebUI/RESTAPI),具有權限管理機制,具有規範化的Connector,使得它更加易用,更加安全,更加專註。
綜上所述
使用Sqoop從MySQL導入數據到HBase要比導入到Hive方便,使用Hive對HBase數據操作時,也無decimal精度相關BUG,並且可以很好的支持更新。因此建議使用Sqoop從MySQL導入數據到HBase,而非直接Hive。
經過測試,使用Sqoop從MySQL導入數據到HBase,100萬條需花費7~12分鐘。impala對於hbase的查詢效率也沒有對hdfs效率高。
作者:我是Mr小趙先生
鏈接:https://www.jianshu.com/p/fcfdc1ec9501
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
sqoop命令,mysql導入到hdfs、hbase、hive