使用Sqoop将MySQL数据导入HDFS

文章目录

  • 一、测试MySQL链接
    • 1.1 查看所有数据库
    • 1.2 查看test_mysql库中的表
    • 1.3 查询cars表中的数据
  • 二、导入HDFS
    • 2.1 单表导入
      • 2.1.1 使用默认参数导入
      • 2.1.2 设置字段分隔符
      • 2.1.3 指定HDFS目录
      • 2.1.4 指定map数
      • 2.1.5 指定文件保存格式
      • 2.1.6 从表中导出指定的一组或多组列的数据
      • 2.1.7 导出SQL查询的结果
      • 2.1.8 追加已存在的数据集上
      • 2.1.9 指定字符串代替null值
    • 2.2 全表导入

一、测试MySQL链接

1.1 查看所有数据库

sudo -u hdfs \
sqoop list-databases \
--connect jdbc:mysql://192.168.0.20:23306 \
--username root \
--password xxxxxxxx 

1.2 查看test_mysql库中的表

sudo -u hdfs \
sqoop list-tables \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql \
--username root \
--password xxxxxxxx

1.3 查询cars表中的数据

sudo -u hdfs \
sqoop eval \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql \
--username root \
--password xxxxxxxx \
--query "SELECT * FROM cars where id < 10;"

二、导入HDFS

import参数
    --append    将数据追加到HDFS上一个已存在的数据集上
    --as-avrodatafile    将数据导入到Avro数据文件
    --as-sequencefile    将数据导入到SequenceFile
    --as-textfile    将数据导入到普通文本文件(默认)
    --boundary-query <statement>    边界查询,用于创建分片(InputSplit)
    --columns <col,col,col…>    从表中导出指定的一组列的数据
    --delete-target-dir    如果指定目录存在,则先删除掉
    --direct    使用直接导入模式(优化导入速度)
    --direct-split-size <n>    分割输入stream的字节大小(在直接导入模式下)
    --fetch-size <n>    从数据库中批量读取记录数
    --inline-lob-limit <n>    设置内联的LOB对象的大小
    -m,--num-mappers <n>    使用n个map任务并行导入数据
    -e,--query <statement>    导入的查询语句
    --split-by <column-name>    指定按照哪个列去分割数据
    --table <table-name>    导入的源表表名
    --target-dir <dir>    导入HDFS的目标路径
    --warehouse-dir <dir>    HDFS存放表的根路径
    --where <where clause>    指定导出时所使用的查询条件
    -z,--compress    启用压缩
    --compression-codec <c>    指定Hadoop的codec方式(默认gzip)
    --null-string <null-string>    果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
    --null-non-string <null-string>    如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值

2.1 单表导入

person表前20行内容
使用Sqoop将MySQL数据导入HDFS_第1张图片

2.1.1 使用默认参数导入

命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person 

HDFS目录
默认在hdfs用户目录下,目录名直接以源表名保存

[root@master ~]# sudo -u hdfs hadoop fs -ls /user/hdfs/person
Found 5 items
-rw-r--r--   3 hdfs supergroup          0 2019-08-26 17:12 /user/hdfs/person/_SUCCESS
-rw-r--r--   3 hdfs supergroup   71413655 2019-08-26 17:11 /user/hdfs/person/part-m-00000
-rw-r--r--   3 hdfs supergroup   72524741 2019-08-26 17:11 /user/hdfs/person/part-m-00001
-rw-r--r--   3 hdfs supergroup   72527645 2019-08-26 17:11 /user/hdfs/person/part-m-00002
-rw-r--r--   3 hdfs supergroup   72525860 2019-08-26 17:12 /user/hdfs/person/part-m-00003

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /user/hdfs/person/part-m-00000 | head -n 20
1,甲,子鼠,18,0
2,乙,丑牛,null,1
3,丙,寅虎,64,0
4,丁,卯兔,49,0
5,戊,辰龙,null,0
6,己,巳蛇,66,0
7,庚,午马,49,1
8,辛,未羊,14,1
9,壬,申猴,45,0
10,癸,酉鸡,88,1
11,,戌狗,24,0
12,,亥猪,78,0
13,,,31,1
14,llkkb,llkkbd,30,0
15,llkk,llkk,54,0
16,llkkb,llkkbd,13,1
17,llkk,llkk,7,1
18,llkk,llkk,12,0
19,llkkc,llkkc,84,1
20,llkkf,llkkf,47,1
cat: Unable to write to output stream.

2.1.2 设置字段分隔符

