一、sqoop作用洞豁?
sqoop是一個數(shù)據(jù)交換工具盐固,最常用的兩個工具是導(dǎo)入導(dǎo)出。
導(dǎo)入導(dǎo)出的參照物是hadoop族跛,向hadoop導(dǎo)數(shù)據(jù)就是導(dǎo)入闰挡。
二、sqoop的版本礁哄?
sqoop目前有兩個版本长酗,1.4.X為sqoop1;1.99.X為sqoop2桐绒。兩個版本不兼容夺脾。
三、使用sqoop列出mysql下的所有數(shù)據(jù)庫
復(fù)制代碼
(my_python_env)[root@hadoop26 ~]# sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456
information_schema
hive
mysql
test
復(fù)制代碼
四茉继、Import工具的使用
4.1將mysql中的某張表導(dǎo)入到hdfs上咧叭,現(xiàn)在test下有一張person表
4.2執(zhí)行sqoop語句
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person
4.3在hdfs用戶的家目錄下,產(chǎn)生了一個person文件夾
復(fù)制代碼
(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
復(fù)制代碼
4.4delete-target-dir參數(shù)
當(dāng)再次執(zhí)行sqoop語句的時候烁竭,會報錯菲茬,因為person文件夾已經(jīng)存在了,我們需要先刪除這個文件夾再運行sqoop語句派撕。
也可以使用sqoop提供的delete-target-dir參數(shù)
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person --delete-target-dir
4.5append參數(shù)
如果目標(biāo)文件夾在hdfs上已經(jīng)存在婉弹,那么再次運行就會報錯≈蘸穑可以使用--delete-target-dir來先刪除目錄镀赌。也可以使用append來往目錄下追加數(shù)據(jù)。append和delete-target-dir是相互沖突的际跪。
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append
執(zhí)行完成后商佛,查看hdfs上的文件
復(fù)制代碼
(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
復(fù)制代碼
4.6target-dir參數(shù)
上述的所有操作都是吧mysql中的數(shù)據(jù)寫到一個默認(rèn)的目錄下喉钢,可以使用target-dir來指定hdfs的目錄名
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append --target-dir person-mysql
查看hdfs上的目錄
復(fù)制代碼
(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
復(fù)制代碼
4.7map的個數(shù)
現(xiàn)在mysql表person中的數(shù)據(jù)增加到了11條
再次執(zhí)行sqoop語句來導(dǎo)入
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql
查看hdfs上的目錄
復(fù)制代碼
(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
復(fù)制代碼
從上面的結(jié)果可以發(fā)現(xiàn),這個作業(yè)啟動了4個map任務(wù)良姆,所以sqoop默認(rèn)配置就是4個map肠虽,用戶也可以通過-m參數(shù),自己指定map的數(shù)量
sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql -m 1
查看hdfs上的目錄發(fā)現(xiàn)歇盼,這次只啟動了一個map任務(wù)
(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參數(shù)
where參數(shù)可以進行一些簡單的篩選
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"
復(fù)制代碼
(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
復(fù)制代碼
4.9query參數(shù)
query參數(shù)就可以讓用戶隨意寫sql語句來查詢了舔痕。query和table參數(shù)是互斥的。
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壓縮
如果想要使得導(dǎo)入到hdfs上的數(shù)據(jù)被壓縮豹缀,就可以使用-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上的結(jié)果:
(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的邢笙,如果不加處理,導(dǎo)入到hdfs上是這樣子的:
復(fù)制代碼
(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
復(fù)制代碼
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"
執(zhí)行結(jié)果是:
復(fù)制代碼
(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
復(fù)制代碼
4.12增量傳輸
增量導(dǎo)入的一個場景就是昨天導(dǎo)入了一批數(shù)據(jù),今天又增加了部分?jǐn)?shù)據(jù)想暗,現(xiàn)在要把這部分?jǐn)?shù)據(jù)也導(dǎo)入到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
執(zhí)行結(jié)果是:
復(fù)制代碼
(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