一、sqoop作用?
sqoop是一個數據交換工具,最常用的兩個工具是導入導出。
導入導出的參照物是hadoop,向hadoop導數據就是導入。
二、sqoop的版本?
sqoop目前有兩個版本,1.4.X為sqoop1;1.99.X為sqoop2。兩個版本不兼容。
三、使用sqoop列出mysql下的所有數據庫
(my_python_env)[root@hadoop26 ~]# sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456 information_schema hive mysql test
四、Import工具的使用
4.1將mysql中的某張表導入到hdfs上,現在test下有一張person表
4.2執行sqoop語句
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person
4.3在hdfs用戶的家目錄下,產生了一個person文件夾
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls Found 2 items drwx------ - root supergroup 0 2016-07-03 23:00 .Trash drwxr-xr-x - root supergroup 0 2016-07-21 22:30 person (my_python_env)[root@hadoop26 ~]# hadoop fs -ls person Found 3 items -rw-r--r-- 1 root supergroup 0 2016-07-21 22:30 person/_SUCCESS -rw-r--r-- 1 root supergroup 17 2016-07-21 22:30 person/part-m-00000 -rw-r--r-- 1 root supergroup 12 2016-07-21 22:30 person/part-m-00001 (my_python_env)[root@hadoop26 ~]# hadoop fs -cat person/part-* 1,zhangsan,false 2,lisi,true
4.4delete-target-dir參數
當再次執行sqoop語句的時候,會報錯,因為person文件夾已經存在了,我們需要先刪除這個文件夾再運行sqoop語句。
也可以使用sqoop提供的delete-target-dir參數
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person --delete-target-dir
4.5append參數
如果目標文件夾在hdfs上已經存在,那么再次運行就會報錯。可以使用--delete-target-dir來先刪除目錄。也可以使用append來往目錄下追加數據。append和delete-target-dir是相互沖突的。
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append
執行完成后,查看hdfs上的文件
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person Found 5 items -rw-r--r-- 1 root supergroup 0 2016-07-21 22:50 person/_SUCCESS -rw-r--r-- 1 root supergroup 17 2016-07-21 22:50 person/part-m-00000 -rw-r--r-- 1 root supergroup 12 2016-07-21 22:50 person/part-m-00001 -rw-r--r-- 1 root supergroup 17 2016-07-21 23:48 person/part-m-00002 -rw-r--r-- 1 root supergroup 12 2016-07-21 23:48 person/part-m-00003
4.6target-dir參數
上述的所有操作都是吧mysql中的數據寫到一個默認的目錄下,可以使用target-dir來指定hdfs的目錄名
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append --target-dir person-mysql
查看hdfs上的目錄
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls Found 4 items drwx------ - root supergroup 0 2016-07-03 23:00 .Trash drwxr-xr-x - root supergroup 0 2016-07-21 23:53 _sqoop drwxr-xr-x - root supergroup 0 2016-07-21 23:48 person drwxr-xr-x - root supergroup 0 2016-07-21 23:53 person-mysql
4.7map的個數
現在mysql表person中的數據增加到了11條
再次執行sqoop語句來導入
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql
查看hdfs上的目錄
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql Found 5 items -rw-r--r-- 1 root supergroup 0 2016-07-21 23:59 person-mysql/_SUCCESS -rw-r--r-- 1 root supergroup 41 2016-07-21 23:59 person-mysql/part-m-00000 -rw-r--r-- 1 root supergroup 35 2016-07-21 23:59 person-mysql/part-m-00001 -rw-r--r-- 1 root supergroup 24 2016-07-21 23:59 person-mysql/part-m-00002 -rw-r--r-- 1 root supergroup 37 2016-07-21 23:59 person-mysql/part-m-00003
從上面的結果可以發現,這個作業啟動了4個map任務,所以sqoop默認配置就是4個map,用戶也可以通過-m參數,自己指定map的數量
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql -m 1
查看hdfs上的目錄發現,這次只啟動了一個map任務
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql Found 2 items -rw-r--r-- 1 root supergroup 0 2016-07-22 00:02 person-mysql/_SUCCESS -rw-r--r-- 1 root supergroup 137 2016-07-22 00:02 person-mysql/part-m-00000
4.8where參數
where參數可以進行一些簡單的篩選
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql -m 1 --where "gender=0"
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part* 1,zhangsan,false 3,003,false 4,004,false 6,006,false 7,007,false 8,008,false 9,009,false 11,011,false
4.9query參數
query參數就可以讓用戶隨意寫sql語句來查詢了。query和table參數是互斥的。
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --query "select * from person where name='003' and gender=0 and \$CONDITIONS"
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part-* 3,003,false
4.10壓縮
如果想要使得導入到hdfs上的數據被壓縮,就可以使用-z或者--compression-codec來進行壓縮,-z壓縮方式是gzip壓縮,--compression-codec可以自定義壓縮方式
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person -z
查看hdfs上的結果:
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql Found 2 items -rw-r--r-- 1 root supergroup 0 2016-07-22 00:38 person-mysql/_SUCCESS -rw-r--r-- 1 root supergroup 99 2016-07-22 00:38 person-mysql/part-m-00000.gz
使用Snappy方式壓縮
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person --compression-codec org.apache.hadoop.io.compress.SnappyCodec
4.11空值處理
像如圖id=12的記錄是沒有name和gender的,如果不加處理,導入到hdfs上是這樣子的:
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part* 1,zhangsan,false 2,lisi,true 3,003,false 4,004,false 5,005,true 6,006,false 7,007,false 8,008,false 9,009,false 10,010,true 11,011,false 12,null,null
sqoop提供了--null-string來處理字符類型的空值,提供了--null-non-string來處理非字符類型的空值。
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person --null-string "" --null-non-string "false"
執行結果是:
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part* 1,zhangsan,false 2,lisi,true 3,003,false 4,004,false 5,005,true 6,006,false 7,007,false 8,008,false 9,009,false 10,010,true 11,011,false 12,,false
4.12增量傳輸
增量導入的一個場景就是昨天導入了一批數據,今天又增加了部分數據,現在要把這部分數據也導入到hdfs中。
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --target-dir person-mysql -m 1 --table person --null-string "" --null-non-string "false" --check-column "id" --incremental append --last-value 5
執行結果是:
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part-m-00001 6,006,false 7,007,false 8,008,false 9,009,false 10,010,true 11,011,false 12,,false