Sqoop的使用

最近在使用sqoop的時候遇到了一些坑,在此就sqoop做一些介紹並且記錄自己的爬坑過程,希望對看到的朋友有所幫助

1. sqoop的介紹

作用:
在Hadoop和RDBMS之間高效傳輸數據:
1.hadoop大數據存儲平臺:hdfs,hbase,hive
2.rdbms關係型數據庫 : mysql,oracle,postgresql,mssql
原理:
把用戶的指令解析編譯成MR任務,發佈到yarn上分佈式執行
MR任務把輸入和輸出分別對接RDBMS和Hadoop就能完成數據的轉移
版本
sqoop1
核心組件:TaskTranslator,解析編譯用戶指令,生成mr任務發佈到yarn
cli、api :和用戶交互,從用戶接受命令,把命令發送給TaskTranslator
優點:簡單、靈活、易用,不需要做什麼配置,指令即配置,指令可以馬上執行
缺點:支持shell和java等語言,對於其他語言無法支持
sqoop2
server端:
核心組件:TaskTranslator,解析編譯用戶指令,生成mr任務發佈到yarn
Connector連接存儲系統的中間組件
Metadata:
存儲用戶跟存儲系統的連接信息:link
存儲數據導入導出的指令信息:Job
RestServer:
對外接受客戶端的服務
接受客戶端的連接,接受客戶端的指令,把指令發送給TaskTranslator
UiServer:對外接受客戶端的服務
client端:
cli、api、webui
優點:
通用更強
會記錄元數據包括存儲系統連接信息和任務配置信息等
缺點:
步驟稍顯麻煩
對記錄的連接需要使用Connector來連接

2.sqoop的使用

主要介紹使用sqoop在hive和MySQL之間的數據傳輸

1.從MySQL中將數據傳入hive表中
MySQL表test_table2數據
MySQL表test_table2數據
需求1.將MySQL表test_table2中的數據全量導入Hive表 test_table表中
sqoop命令如下:

sqoop import \
"-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \   
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \  ##數據庫連接的驅動
--username ${USERNAME} \  ##數據庫用戶名
--password ${PASSWORD} \  ##數據庫密碼
--table test_table2  \   ##mysql中的表名
--fields-terminated-by '\001' \  ## 設置字段分割符
--lines-terminated-by '\n' \   ##設置行尾割符
--input-null-string '\\N' \    ##要爲字符串列的空值寫入的字符串
--input-null-non-string '\\N' \  ##要爲非字符串列的空值寫入的字符串
--split-by id \  ##切分字段
--hive-database dw_cre_member \  ##hive數據庫
--hive-table test_table \  ##hive表

hive表test_table插入數據後的結果:
導入數據後的hive表test_table需求2.將MySQL表test_table2中的數據覆蓋導入Hive表 test_table表中
sqoop命令如下:

sqoop import \
"-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \   
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB} \  ##數據庫連接的驅動
--username ${USERNAME} \  ##數據庫用戶名
--password ${PASSWORD} \  ##數據庫密碼
--table test_table2  \   ##mysql中的表名
--fields-terminated-by '\001' \  ## 設置字段分割符
--lines-terminated-by '\n' \   ##設置行尾割符
--input-null-string '\\N' \    ##要爲字符串列的空值寫入的字符串
--input-null-non-string '\\N' \  ##要爲非字符串列的空值寫入的字符串
--split-by id \  ##切分字段
--hive-import  \ ##向hive導入數據必須參數
--hive-overwrite \   ##覆蓋hive表中的數據
--hive-database dw_cre_member \  ##hive數據庫
--hive-table test_table \  ##hive表

hive的參數介紹

--hive-import 必須參數,指定導入hive
--hive-database default hive庫名
--hive-table people hive表名
--fields-terminated-by hive的分隔符
--hive-overwrite 重寫重複字段
--create-hive-table 幫創建好 hive 表,但是表存在會出錯。不建議使用這個參數,因爲到導入的時候,會與我們的字段類型有出入。
--hive-partition-key “dt” 指定分區表的字段
--hive-partition-value “2018-08-08” 指定分區表的值*

導出沒有主鍵的表

 可以使用兩種方式:
    --split-by 指定切分的字段
    --m 1 : 設置只使用一個map進行數據遷移

過濾條件導出

--where “age>18” 匹配條件
--columns “name,age” 選擇要導入的指定列
--query ‘select * from people where age>18 and $CONDITIONS’: sql語句查詢的結果集
    不能 --table 一起使用
    需要指定 --target-dir 路徑 

在數據庫中爲空時的處理


 --input-null-non-string ‘0’ 當不是字符串的數據爲空的時候,用 0 替換
 --input-null-string ‘string’ 當字符串爲空的時候,使用string 字符替換

增量導入

* check-column id 用來指定一些列
* 這些被指定的列的類型不能使任意字符類型,如char、varchar等類型都是不可以的,常用的是指定主鍵id.
* --check-column 可以去指定多個列
last-value 10 從哪個值開始增量

incremental 增量的模式
    append id 是獲取大於某一列的某個值。

    lastmodified “2016-12-15 15:47:30” 獲取某個時間後修改的所有數據
        –append 附加模式
        –merge-key id 合併模式

注意:增量導入不能與 –delete-target-dir 一起使用,還有必須指定增量的模式

2.hive中將數據傳輸到MySQL表中
Mysql中的表test_table3
在這裏插入圖片描述Hive中的表test_table
在這裏插入圖片描述需求1.將Hive表test_table中的數據導入到MySQL表test_table3中,採用更新導入的方式

sqoop命令如下:

sqoop export \
--connect jdbc:mysql://${HOSTNAME}:${PORT}/${ADDRESSDB}?characterEncoding=UTF-8 \  #數據庫連接
--username ${USERNAME} \   #數據庫用戶名
--password ${PASSWORD} \   #數據庫密碼
--table box_member_geo_new \  #需要導入的mysql表
--update-key skey \   #匹配鍵
--update-mode allowinsert \  #更新模式,如果有未匹配到的則插入表中
--columns "skey,address" \   #匹配更新的列名
--export-dir ${HDFSADDRESS} \  #hdfs地址
--input-fields-terminated-by '\001'  #指定換行符

後續再更新

詳見:官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章