一起学Sqoop

大数据中的一个export、import数据的工具

用处

一个工具,将hdfs和rdbms(关系型数据库)表之前相互export,import。

安装sqoop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1. 下载sqoop包
curl -O http://archive.apache.org/dist/sqoop/1.4.6/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz

2. 解压
tar -zxvf xxx

3. conf目录,修改配置名称
mv sqoop-env-template.sh sqoop-env.sh

4. 编辑sqoop-env.sh
配置hadoop_home, mapreduce_home, hbase_home, hive_home等等
如果之前你在系统环境变量中配置过了, 那么自接引用就行。

# Set Hadoop-specific environment variables here.

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=${HADOOP_NAME}

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=${HADOOP_NAME}

#set the path to where bin/hbase is available
export HBASE_HOME=/Users/daejong/Documents/Java/hbase-1.1.13

#Set the path to where bin/hive is available
export HIVE_HOME=${HIVE_HOME}

5. 将sqoop配置到系统的环境变量,方便全局调用sqoop命令。
vim /etc/profile
export SQOOP_HOME=/Users/daejong/Documents/java/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export PATH=$PATH:$SQOOP_HOME/bin
保存,source /etc/profile

6. 至此sqoop安装完毕
输入 sqoop 看是否安装成功。
输入 sqoop help 查看具体用法。
常用的就是import export

7. 还有最后一步
导入关系型数据的jar包到sqoop的lib目录下
如:我导入的就是mysql connetor的jar包。

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1. 从数据库将表数据导入到hdfs上
sqoop import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --table occupationals;

2. 测试下
先启动hadoop =》 start-all.sh
再执行上面的sqoop命令
18/03/11 12:48:17 INFO mapreduce.Job: map 0% reduce 0%
18/03/11 12:48:23 INFO mapreduce.Job: map 25% reduce 0%
18/03/11 12:48:25 INFO mapreduce.Job: map 50% reduce 0%
18/03/11 12:48:26 INFO mapreduce.Job: map 100% reduce 0%
18/03/11 12:48:27 INFO mapreduce.Job: Job job_1520743614849_0001 completed successfully
18/03/11 12:48:27 INFO mapreduce.Job: Counters: 30
执行的map任务, 并没有reduce任务。

3. 在hdfs查看结果
输入:hdfs dfs -ls /user/daejong/occupationals
输出:
-rw-r--r-- 1 daejong supergroup 0 2018-03-11 12:48 /user/daejong/occupationals/_SUCCESS
-rw-r--r-- 1 daejong supergroup 425 2018-03-11 12:48 /user/daejong/occupationals/part-m-00000
-rw-r--r-- 1 daejong supergroup 398 2018-03-11 12:48 /user/daejong/occupationals/part-m-00001
-rw-r--r-- 1 daejong supergroup 422 2018-03-11 12:48 /user/daejong/occupationals/part-m-00002
-rw-r--r-- 1 daejong supergroup 426 2018-03-11 12:48 /user/daejong/occupationals/part-m-00003

查看数据:hdfs dfs -cat /user/daejong/occupationals/part-m-00000
输出:
1, 计算机软件,系统集成,FILL
2, 电信,通信 计算机软件,系统集成,FILL
3, 计算机软件,系统集成 互联网,电子商务,网游,FILL
4, 计算机软件,系统集成 IT支持及其它,FILL
5, 互联网,电子商务,网游 计算机软件,系统集成,FILL
6, 电子,电气,半导体,仪器仪表 计算机软件,系统集成,FILL
7, 计算机软件,系统集成 电子,电气,半导体,仪器仪表,FILL

4. 至此 数据从关系型数据库导入hdfs 成功。

高级用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
1. 指定输出路径、指定数据分隔符。

sqoop import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --table occupationals --target-dir '/sqoop/data' --fields-terminated-by '\t'

输入:hdfs dfs -cat /sqoop/data/part-m-00000
输出:
1 计算机软件,系统集成 FILL
2 电信,通信 计算机软件,系统集成 FILL
3 计算机软件,系统集成 互联网,电子商务,网游 FILL
4 计算机软件,系统集成 IT支持及其它 FILL

2. 指定map task数,默认是用4个task,产生4个文件。
即表中数据少的话就指定少一点的map task。
表中数据多的话就指定多一点的map task。