默认使用 ","分割
使用制表符: --fields-terminated-by '\t'
使用双引号:--fields-terminated-by '\"'
使用反斜杠:--fields-terminated-by '\\'

命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person \
--fields-terminated-by '\t' \
--delete-target-dir

HDFS目录

[root@master ~]# sudo -u hdfs hadoop fs -ls /user/hdfs/person
Found 5 items
-rw-r--r--   3 hdfs supergroup          0 2019-08-26 17:41 /user/hdfs/person/_SUCCESS
-rw-r--r--   3 hdfs supergroup   71413655 2019-08-26 17:41 /user/hdfs/person/part-m-00000
-rw-r--r--   3 hdfs supergroup   72524741 2019-08-26 17:41 /user/hdfs/person/part-m-00001
-rw-r--r--   3 hdfs supergroup   72527645 2019-08-26 17:41 /user/hdfs/person/part-m-00002
-rw-r--r--   3 hdfs supergroup   72525860 2019-08-26 17:41 /user/hdfs/person/part-m-00003

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /user/hdfs/person/part-m-00000 | head -n 20
1	甲		子鼠		18		0
2	乙		丑牛		null	1
3	丙		寅虎		64		0
4	丁		卯兔		49		0
5	戊		辰龙		null	0
6	己		巳蛇		66		0
7	庚		午马		49		1
8	辛		未羊		14		1
9	壬		申猴		45		0
10	癸		酉鸡		88		1
11			戌狗		24		0
12			亥猪		78		0
13					31		1
14	llkkb	llkkbd	30		0
15	llkk	llkk	54		0
16	llkkb	llkkbd	13		1
17	llkk	llkk	7		1
18	llkk	llkk	12		0
19	llkkc	llkkc	84		1
20	llkkf	llkkf	47		1
cat: Unable to write to output stream.

2.1.3 指定HDFS目录

指定/usr/hdfs/1目录:--target-dir /usr/hdfs/1

命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--delete-target-dir

HDFS目录

[root@master ~]# sudo -u hdfs hadoop fs -ls /usr/hdfs/1
Found 5 items
-rw-r--r--   3 hdfs supergroup          0 2019-08-26 17:59 /usr/hdfs/1/_SUCCESS
-rw-r--r--   3 hdfs supergroup   62664632 2019-08-26 17:58 /usr/hdfs/1/part-m-00000
-rw-r--r--   3 hdfs supergroup   63776345 2019-08-26 17:58 /usr/hdfs/1/part-m-00001
-rw-r--r--   3 hdfs supergroup   63778151 2019-08-26 17:58 /usr/hdfs/1/part-m-00002
-rw-r--r--   3 hdfs supergroup   63776312 2019-08-26 17:59 /usr/hdfs/1/part-m-00003

2.1.4 指定map数

指定1个map数:-m 1--num-mappers 1

命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--delete-target-dir \
-m 1

HDFS目录
指定map为1后,只会生成一个文件

[root@master ~]# sudo -u hdfs hadoop fs -ls /usr/hdfs/1
Found 2 items
-rw-r--r--   3 hdfs supergroup          0 2019-08-26 18:01 /usr/hdfs/1/_SUCCESS
-rw-r--r--   3 hdfs supergroup  253995440 2019-08-26 18:01 /usr/hdfs/1/part-m-00000

2.1.5 指定文件保存格式

text文件格式--as-textfile(默认格式)
Parquet Data Files文件格式--as-parquetfile(推荐)
Avro Data Files文件格式 --as-avrodatafile
SequenceFiles文件格式 --as-sequencefile

2.1.6 从表中导出指定的一组或多组列的数据

导出指定列--columns "id,fname,lname"
命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--delete-target-dir \
--columns "id,fname,lname" \
-m 1

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /usr/hdfs/1/part-m-00000 | head -n 20
1	甲		子鼠
2	乙		丑牛
3	丙		寅虎
4	丁		卯兔
5	戊		辰龙
6	己		巳蛇
7	庚		午马
8	辛		未羊
9	壬		申猴
10	癸		酉鸡
11			戌狗
12			亥猪
13		
14	llkkb	llkkbd
15	llkk	llkk
16	llkkb	llkkbd
17	llkk	llkk
18	llkk	llkk
19	llkkc	llkkc
20	llkkf	llkkf
cat: Unable to write to output stream.

2.1.7 导出SQL查询的结果

