2018-09-11期 Sqoop將關係型數據導入到HDFS文件系統【高級使用】

1、指定導入到HDFS文件系統中數據分隔符,默認使用逗號進行分隔

示例以製表符"\t"進行分隔

[root@hadoop-server01 lib]#  sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --fields-terminated-by '\t'

[root@hadoop-server01 lihadoop fs -ls /user/root/actor

Found 5 items

-rw-r--r--   1 root supergroup          0 2018-07-09 06:20 /user/root/actor/_SUCCESS

-rw-r--r--   1 root supergroup       1911 2018-07-09 06:20 /user/root/actor/part-m-00000

-rw-r--r--   1 root supergroup       1929 2018-07-09 06:20 /user/root/actor/part-m-00001

-rw-r--r--   1 root supergroup       1978 2018-07-09 06:20 /user/root/actor/part-m-00002

-rw-r--r--   1 root supergroup       1981 2018-07-09 06:20 /user/root/actor/part-m-00003

[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00000

1       PENELOPE        GUINESS 2006-02-15 04:34:33.0

2       NICK    WAHLBERG        2006-02-15 04:34:33.0

3       ED      CHASE   2006-02-15 04:34:33.0

4       JENNIFER        DAVIS   2006-02-15 04:34:33.0

...省略數據

2、指定導入到HDFS文件系統中數據輸出路徑

[root@hadoop-server01 lib]#  sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor1' --fields-terminated-by ','

如下所示,沒有采用默認輸出路徑,使用了我們指定的輸出路徑 /mysql/actor1

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor1

Found 5 items

-rw-r--r--   1 root supergroup          0 2018-07-09 06:24 /mysql/actor1/_SUCCESS

-rw-r--r--   1 root supergroup       1911 2018-07-09 06:24 /mysql/actor1/part-m-00000

-rw-r--r--   1 root supergroup       1929 2018-07-09 06:24 /mysql/actor1/part-m-00001

-rw-r--r--   1 root supergroup       1978 2018-07-09 06:24 /mysql/actor1/part-m-00002

-rw-r--r--   1 root supergroup       1981 2018-07-09 06:24 /mysql/actor1/part-m-00003

3、指定MapTask數量,通過指定MapTask數量,可以靈活控制執行的MapTask線程數,可以根據輸入遷移表大小合理控制程序執行效率,使用 -m number參數

[root@hadoop-server01 lib]#  sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor2' --fields-terminated-by ',' -m 2

這裏指定-m 2 表示採用2個MapTask線程執行。

18/07/09 06:28:14 INFO mapreduce.JobSubmitter: number of splits:2 表示控制生效,採用了2個MapTask線程執行

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor2

Found 3 items

-rw-r--r--   1 root supergroup          0 2018-07-09 06:28 /mysql/actor2/_SUCCESS

-rw-r--r--   1 root supergroup       3840 2018-07-09 06:28 /mysql/actor2/part-m-00000

-rw-r--r--   1 root supergroup       3959 2018-07-09 06:28 /mysql/actor2/part-m-00001

輸出爲2個文件,說明指定MapTask參數生效

4、增加where條件進行數據遷移

[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor3' --fields-terminated-by ',' -m 1 --where 'actor_id between 20 and 50'

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor3

Found 2 items

-rw-r--r--   1 root supergroup          0 2018-07-09 06:36 /mysql/actor3/_SUCCESS

-rw-r--r--   1 root supergroup       1193 2018-07-09 06:36 /mysql/actor3/part-m-00000

[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00000

20,LUCILLE,TRACY,2006-02-15 04:34:33.0

21,KIRSTEN,PALTROW,2006-02-15 04:34:33.0

22,ELVIS,MARX,2006-02-15 04:34:33.0

.....省略部分數據

47,JULIA,BARRYMORE,2006-02-15 04:34:33.0

48,FRANCES,DAY-LEWIS,2006-02-15 04:34:33.0

49,ANNE,CRONYN,2006-02-15 04:34:33.0

50,NATALIE,HOPKINS,2006-02-15 04:34:33.0

輸出符合過濾條件

5、query語句

query語句更爲靈活,可以根據自定義導入字段,而不必導入全部字段

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018  --target-dir '/mysql/actor3' --fields-terminated-by ',' -m 2 --query "SELECT actor_id,first_name,last_name FROM actor where first_name like 'D%' AND \$CONDITIONS" --split-by actor.first_name

說明:--query這個參數中的sql語句後面需要加上AND $CONDITIONS這個參數

 --split-by actor. 指定按表的哪個字段進行分片,格式爲--split-by ${tablename.column},若指定的-m 參數爲1,則無需指定 --split-by參數,因爲默認爲一個分片。

特別注意點:--query參數和--table參數互斥,指定了--query參數後不能再指定--table參數

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor3

Found 3 items

-rw-r--r--   1 root supergroup          0 2018-07-09 07:12 /mysql/actor3/_SUCCESS

-rw-r--r--   1 root supergroup         96 2018-07-09 07:12 /mysql/actor3/part-m-00000

-rw-r--r--   1 root supergroup         17 2018-07-09 07:12 /mysql/actor3/part-m-00001

[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00000

18,DAN,TORN

56,DAN,HARRIS

95,DARYL,WAHLBERG

116,DAN,STREEP

129,DARYL,CRAWFORD

182,DEBBIE,AKROYD

[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00001

59,DUSTIN,TAUTOU

從導入結果可以看出滿足SQL查詢條件,把first_name中以D開頭名字全部查詢出來。且按照first_name字段進行了分片

6、壓縮參數

如果想要使得導入到hdfs上的數據被壓縮,就可以使用-z或者--compression-codec來進行壓縮,-z壓縮方式是gzip壓縮,--compression-codec可以自定義壓縮方式

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor6' --fields-terminated-by ','  -z

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor6

Found 5 items

-rw-r--r--   1 root supergroup          0 2018-07-09 07:19 /mysql/actor6/_SUCCESS

-rw-r--r--   1 root supergroup        584 2018-07-09 07:19 /mysql/actor6/part-m-00000.gz

-rw-r--r--   1 root supergroup        571 2018-07-09 07:19 /mysql/actor6/part-m-00001.gz

-rw-r--r--   1 root supergroup        570 2018-07-09 07:19 /mysql/actor6/part-m-00002.gz

-rw-r--r--   1 root supergroup        580 2018-07-09 07:19 /mysql/actor6/part-m-00003.gz

使用Snappy方式壓縮

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor6' --fields-terminated-by ',' --compression-codec org.apache.hadoop.io.compress.SnappyCodec

自定義壓縮

7、delete-target-dir參數

當再次執行sqoop語句的時候,會報錯,因爲 /mysql/actor6文件夾已經存在了,我們需要先刪除這個文件夾再運行sqoop語句。也可以使用sqoop提供的delete-target-dir參數。

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor6' --fields-terminated-by ','  --delete-target-dir

8、append參數

如果目標文件夾在hdfs上已經存在,那麼再次運行就會報錯。可以使用--delete-target-dir來先刪除目錄。也可以使用append來往目錄下追加數據。append和delete-target-dir是相互衝突的。

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor6' --fields-terminated-by ',' --append

[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor6

Found 9 items

-rw-r--r--   1 root supergroup          0 2018-07-09 07:22 /mysql/actor6/_SUCCESS

-rw-r--r--   1 root supergroup       1911 2018-07-09 07:22 /mysql/actor6/part-m-00000

-rw-r--r--   1 root supergroup       1929 2018-07-09 07:22 /mysql/actor6/part-m-00001

-rw-r--r--   1 root supergroup       1978 2018-07-09 07:22 /mysql/actor6/part-m-00002

-rw-r--r--   1 root supergroup       1981 2018-07-09 07:22 /mysql/actor6/part-m-00003

-rw-r--r--   1 root supergroup       1911 2018-07-09 07:24 /mysql/actor6/part-m-00004

-rw-r--r--   1 root supergroup       1929 2018-07-09 07:24 /mysql/actor6/part-m-00005

-rw-r--r--   1 root supergroup       1978 2018-07-09 07:24 /mysql/actor6/part-m-00006

-rw-r--r--   1 root supergroup       1981 2018-07-09 07:24 /mysql/actor6/part-m-00007

4、5、6、7爲append的文件

9、空值處理

sqoop提供了--null-string來處理字符類型的空值,提供了--null-non-string來處理非字符類型的空值。

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor6' --fields-terminated-by ',' --null-string "" --null-non-string "false"

10、增量傳輸

增量導入的一個場景就是昨天導入了一批數據,今天又增加了部分數據,現在要把這部分數據也導入到hdfs中。

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor8' --fields-terminated-by ',' -m 1 --where 'actor_id between 20 and 25' --check-column "actor_id" --incremental append --last-value 5

Incremental import arguments:

  --check-column <column>     Source column to check for incremental change

  --incremental <import-type>    Define an incremental import of type 'append' or 'lastmodified'

  --last-value <value>                Last imported value in the incremental check column

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor9' --fields-terminated-by ',' -m 1

.......省略開頭數據

196,BELA,WALKEN,2006-02-15 04:34:33.0

197,REESE,WEST,2006-02-15 04:34:33.0

198,MARY,KEITEL,2006-02-15 04:34:33.0

199,JULIA,FAWCETT,2006-02-15 04:34:33.0

200,THORA,TEMPLE,2006-02-15 04:34:33.0

現在模擬在表中插入部分新增數據

mysql> insert into actor values (201,'Zhangsan','Zhang',' 2006-02-15 04:34:12');

Query OK, 1 row affected (0.02 sec)

mysql> insert into actor values (202,'Lisi','Lo',' 2006-02-15 04:34:12');              

Query OK, 1 row affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.03 sec)

mysql>

|      201 | Zhangsan    | Zhang        | 2006-02-15 04:34:12 |

|      202 | Lisi        | Lo           | 2006-02-15 04:34:12 |

+----------+-------------+--------------+---------------------+

現在執行

sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor  --target-dir '/mysql/actor9' --fields-terminated-by ',' -m 1 --check-column "actor_id" --incremental append --last-value 200

[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor9/part-m-00001  

201,Zhangsan,Zhang,2006-02-15 04:34:12.0

202,Lisi,Lo,2006-02-15 04:34:12.0

可以看出,新的輸出文件中只增加了我們在mysql中新增的兩條數據,這裏 --last-value 200值增量的檢查列的值,這裏的200就是增量actor_id=201前一個值


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