默认是4个map task:
如下:
-rw-r--r-- 1 daejong supergroup 425 2018-03-11 15:15 /sqoop/data/part-m-00000
-rw-r--r-- 1 daejong supergroup 398 2018-03-11 15:15 /sqoop/data/part-m-00001
-rw-r--r-- 1 daejong supergroup 422 2018-03-11 15:15 /sqoop/data/part-m-00002
-rw-r--r-- 1 daejong supergroup 426 2018-03-11 15:15 /sqoop/data/part-m-00003

优化命令:在结尾指定 -m task_num
sqoop import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --table occupationals --target-dir '/sqoop/data1' --fields-terminated-by '\t' -m 1

处理过程:
18/03/11 15:22:39 INFO mapreduce.Job: map 0% reduce 0%
18/03/11 15:22:44 INFO mapreduce.Job: map 100% reduce 0%
就一个map task在执行。

优化后输入:hdfs dfs -ls /sqoop/data1
-rw-r--r-- 1 daejong supergroup 0 2018-03-11 15:22 /sqoop/data1/_SUCCESS
-rw-r--r-- 1 daejong supergroup 1671 2018-03-11 15:22 /sqoop/data1/part-m-00000
就只有一个数据文件了。


3. 增加where语句,即导出数据表中某一部分的数据
--where 'id>10' 其他参数都一样
sqoop import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --table occupationals --where 'id>10' --target-dir '/sqoop/data_where' --fields-terminated-by '\t' -m 1;

指定将id>10的数据 导出到hdfs上。
输入:hdfs dfs -cat /sqoop/data_where/part-m-00000
输出:
11 计算机软件,系统集成 美术,设计,创意 FILL
12 教育,培训 计算机软件,系统集成 FILL
13 计算机软件,系统集成 教育,培训 FILL
14 IT支持及其它 计算机软件,系统集成 FILL
15 计算机软件,系统集成 金融,证券,期货,投资 FILL
16 计算机软件,系统集成 计算机硬件,设备 FILL
17 金融,证券,期货,投资 计算机软件,系统集成 FILL
18 毕业生,实习生,培训生 计算机软件,系统集成 FILL
19 客户服务,售前,售后支持 计算机软件,系统集成 FILL
20 计算机软件,系统集成 其他 FILL
21 计算机软件,系统集成 化工 FILL
22 质控,安防 计算机软件,系统集成 FILL
23 生产,加工,制造 计算机软件,系统集成 FILL
24 高级管理 计算机软件,系统集成 FILL
25 传媒,影视,报刊,出版,印刷 计算机软件,系统集成 FILL
26 美术,设计,创意 计算机软件,系统集成 FILL
27 计算机软件,系统集成 客户服务,售前,售后支持 FILL
28 计算机软件,系统集成 汽车,摩托车制造 FILL

4. 增加query语句,导出部分字段的数据到hdfs(而不是所有字段)。
语句格式:
sqoop import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 \
--query 'select id, type from occupationals where id > 15 AND $CONDITIONS' --split-by occupationals.id --target-dir '/sqoop/query';

注意事项:
1. query是如果有where语句,一定要在where语句后面添加上AND $CONDITIONS(必须大写)
2. 在--query之前要用反斜杠 \ 分割query语句
3. 如果map task 任务不为1时(默认map task任务为4个),要在query语句后面添加--split-by tablename.column

输入:hdfs dfs -ls -R /sqoop/query
输出:
-rw-r--r-- 1 daejong supergroup 0 2018-03-11 15:42 /sqoop/query/_SUCCESS
-rw-r--r-- 1 daejong supergroup 180 2018-03-11 15:42 /sqoop/query/part-m-00000
-rw-r--r-- 1 daejong supergroup 146 2018-03-11 15:42 /sqoop/query/part-m-00001
-rw-r--r-- 1 daejong supergroup 147 2018-03-11 15:42 /sqoop/query/part-m-00002
-rw-r--r-- 1 daejong supergroup 244 2018-03-11 15:42 /sqoop/query/part-m-00003

输入: hdfs dfs -cat /sqoop/query/part-m-00000
输出:
16, 计算机软件,系统集成 计算机硬件,设备
17, 金融,证券,期货,投资 计算机软件,系统集成
18, 毕业生,实习生,培训生 计算机软件,系统集成

从数据库总导出数据到hive

一般我们还是把数据导入到hive中,然后利用hql对数据进行分析(而不是直接用mapreduce)

因为直接用mapreduce的话, 我们还要在hive中自己建表,然后跟hdfs上的数据关联,然后才可以分析hive中的数据。过程很繁琐