导出id小于13的数据:--query "SELECT * FROM person where id < 13"
命令
注意查询语句要加上:WHERE $CONDITIONS
如果SQL中已经写了where条件,则加上:AND \$CONDITIONS

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--delete-target-dir \
--query "SELECT * FROM person where id < 13 AND \$CONDITIONS" \
-m 1

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /usr/hdfs/1/part-m-00000 | head -n 20
1	甲	子鼠		18		0
2	乙	丑牛		null	1
3	丙	寅虎		64		0
4	丁	卯兔		49		0
5	戊	辰龙		null	0
6	己	巳蛇		66		0
7	庚	午马		49		1
8	辛	未羊		14		1
9	壬	申猴		45		0
10	癸	酉鸡		88		1
11		戌狗		24		0
12		亥猪		78		0

2.1.8 追加已存在的数据集上

追加在原有数据集上:--append
追加--append不能与--delete-target-dir一起使用
命令
追加id大于12小于20的数据

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--query "SELECT * FROM person where id > 12 and id <20  AND \$CONDITIONS" \
--append \
-m 1

HDFS目录
多了一个文件

[root@master ~]# sudo -u hdfs hadoop fs -ls /usr/hdfs/1
Found 3 items
-rw-r--r--   3 hdfs supergroup          0 2019-08-27 10:25 /usr/hdfs/1/_SUCCESS
-rw-r--r--   3 hdfs supergroup        217 2019-08-27 10:25 /usr/hdfs/1/part-m-00000
-rw-r--r--   3 hdfs supergroup        125 2019-08-27 10:31 /usr/hdfs/1/part-m-00001

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /usr/hdfs/1/part-m-00001 | head -n 20
13			31		1
14	llkkb	llkkbd	30	0
15	llkk	llkk	54	0
16	llkkb	llkkbd	13	1
17	llkk	llkk	7	1
18	llkk	llkk	12	0
19	llkkc	llkkc	84	1

2.1.9 指定字符串代替null值

指定\N代替原表中字符串的null值:--null-string '\\N'
指定\N代替原表中非字符串的null值:--null-non-string '\\N'
命令

sudo -u hdfs \
sqoop import \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--table person \
--fields-terminated-by '\t' \
--target-dir /usr/hdfs/1 \
--delete-target-dir \
--null-string 'NULL' \
--null-non-string 'NULL' \
-m 1

HDFS文件内容

[root@master ~]# sudo -u hdfs hadoop fs -cat /usr/hdfs/1/part-m-00000 | head -n 20
1	甲		子鼠		18		0
2	乙		丑牛		\N		1
3	丙		寅虎		64		0
4	丁		卯兔		49		0
5	戊		辰龙		\N		0
6	己		巳蛇		66		0
7	庚		午马		49		1
8	辛		未羊		14		1
9	壬		申猴		45		0
10	癸		酉鸡		88		1
11			戌狗		24		0
12			亥猪		78		0
13					31		1
14	llkkb	llkkbd	30		0
15	llkk	llkk	54		0
16	llkkb	llkkbd	13		1
17	llkk	llkk	7		1
18	llkk	llkk	12		0
19	llkkc	llkkc	84		1
20	llkkf	llkkf	47		1
cat: Unable to write to output stream.

2.2 全表导入

要使全表导入,必须满足以下条件:

  1. 每个表必须具有主键或使用–autoreset-to-one-mapper选项
  2. 导入每张表的所有列
  3. 使用默认拆分列,不能使用WHERE
  4. 不支持指定导入目录,默认目录在/user/hdfs/

其他的与单表类似
命令

sudo -u hdfs \
sqoop import-all-tables \
--connect jdbc:mysql://192.168.0.20:23306/test_mysql?tinyInt1isBit=false \
--username root \
--password xxxxxxxx \
--fields-terminated-by '\t' \
--autoreset-to-one-mapper \
-m 1

HDFS目录
carsperson

[root@master ~]# sudo -u hdfs hadoop fs -ls /user/hdfs/
Found 5 items
drwx------   - hdfs supergroup          0 2019-08-27 11:12 /user/hdfs/.Trash
drwx------   - hdfs supergroup          0 2019-08-27 11:14 /user/hdfs/.staging
drwxr-xr-x   - hdfs supergroup          0 2019-08-27 10:39 /user/hdfs/_sqoop
drwxr-xr-x   - hdfs supergroup          0 2019-08-27 11:14 /user/hdfs/cars
drwxr-xr-x   - hdfs supergroup          0 2019-08-27 11:14 /user/hdfs/person

你可能感兴趣的:(Sqoop)