前言
文章中所有的路径,均是演示所用.
实际情况请自行斟酌
首先介绍一下什么是Sqoop
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 —-来自百度百科
Sqoop的优势
- 高效、可控的利用资源
- 支持多种数据库
Sqoop架构
1.x版本中Sqoop与服务端在同一个服务器上
客户端将命令提交给Sqoop,Sqoop会将这条命令自动生成多个Map Reduce作业,在hadoop和其它地方进行读写操作只有Map任务没有Reduce任务
HDFS(hadoop)上的数据可以通过Map Task读取 存储到数据仓库,文件系统或者关系型数据库中
反之也可以将数据仓库,文件系统或者关系型数据库中的数据存储到hadoop上
RDBMS与HDFS/Hive之间的转换通常是双向的,但是与HBase之间通常是单向的
sqoop2相对于sqoop1来说中间多了一个服务层
sqoop2.x和1.x的目标都是hadoop和其它数据存储工具中间的传输
但是2.x相对于1.x来说使用起来简单一些
由客户端提交的请求,都由服务层去执行
这样有几点好处首先就是安全性提高,其次可以多用户同时访问
准备工作
- Sqoop
- Hadoop
- RDBMS驱动
首先去官方网站下载sqoop安装包
Sqoop官网
作者下载的是Sqoop2_1.99.5的版本
在要运行Sqoop服务器的机器上复制Sqoop工件。本机必须安装并配置Hadoop。您不需要在那里运行任何与Hadoop相关的服务,但是该机器必须能够充当Hadoop客户端。您应该可以列出HDFS,例如:
$ hadoop dfs -ls
安装Sqoop:
将安装包解压缩:
$ tar -xvf sqoop- <version> -bin-hadoop <hadoop-version> .tar.gz
#例:
$ tar -vxf sqoop-1.99.5-bin-hadoop200.tar.gz
由于Sqoop压缩出来文件的名字非常的长,所以为了以后使用方便,将其路径更改的短一些,比如:
$ mv sqoop- <version> -bin-hadoop <hadoop version> .tar.gz / usr / lib / sqoop
#例:
$ mv sqoop-1.99.5-bin-hadoop200 /home/hadoop/sqoop2
#因为本人的用户是hadoop所以大家不要误认为是放在hadoop目录中了
*注意,这里非常重要
进入sqoop的bin目录
这里有一些脚本是没有执行权限的所以要赋予其执行权限
使用如下命令:
$ chmod a+x *
添加环境变量
export SQOOP_HOME=/home/hadoop/sqoop2
export PATH=$PATH:$SQOOP_HOME/bin
修改配置文件
配置文件的目录在
~/sqoop2/server/conf
catalina.properties
找到关于jar包目录的部分
叫做common.loader
将图片中文件夹中所有的jar包路径追加在common.loader中;
#例如
/home/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/*.jar
#common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/../lib/*.jar,/usr/lib/hadoop/*.jar,/usr/lib/hadoop/lib/*.jar,/usr/lib/hadoop-hdfs/*.jar,/usr/lib/hadoop-hdfs/lib/*.jar,/usr/lib/hadoop-mapreduce/*.jar,/usr/lib/hadoop-mapreduce/lib/*.jar,/usr/lib/hadoop-yarn/*.jar,/usr/lib/hadoop-yarn/lib/*.jar
这里是默认的路径,由于笔者的hadoop不在该路径下,所以这里需要做一些更改,将其关于hadoop的路径全部删除,只保留自身默认的路径
以下是笔者自己更改的路径.大家按照自己个人情况为准
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/../lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/common/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/common/lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/hdfs/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/hdfs/lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/httpfs*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/httpfs/../lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/mapreduce/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/mapreduce/lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/tools/lib/*.jar,
/home/hadoop/hadoop2.7.3/share/hadoop/yarn/*.jar,
/home/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/*.jar
笔者将路径分开了,为了让大家能够看清,实际上只要一行路径之间用”,”分割
sqoop.properties
配置hadoop配置文件路径
其余都使用了默认配置,不影响使用
测试
输入如下命令
$ sqoop2-tool verify
如果显示
则配置成功
RDBMS驱动文件
将事先准备好的的关系型数据库驱动文件放在sqoop2/server/lib
路径下
启动Sqoop
第一步启动服务
$ sqoop2-server start
这里显示了Sqoop很多信息,包括端口号等等
第二步启动Shell
$ sqoop2-shell
初次接触的同学,可以输入"\h"
查看帮助
本文只介绍一下Sqoop2,因为1和2区别很大
设置服务
使用set server
命令
例如
set server --host sqoop2.company.net --port 80 --webapp sqoop
# or
set server --url http://sqoop2.company.net:80/sqoop
服务可以配置的选项如下:
注意:当给了--url
时,则--host
,--port
或--webapp
将被忽略
设置选项
sqoop:000> set option --name verbose --value true
如果使用默认设置,则直接使用set option
就可以
一共有两个,一个是详细信息,一个是超时时间具体如下
查看连接器
sqoop:000> show connector
Sqoop自带四种连接器
加上-a
参数可以查看连接器更详细的信息,由于篇幅过长这里就不做展示了,有兴趣的同学自己查看
创建链接链
创建JDBC链接链
create link -c 1 #这里的-c指的是上图connector根据id选择不同的连接器
创建HDFS链接链
create link -c 3
创建好之后,可以通过show link
命令 查看创建好的链接链
创建作业
可以通过如下命令来创建一个Sqoop作业
create job --from 1 --to 2 or create job --f 1 --t 2
举个栗子:
create job -f 1 -t 2 #这里的1指的是id为1的链接链,2同理
Sqoop方便的地方在于写的东西非常少,而且简单明确,就像填表一样,一步步跟着来就好了,下面你会理解的
sqoop:000> create job -f 1 -t 2
Creating job for links with from id 1 and to id 2
Please fill following values to create new job object
Name: from-mysql-to-hdfs-test #job的名字
From database configuration #RDBMS的设置
Schema name: blog #数据库名字
Table name: auth_group #表名
Table SQL statement: #可以写SQL
Table column names: #列名
Partition column name: #分区列
Null value allowed for the partition column: #允许用于分区列的空值
Boundary query: #边界查询
ToJob configuration #目标的设置
Override null value: #重写空值
Null value: #Null值的选项
Output format: #输出格式(0,1可供选择)
0 : TEXT_FILE
1 : SEQUENCE_FILE
Choose: 0
Compression format: #压缩格式
0 : NONE
1 : DEFAULT
2 : DEFLATE
3 : GZIP
4 : BZIP2
5 : LZO
6 : LZ4
7 : SNAPPY
8 : CUSTOM
Choose: 0
Custom compression format: #自定义压缩格式
Output directory: /sqoop/test/auth_group #输出目录
Throttling resources
Extractors: #HDFS作业中Map的个数
Loaders: #HDFS作业中Reduce的个数
New job was successfully created with validation status OK and persistent id 1
查看已创建的作业
show job
粗略的描述了输入类型输出类型以及是否激活
加上-a参数会有更加详细的信息
启动作业
start job -j 1 -s # -j 1指的是id为1的job
以下是Sqoop输出job的信息
sqoop:000> start job -j 1 -s
Submission details
Job ID: 1
Server URL: http://localhost:12000/sqoop/
Created by: hadoop
Creation date: 2017-09-01 16:36:00 CST
Lastly updated by: hadoop
External ID: job_1504254946961_0001
http://hadoop:8088/proxy/application_1504254946961_0001/
Source Connector schema: Schema{name=blog.auth_group,columns=[
FixedPoint{name=id,nullable=true,type=FIXED_POINT,byteSize=4,signed=true},
Text{name=name,nullable=true,type=TEXT,charSize=null}]}
2017-09-01 16:36:00 CST: BOOTING - Progress is not available
2017-09-01 16:37:04 CST: BOOTING - 0.00 %
2017-09-01 16:37:35 CST: BOOTING - 0.00 %
2017-09-01 16:38:02 CST: BOOTING - 0.00 %
2017-09-01 16:38:23 CST: BOOTING - 0.00 %
2017-09-01 16:38:50 CST: RUNNING - 0.00 %
2017-09-01 16:39:01 CST: RUNNING - 0.00 %
2017-09-01 16:39:15 CST: RUNNING - 0.00 %
2017-09-01 16:39:26 CST: RUNNING - 0.00 %
2017-09-01 16:39:38 CST: RUNNING - 0.00 %
2017-09-01 16:40:03 CST: RUNNING - 50.00 %
2017-09-01 16:40:14 CST: RUNNING - 50.00 %
2017-09-01 16:40:44 CST: SUCCEEDED
Counters:
org.apache.hadoop.mapreduce.FileSystemCounter
FILE_LARGE_READ_OPS: 0
FILE_WRITE_OPS: 0
HDFS_READ_OPS: 2
HDFS_BYTES_READ: 219
HDFS_LARGE_READ_OPS: 0
FILE_READ_OPS: 0
FILE_BYTES_WRITTEN: 264530
FILE_BYTES_READ: 0
HDFS_WRITE_OPS: 2
HDFS_BYTES_WRITTEN: 43
org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter
BYTES_WRITTEN: 0
org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter
BYTES_READ: 0
org.apache.hadoop.mapreduce.JobCounter
TOTAL_LAUNCHED_MAPS: 2
MB_MILLIS_MAPS: 171489280
VCORES_MILLIS_MAPS: 167470
SLOTS_MILLIS_MAPS: 167470
OTHER_LOCAL_MAPS: 2
MILLIS_MAPS: 167470
org.apache.sqoop.submission.counter.SqoopCounters
ROWS_READ: 3
ROWS_WRITTEN: 3
org.apache.hadoop.mapreduce.TaskCounter
SPILLED_RECORDS: 0
MERGED_MAP_OUTPUTS: 0
VIRTUAL_MEMORY_BYTES: 4297203712
MAP_INPUT_RECORDS: 0
SPLIT_RAW_BYTES: 219
MAP_OUTPUT_RECORDS: 3
FAILED_SHUFFLE: 0
PHYSICAL_MEMORY_BYTES: 305537024
GC_TIME_MILLIS: 477
CPU_MILLISECONDS: 4840
COMMITTED_HEAP_BYTES: 132120576
Job executed successfully
至此,结束MySQL表中的数据成功的导入到HDFS中
期间,笔者遇到了一个Bug
Exception: org.apache.sqoop.common.SqoopException Message: CLIENT_0001:Server has returned exception
查看日志发现原因如下
java.sql.SQLException: null, message from server: "Host 'SKY-20170522CJM' is not allowed to connect to this MySQL server"
原因是不能链接到MySQL服务,其实就是mysql远程访问的权限没有打开
在Mysql端执行一下如下代码即可解决
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;