所以,我们直接将数据库数据导出到hive中,从而直接利用hive的hql对数据分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
具体的命令跟我们之前导入hdfs命令基本一致,只是添加了  --hive-import
1. 命令格式
sqoop import --hive-import --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --table occupationals --target-dir '/sqoop/hive'
输出:
18/03/11 15:54:44 INFO hive.HiveImport: Loading uploaded data into Hive 这里调用hive进行建表。
18/03/11 15:54:54 INFO hive.HiveImport: OK
18/03/11 15:54:54 INFO hive.HiveImport: Time taken: 1.753 seconds
18/03/11 15:54:54 INFO hive.HiveImport: Loading data to table default.occupationals
18/03/11 15:54:55 INFO hive.HiveImport: Table default.occupationals stats: [numFiles=4, totalSize=1671]
18/03/11 15:54:55 INFO hive.HiveImport: OK
18/03/11 15:54:55 INFO hive.HiveImport: Time taken: 0.336 seconds
18/03/11 15:54:55 INFO hive.HiveImport: Hive import complete.
18/03/11 15:54:55 INFO hive.HiveImport: Export directory is contains the _SUCCESS file only, removing the directory.
即导入成功。

2. 启动hive
之前配置过hive的环境变量,现在直接输入hive即可
输入:hive
输出:
show tables;
OK
occupationals
Time taken: 1.132 seconds, Fetched: 1 row(s)

3. 然后就可以在hive对数据进行分析了

hive> select * from occupationals;
OK
1 计算机软件,系统集成 FILL
2 电信,通信 计算机软件,系统集成 FILL
3 计算机软件,系统集成 互联网,电子商务,网游 FILL
4 计算机软件,系统集成 IT支持及其它 FILL
5 互联网,电子商务,网游 计算机软件,系统集成 FILL
6 电子,电气,半导体,仪器仪表 计算机软件,系统集成 FILL
7 计算机软件,系统集成 电子,电气,半导体,仪器仪表 FILL
8 计算机硬件,设备 计算机软件,系统集成 FILL
9 计算机软件,系统集成 毕业生,实习生,培训生 FILL
10 计算机软件,系统集成 电信,通信 FILL
11 计算机软件,系统集成 美术,设计,创意 FILL
12 教育,培训 计算机软件,系统集成 FILL
13 计算机软件,系统集成 教育,培训 FILL
14 IT支持及其它 计算机软件,系统集成 FILL
15 计算机软件,系统集成 金融,证券,期货,投资 FILL
16 计算机软件,系统集成 计算机硬件,设备 FILL
17 金融,证券,期货,投资 计算机软件,系统集成 FILL
18 毕业生,实习生,培训生 计算机软件,系统集成 FILL
19 客户服务,售前,售后支持 计算机软件,系统集成 FILL
20 计算机软件,系统集成 其他 FILL
21 计算机软件,系统集成 化工 FILL
22 质控,安防 计算机软件,系统集成 FILL
23 生产,加工,制造 计算机软件,系统集成 FILL
24 高级管理 计算机软件,系统集成 FILL
25 传媒,影视,报刊,出版,印刷 计算机软件,系统集成 FILL
26 美术,设计,创意 计算机软件,系统集成 FILL
27 计算机软件,系统集成 客户服务,售前,售后支持 FILL
28 计算机软件,系统集成 汽车,摩托车制造 FILL
Time taken: 0.422 seconds, Fetched: 28 row(s)


hive> select count(*) from occupationals;
Query ID = daejong_20180311160415_e37d036f-2ee8-4613-a6a5-800b36a0f16b
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1520743614849_0007, Tracking URL = http://dottie:8088/proxy/application_1520743614849_0007/
Kill Command = /Users/daejong/Documents/Java/hadoop-2.7.3/bin/hadoop job -kill job_1520743614849_0007
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2018-03-11 16:04:22,432 Stage-1 map = 0%, reduce = 0%
2018-03-11 16:04:27,682 Stage-1 map = 100%, reduce = 0%
2018-03-11 16:04:32,852 Stage-1 map = 100%, reduce = 100%
Ended Job = job_1520743614849_0007
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 HDFS Read: 8607 HDFS Write: 3 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
28
Time taken: 18.081 seconds, Fetched: 1 row(s)

导出操作:从hdfs上将数据导入到关系型数据库。

1
2
3
4
5
6
1. 在mysql数据库上创建好表。

2. 命令格式
sqoop export --connect jdbc:mysql://localhost:3306/hunt --username root --password 123456 --export-dir '/sqoop/hive' --table hive --columns id,type --fields-terminated-by ',' -m 2;

3. 至此,导入成功。