Sqoop安装及初体验

时间:2022-09-22 20:27:04

前言

文章中所有的路径,均是演示所用.
实际情况请自行斟酌

首先介绍一下什么是Sqoop

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 —-来自百度百科

Sqoop的优势

  • 高效、可控的利用资源
  • 支持多种数据库

Sqoop架构

1.x版本中Sqoop与服务端在同一个服务器上

Sqoop安装及初体验
客户端将命令提交给Sqoop,Sqoop会将这条命令自动生成多个Map Reduce作业,在hadoop和其它地方进行读写操作只有Map任务没有Reduce任务
HDFS(hadoop)上的数据可以通过Map Task读取 存储到数据仓库,文件系统或者关系型数据库中
反之也可以将数据仓库,文件系统或者关系型数据库中的数据存储到hadoop上
RDBMS与HDFS/Hive之间的转换通常是双向的,但是与HBase之间通常是单向的

sqoop2相对于sqoop1来说中间多了一个服务层

Sqoop安装及初体验
sqoop2.x和1.x的目标都是hadoop和其它数据存储工具中间的传输
但是2.x相对于1.x来说使用起来简单一些
由客户端提交的请求,都由服务层去执行
这样有几点好处首先就是安全性提高,其次可以多用户同时访问

准备工作

  • Sqoop
  • Hadoop
  • RDBMS驱动
    首先去官方网站下载sqoop安装包
    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目录
Sqoop安装及初体验
这里有一些脚本是没有执行权限的所以要赋予其执行权限
使用如下命令:

$ chmod a+x *

添加环境变量

export SQOOP_HOME=/home/hadoop/sqoop2
export PATH=$PATH:$SQOOP_HOME/bin

修改配置文件

配置文件的目录在

~/sqoop2/server/conf

catalina.properties

找到关于jar包目录的部分
叫做common.loader
Sqoop安装及初体验

将图片中文件夹中所有的jar包路径追加在common.loader中;
Sqoop安装及初体验

#例如
/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的路径全部删除,只保留自身默认的路径
Sqoop安装及初体验
以下是笔者自己更改的路径.大家按照自己个人情况为准

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配置文件路径
Sqoop安装及初体验
其余都使用了默认配置,不影响使用

测试

输入如下命令

$ sqoop2-tool verify

如果显示
Sqoop安装及初体验
则配置成功

RDBMS驱动文件

将事先准备好的的关系型数据库驱动文件放在sqoop2/server/lib路径下

Sqoop安装及初体验

启动Sqoop

第一步启动服务

$ sqoop2-server start

Sqoop安装及初体验
这里显示了Sqoop很多信息,包括端口号等等

第二步启动Shell

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

服务可以配置的选项如下:
Sqoop安装及初体验
注意:当给了--url时,则--host--port--webapp将被忽略

设置选项

sqoop:000> set option --name verbose --value true

如果使用默认设置,则直接使用set option就可以
一共有两个,一个是详细信息,一个是超时时间具体如下
Sqoop安装及初体验

查看连接器

sqoop:000> show connector

Sqoop自带四种连接器
Sqoop安装及初体验
加上-a参数可以查看连接器更详细的信息,由于篇幅过长这里就不做展示了,有兴趣的同学自己查看

创建链接链

创建JDBC链接链

create link -c 1 #这里的-c指的是上图connector根据id选择不同的连接器

Sqoop安装及初体验

创建HDFS链接链

create link -c 3

Sqoop安装及初体验

创建好之后,可以通过show link命令 查看创建好的链接链
Sqoop安装及初体验

创建作业

可以通过如下命令来创建一个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

Sqoop安装及初体验
粗略的描述了输入类型输出类型以及是否激活
加上-a参数会有更加详细的信息
Sqoop安装及初体验

启动作业

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

Sqoop安装及初体验
查看日志发现原因如下

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;