10. Sqoop介绍

1.大数据协作框架:

大数据协作框架是Hadoop 2.x生态系统中几个辅助框架。最为常见的是以下几个:

  • 数据转换工具Sqoop
  • 文件收集库框架Flume
  • 任务调度框架Oozie
  • 大数据web工具Hue

Flume,抽取系统日志文件进入HDFS。Sqoop,完成关系型数据库和Hdfs的数据抽取。Oozie:ETL作业管理,实现多任务的定时调度和多任务之间的依赖调度。Hue提供了一个web界面,管理大数据框架的所有组件。
由于Hadoop生态框架的不同组件在使用时,可能会出现一些兼容性的问题(不同组件来自于不同的公司,并贡献给Apache基金会),所以在学习Sqoop、Hbase、Oozie等框架如果再使用Apache的原生态版本会出现很多问题。
所以,我们使用商业公司封装的集成版本。最为有名的是CDH版本(优先使用这个版本、Cloudera公司提供;我选用这个版本)、HDP版本。使用CDH版本还有一个好处是:解决了Hadoop 2.x 生态系统中各个框架的版本兼容问题,例如你使用hadoop 2.5.0,那么Hive应该选择什么版本等等这种问题。

2. 安装CDH版本hadoop:

1.选择版本、下载解压安装文件:

首先选取一个CDH版本,下载对应的安装包,我选用5.3.6,根据这个版本选各个组件就可以了。[下载地址][1]
[1]:http://archive.cloudera.com/cdh5/cdh/5/
下载 XX.tar.gz版本,并下载,解压。

$ tar zxf hadoop-2.5.0-cdh5.3.6.tar.gz -C /opt/modules/
$ tar zxf hive-0.13.1-cdh5.3.6.tar.gz -C /opt/modules/
$ tar zxf sqoop-1.4.5-cdh5.3.6.tar.gz  -C /opt/modules/
$ tar zxf zookeeper-3.4.5-cdh5.3.6.tar.gz -C /opt/modules/

2.修改hadoop配置文件:

hadoop的配置文件都在 /opt/modules/hadoop-2.5.0-cdh5.3.6/etc/hadoop 下
(1)配置env文件:
ls env.sh 找到需要修改的文件, 有如下几个:hadoop-env.sh、mapred-env.sh 、yarn-env.sh。 添加java环境变量。

export JAVA_HOME=/opt/modules/jdk1.7.0_67

(2)修改*.xml文件。
需要修改以下文件:core-site.xml、hdfs-site.xml、yarn-site.xml 和 slaves文件:
core-site.xml:

<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop-senior01.pmpa.com:8020</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoop-2.5.0-cdh5.3.6/data</value>
</property>
</configuration>

hdfs-site.xml:

<configuration>
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

<property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop-senior01.pmpa.com:50070</value>
</property>

<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop-senior03.pmpa.com:50090</value>
</property>

<property>
    <name>dfs.permissions.enabled</name>
    <value>true</value>
</property>
</configuration>

yarn-site.xml:

<configuration>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop-senior02.pmpa.com</value>
</property>

<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>

<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>86400</value>
</property>
</configuration>

mapred-site.xml

<configuration>
<property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
</property>

<property>
     <name>mapreduce.jobhistory.address</name>
      <value>hadoop-senior03.pmpa.com:10020</value>
</property>

<property>
     <name>mapreduce.jobhistory.webapp.address</name>
      <value>hadoop-senior03.pmpa.com:19888</value>
</property>
</configuration>

slaves文件:

hadoop-senior01.pmpa.com
hadoop-senior02.pmpa.com
hadoop-senior03.pmpa.com

设置开机自启动Hadoop相关服务(HDFS、Yarn、Zookeeper等)。
设置开机自启动,需要修改/etc/rc.local文件。由于hadoop相关组件使用natty用户启动,所以需要切换用户,-c选项指定运行脚本(需要指定绝对路径)。(未生效)

#hadoop-senior01:
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager
su - natty -c /opt/modules/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start

