hive sqoop 分区导入_Sqoop概述及shell操作
特別說明:該專欄文章均來源自微信公眾號《大數據實戰演練》,歡迎關注!
一、Sqoop概述
1. 產生背景
基于傳統關系型數據庫的穩定性,還是有很多企業將數據存儲在關系型數據庫中;早期由于工具的缺乏,Hadoop與傳統數據庫之間的數據傳輸非常困難。基于前兩個方面的考慮,需要一個在傳統關系型數據庫和Hadoop之間進行數據傳輸的項目,Sqoop應運而生。
2. 簡介
Sqoop是一個用于Hadoop和結構化數據存儲(如關系型數據庫)之間進行高效傳輸大批量數據的工具。它包括以下兩個方面:
- 可以使用Sqoop將數據從關系型數據庫管理系統(如MySQL)導入到Hadoop系統(如HDFS、Hive、HBase)中
- 將數據從Hadoop系統中抽取并導出到關系型數據庫(如MySQL)
Sqoop的核心設計思想是利用MapReduce加快數據傳輸速度。也就是說Sqoop的導入和導出功能是通過基于Map Task(只有map)的MapReduce作業實現的。所以它是一種批處理方式進行數據傳輸,難以實現實時的數據進行導入和導出。
二、Sqoop架構
- 用戶向Sqoop發起一個命令之后,這個命令會轉換為一個基于Map Task的MapReduce作業。
- Map Task 會訪問數據庫的元數據信息,通過并行的Map Task將數據庫的數據讀取出來,然后導入Hadoop中。
- 當然也可以將Hadoop中的數據,導入傳統的關系型數據庫中。
- 它的核心思想就是通過基于Map Task(只有map)的MapReduce作業,實現數據的并發拷貝和傳輸,這樣可以大大提高效率。
三、Sqoop shell操作
參數描述—connect 指定JDBC連接字符串—username指定連接mysql用戶名—password指定連接mysql密碼
1. 將Mysql數據導入到Hadoop中
1.1 數據導入到HDFS
參數描述table
將mysql數據庫中的hive數據庫中的roles表數據導入到HDFS中的/user/lyz/111目錄下。執行代碼如下:
sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --table roles --target-dir /user/lyz/111 --fields-terminated-by ',' -m 1 --direct備注:-m參數可以指定map任務的個數,默認是4個。如果指定為1個map任務的話,最終生成的part-m-xxxxx文件個數就為1。在數據充足的情況下,生成的文件個數與指定map任務的個數是等值的。
1.2 數據導入到Hive中
參數描述—hive-import將表導入Hive中—hive-table
將mysql數據庫中的hive數據庫中的roles表數據導入到Hive數據庫中,并生成roles_test表。執行代碼如下:
sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --hive-import --table roles --hive-database default --hive-table roles_test --fields-terminated-by ',' -m 1 --direct備注:-m參數可以指定map任務的個數,默認是4個。如果指定為1個map任務的話,最終生成在/apps/hive/warehouse/ roles_test目錄下的part-m-xxxxx文件個數就為1。在數據充足的情況下,生成的文件個數與指定map任務的個數是等值的。
執行數據導入過程中,會觸發MapReduce任務。任務執行成功以后,我們訪問Hive驗證一下數據是否導入成功。
hive> show tables;OKroles_testhive> select * from roles_test;OK1 1545355484 admin admin2 1545355484 public publicTime taken: 0.536 seconds, Fetched: 2 row(s)數據導入成功。
1.3 數據導入到HBase中
參數描述—column-family 設置導入的目標列族—hbase-row-key 指定要用作行鍵的輸入列;如果沒有該參數,默認為mysql表的主鍵—hbase-create-table如果執行,則創建缺少的HBase表—hbase-bulkload啟用批量加載
將mysql數據庫中的hive數據庫中的roles表數據導入到HBase中,并生成roles_test表。執行代碼如下:
sqoop import --connect jdbc:mysql://10.6.6.71:3309/hive --username root --password root123 --table roles --hbase-table roles_test --column-family info --hbase-row-key ROLE_ID --hbase-create-table --hbase-bulkload關于參數—hbase-bulkload的解釋:
實現將數據批量的導入Hbase數據庫中,BulkLoad特性能夠利用MR計算框架將源數據直接生成內部的HFile格式,直接將數據快速的load到HBase中。
細心的你可能會發現,使用—hbase-bulkload參數會觸發MapReduce的reduce任務。
執行數據導入過程中,會觸發MapReduce任務。任務執行成功以后,我們訪問HBase驗證一下數據是否導入成功。
hbase(main):002:0> listTABLE roles_test 1 row(s) in 0.1030 seconds=> ["roles_test"]hbase(main):003:0> scan "roles_test"ROW COLUMN+CELL 1 column=info:CREATE_TIME, timestamp=1548319280991, value=1545355484 1 column=info:OWNER_NAME, timestamp=1548319280991, value=admin 1 column=info:ROLE_NAME, timestamp=1548319280991, value=admin 2 column=info:CREATE_TIME, timestamp=1548319282888, value=1545355484 2 column=info:OWNER_NAME, timestamp=1548319282888, value=public 2 column=info:ROLE_NAME, timestamp=1548319282888, value=public 2 row(s) in 0.0670 seconds總結:roles_test表的row_key是源表的主鍵ROLE_ID值,其余列均放入了info這個列族中。
2. 將Hadoop數據導出到Mysql中
Sqoop export工具將一組文件從HDFS導出回Mysql。目標表必須已存在于數據庫中。根據用戶指定的分隔符讀取輸入文件并將其解析為一組記錄。
默認操作是將這些轉換為一組INSERT將記錄注入數據庫的語句。在“更新模式”中,Sqoop將生成UPDATE替換數據庫中現有記錄的語句,并且在“調用模式”下,Sqoop將為每條記錄進行存儲過程調用。
將HDFS、Hive、HBase的數據導出到Mysql表中,都會用到下表的參數:
參數描述—table
2.1 HDFS數據導出至Mysql
首先在test數據庫中創建roles_hdfs數據表:
USE test;CREATE TABLE `roles_hdfs` (`ROLE_ID` bigint(20) NOT NULL ,`CREATE_TIME` int(11) NOT NULL ,`OWNER_NAME` varchar(128) DEFAULT NULL ,`ROLE_NAME` varchar(128) DEFAULT NULL ,PRIMARY KEY (`ROLE_ID`))將HDFS上的數據導出到mysql的test數據庫的roles_hdfs表中,執行代碼如下:
sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hdfs --export-dir /user/lyz/111 --input-fields-terminated-by ',' -m 1執行數據導入過程中,會觸發MapReduce任務。任務成功之后,前往mysql數據庫查看是否導入成功。
2.2 Hive數據導出至Mysql
首先在test數據庫中創建roles_hive數據表:
CREATE TABLE `roles_hive` (`ROLE_ID` bigint(20) NOT NULL ,`CREATE_TIME` int(11) NOT NULL ,`OWNER_NAME` varchar(128) DEFAULT NULL ,`ROLE_NAME` varchar(128) DEFAULT NULL ,PRIMARY KEY (`ROLE_ID`))由于Hive數據存儲在HDFS上,所以從根本上還是將hdfs上的文件導出到mysql的test數據庫的roles_hive表中,執行代碼如下:
sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hive --export-dir /apps/hive/warehouse/roles_test --input-fields-terminated-by ',' -m 12.3 HBase數據導出至Mysql
目前Sqoop不支持從HBase直接導出到關系型數據庫。可以使用Hive周轉一下。
2.3.1 創建hive外部表
create external table hive_hbase(id int,CREATE_TIME string,OWNER_NAME string,ROLE_NAME string)stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'with serdeproperties ("hbase.columns.mapping" = ":key,info:CREATE_TIME,info:OWNER_NAME,info:ROLE_NAME")tblproperties("hbase.table.name" = "roles_test");2.3.2 創建Hive內部表
創建適配于Hive外部表的內部表:
create table if not exists hive_export(id int, CREATE_TIME string, OWNER_NAME string, ROLE_NAME string)row format delimited fields terminated by ',' stored as textfile;hive_hbase外部表的源是HBase表數據,當創建適配于hive_hbase外部表的Hive內部表時,指定行的格式為',’
2.3.3 將外部表的數據導入到內部表中
insert overwrite table hive_exportselect * from hive_hbase;2.3.4 創建Mysql表
CREATE TABLE `roles_hbase` (`id` bigint(20) NOT NULL,` create_time` varchar(128) NOT NULL ,` owner_name` varchar(128) DEFAULT NULL ,` role_name` varchar(128) DEFAULT NULL ,PRIMARY KEY (`id`))2.3.5 執行sqoop export
sqoop export --connect jdbc:mysql://10.6.6.71:3309/test --username root --password root123 --table roles_hbase --export-dir /apps/hive/warehouse/hive_export/ --input-fields-terminated-by ',' -m 1查看mysql中的roles_hbase表,數據成功被導入。
備注:在創建表的時候,一定要注意表字段的類型,如果指定表類型不一致,有可能會報錯。
3. 總結
使用sqoop import/export命令,可以實現將關系型數據庫中的數據與Hadoop中的數據進行相互轉化,其中一些轉化的細節,可以指定參數實現。在執行過程中,sqoop shell操作,會轉化為MapReduce任務來實現數據的抽取。
更多的sqoop操作,詳情請參見:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html
--END--
碼字不易,如果您覺得文章寫得不錯,請關注作者~ 您的關注是我寫作的最大動力
友情提示:原文排版精美,可點擊分享鏈接查看。
總結
以上是生活随笔為你收集整理的hive sqoop 分区导入_Sqoop概述及shell操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点菜宝多少钱一个
- 下一篇: 蒙那丽沙是谁画的啊?