文章中全部的路径,均是演示所用.
实际状况请自行斟酌
首先介绍一下什么是Sqoopcss
Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,能够将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也能够将HDFS的数据导进到关系型数据库中。 —-来自百度百科html
客户端将命令提交给Sqoop,Sqoop会将这条命令自动生成多个Map Reduce做业,在hadoop和其它地方进行读写操做只有Map任务没有Reduce任务
HDFS(hadoop)上的数据能够经过Map Task读取 存储到数据仓库,文件系统或者关系型数据库中
反之也能够将数据仓库,文件系统或者关系型数据库中的数据存储到hadoop上
RDBMS与HDFS/Hive之间的转换一般是双向的,可是与HBase之间一般是单向的java
sqoop2.x和1.x的目标都是hadoop和其它数据存储工具中间的传输
可是2.x相对于1.x来讲使用起来简单一些
由客户端提交的请求,都由服务层去执行
这样有几点好处首先就是安全性提升,其次能够多用户同时访问mysql
$ hadoop dfs -ls
$ tar -xvf sqoop- <version> -bin-hadoop <hadoop-version> .tar.gz
#例:
$ tar -vxf sqoop-1.99.5-bin-hadoop200.tar.gz
因为Sqoop压缩出来文件的名字很是的长,因此为了之后使用方便,将其路径更改的短一些,好比:web
$ 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目录
这里有一些脚本是没有执行权限的因此要赋予其执行权限
使用以下命令:sql
$ chmod a+x *
export SQOOP_HOME=/home/hadoop/sqoop2
export PATH=$PATH:$SQOOP_HOME/bin
配置文件的目录在shell
~/sqoop2/server/conf
找到关于jar包目录的部分
叫作common.loader
数据库
将图片中文件夹中全部的jar包路径追加在common.loader中;
apache
#例如
/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
笔者将路径分开了,为了让你们可以看清,实际上只要一行路径之间用”,”分割
配置hadoop配置文件路径
其他都使用了默认配置,不影响使用
输入以下命令
$ sqoop2-tool verify
若是显示
则配置成功
将事先准备好的的关系型数据库驱动文件放在sqoop2/server/lib
路径下
$ sqoop2-server start
这里显示了Sqoop不少信息,包括端口号等等
$ 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;