#hadoop-senior02:
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanager
su - natty -c /opt/modules/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start 

#hadoop-senior03:
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh start historyserver
su - natty -c /opt/modules/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start 
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode
su - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start secondarynamenode

(3)修改环境变量:
切换root用户,在senior01主机上修改/etc/profile文件

#HADOOP HOME
HADOOP_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6

#HIVE HOME
HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6

(4)同步安装目录到其余服务器:

$ scp -r hadoop-2.5.0-cdh5.3.6/ natty@hadoop-senior02.pmpa.com:/opt/modules/
$ scp -r hadoop-2.5.0-cdh5.3.6/ natty@hadoop-senior03.pmpa.com:/opt/modules/

(5)测试安装:
a. 格式化namenode:

$ bin/hdfs namenode -format

b.启动hdfs、 Yarn 、 jobhistory:

$ sbin/start-dfs.sh 
$ sbin/start-yarn.sh 
$ sbin/mr-jobhistory-daemon.sh start historyserver
$ bin/hdfs dfs - mkdir /input
$ bin/hdfs dfs -put etc/hadoop/core-site.xml /input
$ bin/hdfs dfs -text /input/core-site.xml
$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /input/core-site.xml /output

(6)配置Hive:
配置hive非常简单,参考文章8。

3. Sqoop介绍:

1.简单介绍:

Sqoop : SQL-to-Hadoop
用途:把关系型数据库的数据转移到HDFS(Hive、Hbase)(重点使用的场景);Hadoop中的数据转移到关系型数据库中。Sqoop是java语言开发的,底层使用mapreduce。

2.版本

Sqoop有2个版本:Sqoop 1 和 Sqoop 2。但是目前企业使用的主要还是Sqoop 1,2版本还不稳定,使用时bug很多。
Sqoop2的改进:
1.引入server,集中化管理connnector。
2.多种访问方式: CLI、Web UI
3.引入基于角色的安全机制。


Sqoop设计

需要注意的是,Sqoop主要使用的是Map,是数据块的转移,没有使用到reduce任务。

3.使用要点

下图描述了Sqoop的主要使用命令:


sqoop使用要点

上图中,有2个主要的命令,即export 和 import,导入导出。
这里的导入和导出是相对于HDFS来讲的。例如,从RDBMS中导入到Hive中,就是导入(import);从Hive导入到Mysql中,就是导出(export)。

4. Sqoop安装配置和简单使用:

1.sqoop安装

Sqoop类似于Hive,只是一个客户端,不需要在每个节点上都安装。
(1)下载解压安装包。
(2)修改配置:
cd到目录$SQOOP_HOME/conf,修改配置文件。

$ cp -a sqoop-env-template.sh sqoop-env.sh

修改配置文件sqoop-env.sh,配置以下选项:

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6

#Set the path to where bin/hive is available
export HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/opt/modules/zookeeper-3.4.5-cdh5.3.6/conf

2.sqoop使用

查看命令帮助:

$ bin/sqoop help

因为sqoop是使用JDBC连接关系型数据库,并完成数据的转移的,所以很明显我们需要jdbc驱动,将jdbc驱动jar包复制到$SQOOP_HOME/lib下:

$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/sqoop-1.4.5-cdh5.3.6/lib/

查看某一个具体命令的帮助:

$ bin/sqoop list-databases --help

我们使用所有Sqoop命令都可以组合使用上边2个help命令来定位该命令的使用方法。
下面运行一个命令,来测试sqoop功能。 list-databases,该命令展示mysql库的所有数据库。因为展示所有数据库,所以JDBC url没有指定库。

$ bin/sqoop list-databases \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/ \
--username root \
--password 123456

5. 从mysql库import数据到HDFS:

sqoop从mysql数据库抽取数据到hive,使用import命令。主要需要2个步骤:(1)收集元数据;(2)提交只包含map的job。


sqoop import步骤

1.在mysql创建测试表并准备数据。

$ mysql -hlocalhost -uroot -p123456
mysql> create database pma_test;
mysql> use pma_test;
mysql> select database();

