大数据协作框架—Sqoop介绍

《大数据协作框架—Sqoop介绍》要点:
本文介绍了大数据协作框架—Sqoop介绍,希望对您有用。如果有疑问,可以联系我们。

概述

本日给大家一个福利,私信我可免费获取java资源,Dubbo、Redis、Netty、zookeeper、Spring cloud 等你来领取!!!

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

  • 数据转换工具Sqoop

  • 文件收集库框架Flume

  • 任务调剂框架Oozie

  • 年夜数据web工具Hue

Flume,抽取系统日志文件进入HDFS.Sqoop,完成关系型数据库和Hdfs的数据抽取.Oozie:ETL作业管理,实现多任务的定时调度和多任务之间的依赖调度.Hue提供了一个web界面,管理年夜数据框架的所有组件.

由于Hadoop生态框架的分歧组件在使用时,可能会出现一些兼容性的问题(分歧组件来自于分歧的公司,并贡献给Apache基金会),所以在学习Sqoop、Hbase、Oozie等框架如果再使用Apache的原生态版本会出现很多问题.

二丶安装CDH版本hadoop:

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

首先选取一个CDH版本,下载对应的安装包,我选用5.3.6,根据这个版本选各个组件就可以了.下载地址

下载 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/

改动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.comhadoop-senior02.pmpa.comhadoop-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 namenodesu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanodesu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanagersu - 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 datanodesu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanagersu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanagersu - 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 nodemanagersu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh start historyserversu - natty -c /opt/modules/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh startsu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanodesu - natty -c /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start secondarynamenode

(3)改动环境变量:

切换root用户,在senior01主机上改动/etc/profile文件

#HADOOP HOMEHADOOP_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6#HIVE HOMEHIVE_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.

三丶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设计

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

3.使用要点

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

大数据协作框架—Sqoop介绍

sqoop使用要点

上图中,有2个主要的命令,即export 和 import,导入导出.

这里的导入和导出是相对于HDFS来讲的.例如,从RDBMS中导入到Hive中,便是导入(import);从Hive导入到Mysql中,便是导出(export).

四丶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 availableexport HADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6#Set path to where hadoop-*-core.jar is availableexport HADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6#Set the path to where bin/hive is availableexport HIVE_HOME=/opt/modules/hive-0.13.1-cdh5.3.6#Set the path for where zookeper config dir isexport 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

五丶从mysql库import数据到HDFS:

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

大数据协作框架—Sqoop介绍

sqoop import步调

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

$ mysql -hlocalhost -uroot -p123456mysql> 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必需添加,而且$还要做转义,否则会报错.

六丶 从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

七丶从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,没有特殊的选项参数.

总结

到这里,深入理解java—大型网站分布式高并发架构知识就结束了,不足之处还望大家多多原谅!!觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持.(吹一波,233~~)

下面和年夜家交流几点编程的经验:

1、多写多敲代码,好的代码与扎实的基础知识必定是实践出来的

2丶 测试、测试再测试,如果你不彻底测试本身的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉.

3丶 简化算法,代码如恶魔,在你完成编码后,应回头而且优化它.从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松.

最后,每一位读到这里的网友,感谢你们能耐心地看完.希望在成为一名更优秀的Java法式员的道路上,我们可以一起学习、一起进步.

我的内部交流群469717771 欢迎列位前来交流和分享,验证:(009)

大数据协作框架—Sqoop介绍

编程之家PHP培训学院每天发布《大数据协作框架—Sqoop介绍》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。

相关文章

文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概...
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的...
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合R...
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Red...
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部...
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资...