參數詳細資料 觀看這個博客
http://shiyanjun.cn/archives/624.html
Sqoop可以在HDFS/Hive和關系型數據庫之間進行數據的導入導出,其中主要使用了import和export這兩個工具。這兩個工具非常強大,提供了很多選項幫助我們完成數據的遷移和同步。比如,下面兩個潛在的需求:
- 業務數據存放在關系數據庫中,如果數據量達到一定規模后需要對其進行分析或同統計,單純使用關系數據庫可能會成為瓶頸,這時可以將數據從業務數據庫數據導入(import)到Hadoop平台進行離線分析。
- 對大規模的數據在Hadoop平台上進行分析以后,可能需要將結果同步到關系數據庫中作為業務的輔助數據,這時候需要將Hadoop平台分析后的數據導出(export)到關系數據庫。
這里,我們介紹Sqoop完成上述基本應用場景所使用的import和export工具,通過一些簡單的例子來說明這兩個工具是如何做到的。
import和export工具有些通用的選項,如下表所示:
選項 | 含義說明 |
--connect <jdbc-uri> |
指定JDBC連接字符串 |
--connection-manager <class-name> |
指定要使用的連接管理器類 |
--driver <class-name> |
指定要使用的JDBC驅動類 |
--hadoop-mapred-home <dir> |
指定$HADOOP_MAPRED_HOME路徑 |
--help |
打印用法幫助信息 |
--password-file |
設置用於存放認證的密碼信息文件的路徑 |
-P |
從控制台讀取輸入的密碼 |
--password <password> |
設置認證密碼 |
--username <username> |
設置認證用戶名 |
--verbose |
打印詳細的運行信息 |
--connection-param-file <filename> |
可選,指定存儲數據庫連接參數的屬性文件 |
數據導入工具import
import工具,是將HDFS平台外部的結構化存儲系統中的數據導入到Hadoop平台,便於后續分析。我們先看一下import工具的基本選項及其含義,如下表所示:
選項 | 含義說明 |
--append |
將數據追加到HDFS上一個已存在的數據集上 |
--as-avrodatafile |
將數據導入到Avro數據文件 |
--as-sequencefile |
將數據導入到SequenceFile |
--as-textfile |
將數據導入到普通文本文件(默認) |
--boundary-query <statement> |
邊界查詢,用於創建分片(InputSplit) |
--columns <col,col,col…> |
從表中導出指定的一組列的數據 |
--delete-target-dir |
如果指定目錄存在,則先刪除掉 |
--direct |
使用直接導入模式(優化導入速度) |
--direct-split-size <n> |
分割輸入stream的字節大小(在直接導入模式下) |
--fetch-size <n> |
從數據庫中批量讀取記錄數 |
--inline-lob-limit <n> |
設置內聯的LOB對象的大小 |
-m,--num-mappers <n> |
使用n個map任務並行導入數據 |
-e,--query <statement> |
導入的查詢語句 |
--split-by <column-name> |
指定按照哪個列去分割數據 |
--table <table-name> |
導入的源表表名 |
--target-dir <dir> |
導入HDFS的目標路徑 |
--warehouse-dir <dir> |
HDFS存放表的根路徑 |
--where <where clause> |
指定導出時所使用的查詢條件 |
-z,--compress |
啟用壓縮 |
--compression-codec <c> |
指定Hadoop的codec方式(默認gzip) |
--null-string <null-string> |
果指定列為字符串類型,使用指定字符串替換值為null的該類列的值 |
--null-non-string <null-string> |
如果指定列為非字符串類型,使用指定字符串替換值為null的該類列的值 |
bin/sqoop help 可以查看出幫助文檔 英文的 看不懂
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的目錄 默認會將數據存到系統當前登錄用戶下 以表名稱命名的文件夾下
ps : 復制的時候一定要注意下 \ 的位置 少個空格都會報錯。。。 默認會有4個MapReduce在執行 這里測試數據只有2條 so。。。
數據默認以逗號隔開 可以根據需求進行指定
導入數據至指定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