create table `cities` (
`id` int not null auto_increment,
`city` varchar(255) default null,
`country` varchar(255) default null,
PRIMARY KEY (`id`)
);

insert into cities values (1,'Tokyo','Japan');
insert into cities values (2,'Osaka','Japan');
insert into cities values (3,'Yokohama','Japan');
insert into cities values (4,'Nagoya','Japan');
insert into cities values (5,'New York','USA');
insert into cities values (6,'Boston','USA');
insert into cities values (7,'Berlin','Germany');
insert into cities values (8,'London','UK');

2.使用不同方式将mysql数据表导入hdfs

(1)直接将mysql表导入到HDFS上:
下例中,将mysql中的表pma_test.cities导入到hdfs。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities

不指定导入目录,默认情况是导入到hdfs上面用户家目录下边。
那么上边的文件将会导入到HDFS的目录是:/user/natty/cities

(2)指定HDFS的目录和mapper数量:
先创建一个hdfs目录,然后将mysql数据import指定到这个目录。

$ bin/hdfs dfs -mkdir /user/hive/warehouse/testdb.db/cities;

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--target-dir /user/hive/warehouse/testdb.db/cities/ \
--delete-target-dir

--num-mappers 1 : 指定mapper的数量是1;
--target-dir :为import操作指定目标目录,也就是需要将数据import到哪个目录下。
--delete-target-dir :指定了该参数后,如果hdfs的目标路径已经存在了的话,就先删除该目录,再进行import(会重新创建该目录)。

(3)指定分隔符
默认情况下,import导入hdfs的文件,字段分隔符是逗号。可以使用参数 --fields-terminated-by 来修改字段分隔符。 下边例子改为TAB分隔字段。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--target-dir /user/natty/sqoop/cities \
--delete-target-dir \
--fields-terminated-by '\t'

--fields-terminated-by : 指定字段的分隔符为 '\t' 。
查看导入hdfs的文件,可以看到,字段分隔符是tab键。

$ bin/hdfs dfs -text /user/natty/sqoop/cities/pa*

(4)增量导入数据文件:
可以按照mysql表的PK,增量导入数据。只导入变化的数据。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--target-dir /user/natty/sqoop/cities \
--check-column id \
--incremental append \
--last-value 7 \
--fields-terminated-by '\t'

--check_column : 是指定增量的字段,通过id字段获取增量数据。
--incremental :指定导入的方式,追加。
--last-value :从哪行开始导入,表示从第8行开始导入。
需要注意:当使用增量导入时,选项--delete-target-dir 不可以使用,否则报错。
通过结果发现,id为8的记录导入了2次。
(5)选择文件的保存格式:
默认情况下,导出的文件格式是textfile,可以指定参数修改导出格式。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--delete-target-dir \
--target-dir /user/natty/sqoop/cities \
--fields-terminated-by '\t' \
--as-parquetfile

--as-parquetfile : 指定文件的导出格式为parquet。
生成了类似"7185ff10-b9e5-4b14-9ef2-c24c3a7e3bba.parquet"格式的文件。

(6)是否压缩,和压缩方式选择:
默认情况下,文件不压缩。可以指定压缩,并选择压缩格式。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--delete-target-dir \
--target-dir /user/natty/sqoop/cities \
--compress 

--compress : 表示对文件压缩。
压缩之后,hdfs目录生成了part-m-00000.gz文件,导入hdfs的文件已经进行了压缩。
(7)其他常用的参数:
还包括
--query :后接sql语句,按照sql语句抽取文件。
--columns : 选择某些字段来抽取。
--where : 查询的where条件。
一般情况下,可以使用--query指定完整的sql语句来替代table、columns、where选项。使用--query时,要指定--target-dir
Instead of using the --table, --columns and --where arguments, you can specify a SQL statement with the --query argument.
第一种情况,使用colums、where条件,这时候需要指定--table项。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--num-mappers 1 \
--delete-target-dir \
--target-dir /user/natty/sqoop/cities \
--columns 'id','city' \
--where 'id>=4'

