1. 程式人生 > >sqoop的import與export及其指令碼使用

sqoop的import與export及其指令碼使用

Sqoop官方網址:http://sqoop.apache.org/

一、Sqoop的誕生

1、存在的問題

⑴RDBMS:資料大量儲存在RDBMS(Oracle、MySQL、DB2等)上,如果需要對資料進行分析,需要將這些資料遷移到HDFS上去。

2、Sqoop的產生和作用

⑴Sqoop:Sql-to-Hadoop

⑵將關係資料庫中的某張表資料抽取到Hadoop的HDFS檔案系統當中,底層執行還是MapReduce。

將HDFS上的檔案資料或者是Hive表中的資料匯出到關係型資料庫中的某張表中。

⑷Sqoop利用MapReduce批處理方式進行資料傳輸加快資料傳輸速度。

二、sqoop的版本

1、Sqoop1 & Sqoop2兩個不同版本,完全不相容;

2、Sqoop2比Sqoop1的改進

⑴引入Sqoop server,集中化管理Connector等;

⑵多種訪問方式:CLI,Web UI,REST API  ;

⑶引入基於角色的安全機制;

三、sqoop的架構


四、sqoop的使用

1、Sqoop使用要點



2、測試Sqoop

⑴連結MySQL資料庫,並list資料庫中的databases,測試Sqoop是否配置正確。

$bin/sqoop list-databases \
--connect jdbc:mysql://hostname:3306 \
--username root \
--password root

3、import

⑴預設情況下匯入資料到HDFS

$/bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable


⑵指定目錄和Mapper個數匯入HDFS

①建立目錄

${HADOOP_HOME}/bin/hdfs dfs -mkdir -p /user/sqoop/


②設定map個數為1,指定目錄為/user/sqoop/,如果目標目錄已經存在則先刪除
$ bin/sqoop import \
--connect jdbc:mysql://blue01.mydomain:3306/mydb \
--username root \
--password root \
--table my_user \
--target-dir /user/hive/warehouse/my_user \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--columns  id,passwd \
--where "id<=3"


⑶增量匯入HDFS ①增量匯入資料到HDFS檔案中,可以通過下面三個引數進行設定: --check-column --incremental --last-value
$bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable \
--num-mappers 1 \
--target-dir /user/sqoop/ \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 4      //表示從第5位開始匯入


⑷指定檔案格式匯入HDFS ①預設情況下,匯入資料到HDFS,檔案儲存格式為textfile,可以通過屬性進行指定,比如檔案儲存格式為parquet
$bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable \
--num-mappers 1 \
--target-dir /user/sqoop/ \
--fields-terminated-by "\t" \
--as-parquetfile


⑸指定壓縮格式匯入HDFS ①預設情況下,匯入的HDFS檔案是不壓縮的,可以通過屬性--compress 和 --compression-codec設定;
$bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable \
--num-mappers 1 \
--target-dir /user/sqoop/ \
--fields-terminated-by "\t" \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec


⑹把select查詢結果匯入HDFS ①把select查詢結果匯入HDFS,必須包含'$CONDITIONS'在where子句中;
$ bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--target-dir /user/hive/warehouse/mydb.db/mytable \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select id,account from my_user where id>=3 and $CONDITIONS'


⑺匯入資料到Hive中
$ bin/sqoop import \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable \
--num-mappers 1 \
--hive-import \
--hive-database mydb \
--hive-table mytable \
--fields-terminated-by "\t" \
--delete-target-dir \
--hive-overwrite 


⑻指令碼的使用(以資料匯入為例) ①匯入資料到HDFS
export
--connect
jdbc:mysql://hostname:3306/mydb
--username
root
--password
root
--table
mytable
--num-mappers
1
--export-dir
/user/hive/warehouse/mydb.db/mytable
--input-fields-terminated-by
"\t"


②執行指令碼
$ bin/sqoop  --options-file xxx.opt


4、export⑴從Hive或者HDFS匯出資料到MySQL
$ bin/sqoop export \
--connect jdbc:mysql://hostname:3306/mydb \
--username root \
--password root \
--table mytable \
--num-mappers 1 \
--export-dir /user/hive/warehouse/mydb.db/mytable \
--input-fields-terminated-by "\t"