轉載sqoop
Sqoop可以在HDFS/Hive和關係型數據庫之間進行數據的導入導出,其中主要使用了import和export這兩個工具。這兩個工具非常強大,提供了很多選項幫助我們完成數據的遷移和同步。比如,下面兩個潛在的需求:
業務數據存放在關係數據庫中,如果數據量達到一定規模後需要對其進行分析或同統計,單純使用關係數據庫可能會成爲瓶頸,這時可以將數據從業務數據庫數據導入(import)到Hadoop平臺進行離線分析。
對大規模的數據在Hadoop平臺上進行分析以後,可能需要將結果同步到關係數據庫中作爲業務的輔助數據,這時候需要將Hadoop平臺分析後的數據導出(export)到關係數據庫。
這裏,我們介紹Sqoop完成上述基本應用場景所使用的import和export工具,通過一些簡單的例子來說明這兩個工具是如何做到的。
import和export工具有些通用的選項,如下表所示:
選項 | 含義說明 |
---|---|
–connect | 指定JDBC連接字符串 |
–connection-manager | 指定要使用的連接管理器類 |
–driver | 指定要使用的JDBC驅動類 |
–hadoop-mapred-home |
指定$HADOOP_MAPRED_HOME路徑 |
–help | 打印用法幫助信息 |
–password-file | 設置用於存放認證的密碼信息文件的路 |
-P | 從控制檯讀取輸入的密碼 |
–password | 設置認證密碼 |
–username | 設置認證用戶名 |
–verbose | 打印詳細的運行信息 |
–connection-param-file | 可選,指定存儲數據庫連接參數的屬性文件 |
數據導入工具import
import工具,是將HDFS平臺外部的結構化存儲系統中的數據導入到Hadoop平臺,便於後續分析。我們先看一下import工具的基本選項及其含義,如下表所示:
選項 | 含義說明 |
---|---|
–append | 將數據追加到HDFS上一個已存在的數據集上 |
–as-avrodatafile | 將數據導入到Avro數據文件 |
–as-sequencefile | $1 |
–as-textfile | 將數據導入到普通文本文件(默認) |
–boundary-query | 邊界查詢,用於創建分片(InputSplit) |
–columns <col,col,col…> | 從表中導出指定的一組列的數據 |
–delete-target-dir | 如果指定目錄存在,則先刪除掉 |
–direct | 使用直接導入模式(優化導入速度) |
–direct-split-size | 分割輸入stream的字節大小(在直接導入模式下) |
–fetch-size | 從數據庫中批量讀取記錄數 |
–inline-lob-limit | 設置內聯的LOB對象的大小 |
-m,–num-mappers | 使用n個map任務並行導入數據 |
-e,–query | 導入的查詢語句 |
–split-by | 指定按照哪個列去分割數據 |
–table | 導入的源表表名 |
–target-dir |
導入HDFS的目標路徑 |
–warehouse-dir |
HDFS存放表的根路徑 |
–where | 指定導出時所使用的查詢條件 |
-z,–compress | 啓用壓縮 |
–compression-codec | 指定Hadoop的codec方式(默認gzip) |
–null-string | 果指定列爲字符串類型,使用指定字符串替換值爲null的該類列的值 |
–null-non-string | 如果指定列爲非字符串類型,使用指定字符串替換值爲null的該類列的值 |
1:sqoop查看mysql有多少個數據庫
bin/sqoop list-databases
–connect jdbc:mysql://172.16.71.27:3306
–username root
–password root
2:將mysql表中數據導入到hdfs中 imports
bin/sqoop import
–connect jdbc:mysql://172.16.71.27:3306/babasport
–username root
–password root
–table test_tb
ps:如果沒有指定hdfs的目錄 默認會將數據存到系統當前登錄用戶下 以表名稱命名的文件夾下
導入數據至指定hdfs目錄
bin/sqoop import
–connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test
–username root
–password 123456
–table my_user
–target-dir /user/beifeng/sqoop/imp_my_user
–num-mappers 1
ps: num-mappers 1 指定執行MapReduce的個數爲1
target-dir 指定hdfs的目錄
sqoop 底層的實現就是MapReduce,import來說,僅僅運行Map Task
數據存儲文件
- textfile
- orcfile
- parquet
將數據按照parquet文件格式導出到hdfs指定目錄
bin/sqoop import
–connect jdbc:mysql://172.16.71.27:3306/babasport
–username root
–password root
–table test_tb
–target-dir /user/xuyou/sqoop/imp_my_user_parquet
–fields-terminated-by ‘@’
–num-mappers 1
–as-parquetfile
ps fields-terminated-by ‘@’ 數據已@隔開
as-parquetfile 數據按照parquet文件格式存儲
columns id,name 這個屬性 可以只導入id已經name 這兩個列的值
- 在實際的項目中,要處理的數據,需要進行初步清洗和過濾
- 某些字段過濾
- 條件
- join
bin/sqoop import
–connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test
–username root
–password 123456
–query ‘select id, account from my_user where $CONDITIONS’
–target-dir /user/beifeng/sqoop/imp_my_user_query
–num-mappers 1
ps: query 這個屬性代替了 table 可以通過用sql 語句來導出數據
(where $CONDITIONS’ 是固定寫法 如果需要條件查詢可以 select id, account from my_user where $CONDITIONS’ and id > 1)
壓縮導入至hdfs的數據 可以指定格式
bin/sqoop import
–connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test
–username root
–password 123456
–table my_user
–target-dir /user/beifeng/sqoop/imp_my_sannpy
–delete-target-dir
–num-mappers 1
–compress
–compression-codec org.apache.hadoop.io.compress.SnappyCodec
–fields-terminated-by ‘\t’
ps:compress 這個屬性 是 開啓壓縮功能
compression-codec 這個屬性是 指定壓縮的壓縮碼 本次是SnappyCodec