第二种情况,使用--query选项。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--num-mappers 1 \
--delete-target-dir \
--target-dir /user/natty/sqoop/cities \
--query "select * from cities where country = 'Japan' and \$CONDITIONS"

注意: 条件$CONDITIONS必须添加,而且$还要做转义,否则会报错。

6. 从mysql库import数据到HIVE:

前边导入的目标是hdfs目录,如果想导入到hive表中,使用参数--hive-table 和 --hive-import两个选项,例如下边的例子,将cities表导入到hive的hive_cities表中:

##先删除用户家目录下的文件夹cities
$ bin/hdfs dfs -rmr /user/natty/cities/

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--hive-import \
--hive-table hive_cities \
--fields-terminated-by '\t'

hive> select * from default.hive_cities;

上边的例子中,没有指定数据库,所以表建到了default库下。
我们也可以指定导出的hive表所在的数据库。使用参数--hive-database选项。

$ bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--delete-target-dir \
--hive-import \
--hive-table hive_cities \
--hive-database testdb \
--fields-terminated-by '\t'

hive> select * from testdb.hive_cities;

从mysql导入到hive时,先将mysql数据导出放在hdfs目录:/user/natty/cities下,然后在load到hive表里去。所以上边再次导入这个表到hive另一张表时,需要指定选项--delete-target-dir,否则报错:

Output directory hdfs://hadoop-senior01.pmpa.com:8020/user/natty/cities already exists

7. 从HDFS(或者HIVE表)导出数据到RDBMS(关系型数据库):

从hdfs export导出到RDBMS的应用相对少一些。使用export命令实现。

$ bin/sqoop export \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table hdfs2mysql \
--export-dir /user/hive/warehouse/testdb.db/cities/ \
--input-fields-terminated-by ','

mysql> select * from hdfs2mysql;

export成功后,可以在mysql表里查看到数据。

--table :指定我们要导入到mysql的哪张表中。
--export-dir : 从hdfs上的哪个路径上导出。
--input-fields-terminated-by ',' : 这项需要非常注意,我们先确定hdfs上的文件是以什么符号作为字段分隔符的,然后指定这项。这项跟import的不同,是input-xxx属性,输入文件的分隔符。

从Hive表导入到Mysql表: 实质上就是从HDFS导入到RDBMS,没有特殊的选项参数

8. 其他执行Sqoop的方式:

1.脚本执行sqoop:

下面新建一个简单脚本sqoop-01.sh:

#!/bin/bash
SQOOP_HOME=/opt/modules/sqoop-1.4.5-cdh5.3.6
$SQOOP_HOME/bin/sqoop import \
--connect jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test \
--username root \
--password 123456 \
--table cities \
--hive-import \
--hive-database testdb \
--delete-target-dir \
--hive-table hive_cities \
--fields-terminated-by '\t'

#执行脚本:
$ ./sqoop_01.sh 

2.sqoop命令参数方式执行:

类似于hive -f 参数,sqoop也提供了这种方式执行脚本。通过 ** --options-file 指定文件运行程序。
注意,这种执行方式对于文件的格式有一定的要求。sqoop的
参数放在一行,参数内容放在一行,不可以放在同一行**。例如下面的例子(在sqoop_home目录创建sqoop_options目录保存这些程序):
文件sqoop01.opt :

import
--connect
jdbc:mysql://hadoop-senior01.pmpa.com:3306/pma_test
--username
root
--password
123456
--table
cities
--hive-import
--hive-database
testdb
--delete-target-dir
--hive-table
hive_cities
--fields-terminated-by
'\t'

通过上边脚本注意到,参数 --username 和 参数内容root 需要各自在一行,对于某些没有参数内容的参数(例如--delete-target-dir )自己在一行即可。
下面执行这个脚本,需要使用--options-file参数:

$ bin/sqoop --options-file sqoop_options/sqoop01.opt 

3.导入mysql整个库:

可以使用参数import-all-tables 导入一个库下的所有的表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容