@Author : By Runsen
@Date : 2020/6/21
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。
在一月到四月都没怎么写博客,因为决定写书,结果出书方说大学生就是一个菜鸟,看我确实还是一个菜鸟,就更新到博客算了。
我把第九章更新到博客上。
9.5 Sqoop和Flume
9.5.1 Sqoop基本架构和安装
(1)Sqoop基本架构
Sqoop是一个用于Hadoop和结构化数据存储,如关系型数据库之间进行高效传输大批量数据的工具。它包括以下两个方面:
- 可以使用Sqoop将数据从关系型数据库管理系统,如MySQL导入到Hadoop系统(如HDFS、Hive、Hbase)中
- 将数据从Hadoop系统中抽取并导出到关系型数据库,如MySQL
Sqoop 架构是非常简单的,它主要由三个部分组成:Sqoop client、Sqoop Server,Hadoop和RDBMS关系型Database。Sqoop 的架构图,如下图9-15所示。
Sqoop Client:定义了用户使用Sqoop的方式,提供客户端命令行CLI,浏览器,API编程三种方式,浏览器允许用户直接通过Http方式完成Sqoop的管理和数据的导出
Sqoop Server
-
Connector:所有Connector的实现放置到Sqoop server端,且Connector被进一步抽象化和模块化,它的通用部分被抽取出来本身只关注数据解析和加载相关的功能,包括Partitioner、Extractor和Loader等主要模块。
-
Metadata:Sqoop中的元信息,包括可用的Connector列表,用户创建的作业和Link(实例化的一个Connector,以便创建作业时使用)等。
-
RESTful和UI Server:与客户端对接,客户端发出的RESTful请求和HTTP请求,Sqoop Server会根据用户创建的Sqoop Job生成一个MapReduce作业,提交到Hadoop集群中分布式执行。
Hadoop:Sqoop是Hadoop的子项目,因此Sqoop只能在Linux操作系统上运行
RDMS:关系型数据库,如Mysql,Oracle,PostgreSQL。
(2)Sqoop安装
这里,我们安装稳定版本的Sqoop1.4.7,官方下载链接:http://sqoop.apache.org/
[root@node01 ~]# mkdir opt/module/sqoop
[root@node01 ~]# cd opt/module/sqoop/
[root@node01 sqoop]# wget http://mirror.bit.edu.cn/apache/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 sqoop]# tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
[root@node01 sqoop]# cd sqoop-1.4.7.bin__hadoop-2.6.0/conf/
[root@node01 conf]# mv sqoop-env-template.sh sqoop-env.sh
[root@node01 conf]# vim sqoop-env.sh
##########
export HADOOP_COMMON_HOME=/root/opt/module/hadoop/hadoop-3.2.1/
export HADOOP_MAPRED_HOME=/root/opt/module/hadoop/hadoop-3.2.1/
export HIVE_HOME=/root/opt/module/hive/apache-hive-3.1.2-bin/
export ZOOKEEPER_HOME=/root/opt/module/zookeeper/apache-zookeeper-3.5.6-bin/
export ZOOCFGDIR=/root/opt/module/zookeeper/apache-zookeeper-3.5.6-bin/
export Hbase_HOME=/root/opt/module/Hbase/Hbase-2.2.3/
[root@node01 conf]# cd ../lib/
[root@node01 lib]# wget http://static.runoob.com/download/mysql-connector-java-5.1.39-bin.jar
[root@node01 lib]# vim /etc/profile
##########
export SQOOP_HOME=/root/opt/module/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$SQOOP_HOME/bin
export CLASSPATH=$CLASSPATH:$SQOOP_HOME/lib
[root@node01 lib]# source /etc/profile
[root@node01 lib]# cd ~
[root@node01]# sqoop version
Sqoop 1.4.7
[root@node01]# #测试Sqoop能够成功连接数据库
[root@node01]# sqoop list-databases --connect jdbc:mysql://node01:3306/ --username root -P
Enter password:
information_schema
hive
mysql
performance_schema
sys
在启动Sqoop连接数据库Mysql ,可能会报以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
at org.apache.sqoop.manager.MySQLManager.initOptionDefaults(MySQLManager.java:73)
at org.apache.sqoop.manager.SqlManager.<init>(SqlManager.java:89)
at com.cloudera.sqoop.manager.SqlManager.<init>(SqlManager.java:33)
at org.apache.sqoop.manager.GenericJdbcManager.<init>(GenericJdbcManager.java:51)
at com.cloudera.sqoop.manager.GenericJdbcManager.<init>
这是因为commons-lang.jar的版本不适合,解决方法:在apache上下载commons-lang-2.6.jar包并上传到lib下即可,下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/commons/lang/binaries/commons-lang-2.6-bin.zip
9.5.2 Sqoop基本使用
(1)Mysql导入到HDFS
我们先创建persons数据表,作为导入数据的来源
mysql> create database persons;
Query OK, 1 row affected (0.00 sec)
mysql> use persons;
Database changed
mysql> create table persons (
-> id int(10) not null AUTO_INCREMENT,
-> name varchar(255),
-> sex char(1) comment '1 男性 0 女性',
-> city varchar(255),
-> primary key (Id)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into persons values (1,'Runsen','1','Guangzhou');
Query OK, 1 row affected (0.01 sec)
mysql> insert into persons values (2,'Zhangsan','1','Beijing');
Query OK, 1 row affected (0.00 sec)
mysql> insert into persons values (3,'Lisi','2','Shanghai');
Query OK, 1 row affected (0.00 sec)
mysql> select * from persons;
+----+----------+------+-----------+
| id | name | sex | city |
+----+----------+------+-----------+
| 1 | Runsen | 1 | Guangzhou |
| 2 | Zhangsan | 1 | Beijing |
| 3 | Lisi | 2 | Shanghai |
+----+----------+------+-----------+
3 rows in set (0.00 sec)
下面使用sqoop的命令将Mysql数据导入到HDFS分布式文件系统中。
[root@node01 ~]# # 查询persons数据库中的数据表
[root@node01 ~]# sqoop list-tables --connect jdbc:mysql://node01:3306/persons --username root --password 123456
persons
[root@node01 ~]# sqoop import --connect jdbc:mysql://node01:3306/persons --username root --password 123456 --table persons --target-dir /persons --fields-terminated-by "\t" --columns id,name,sex,city
2020-02-28 12:36:20,852 INFO mapreduce.Job: map 0% reduce 0%
2020-02-28 12:36:33,444 INFO mapreduce.Job: map 33% reduce 0%
2020-02-28 12:36:42,516 INFO mapreduce.Job: map 100% reduce 0%
[root@node01 ~]# hdfs dfs -ls /persons/
-rw-r--r-- 3 root supergroup 0 2020-02-28 12:36 /persons/_SUCCESS
-rw-r--r-- 3 root supergroup 21 2020-02-28 12:36 /persons/part-m-00000
-rw-r--r-- 3 root supergroup 21 2020-02-28 12:36 /persons/part-m-00001
-rw-r--r-- 3 root supergroup 18 2020-02-28 12:36 /persons/part-m-00002
[root@node01 ~]# hdfs dfs -cat /persons/part-m-00001
2 Zhangsan 1 Beijing
sqoop数据导入到HDFS参数
参数 | 描述 |
---|---|
–table
|
抽取mysql数据库中的表 |
–target-dir
|
指定导入hdfs的具体位置。默认生成在为/user//目录下 |
–fields-terminated-by | 指定分隔符 |
–columns | 导入指定列 |
-m <数值> | 执行map任务的个数,默认是4个 |
–direct | 可快速转换数据 |
–where | 导入指定数据 |
(2)Mysql导入到Hive
在使用Mysql导入到Hive时,需要将Hive中的lib下的hive-common-3.1.2.jar
复制到sqoop
中的lib文件夹中。导入Hive过程分为两步,第一步将数据导入到 HDFS,默认的临时目录是/user/hive/warehouse
,第二步将导入到 HDFS 的数据迁移到Hive 仓库。
[root@node01 ~]# cp /root/opt/module/hive/apache-hive-3.1.2-bin/lib
/hive-common-3.1.2.jar /root/opt/module/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
[root@node01 ~]# sqoop import --connect jdbc:mysql://node01:3306/persons --username root --password 123456 --table persons --hive-import --hive-database default --fields-terminated-by "\t" --hive-table persons -m 1
2020-02-28 13:01:49,757 INFO hive.HiveImport: OK
[root@node01 ~]# hdfs dfs -ls /user/hive/warehouse/persons
-rw-r--r-- 3 root supergroup 60 2020-02-28 13:01 /user/hive/warehouse/persons/part-m-00000
[root@node01 ~]# hdfs dfs -cat /user/hive/warehouse/persons/part-m-00000
1 Runsen 1 Guangzhou
2 Zhangsan 1 Beijing
3 Lisi 2 Shanghai
[root@node01 ]# hive
hive (default)> show tables in default;
OK
tab_name
persons
hive (default)> select * from persons;
OK
persons.id persons.name persons.sex persons.city
1 Runsen 1 Guangzhou
2 Zhangsan 1 Beijing
3 Lisi 2 Shanghai
Time taken: 2.713 seconds, Fetched: 3 row(s)
sqoop数据导入到Hive参数
参数 | 描述 |
---|---|
–hive-import | 将表导入Hive中 |
–hive-table
|
指定导入Hive的表名 |
–fields-terminated-by | 指定导入到hive中的文件数据格式 |
-m <数值> | 执行map任务的个数,默认是4个 |
(3)导出数据
在 Sqoop 中,“导出数据“指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群
(RDBMS)中传输数据,使用 export 命令。
mysql> truncate table persons;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from persons;
Empty set (0.00 sec)
[root@node01 ]# sqoop export --connect jdbc:mysql://node01:3306/persons --username root --password 12345 --table persons --num-mappers 1 --export-dir /user/hive/warehouse/persons --input-fields-terminated-by "\t"
2020-02-28 16:02:39,597 INFO mapreduce.Job: map 0% reduce 0%
2020-02-28 16:02:49,824 INFO mapreduce.Job: map 100% reduce 0%
mysql> select * from persons;
+----+----------+------+-----------+
| id | name | sex | city |
+----+----------+------+-----------+
| 1 | Runsen | 1 | Guangzhou |
| 2 | Zhangsan | 1 | Beijing |
| 3 | Lisi | 2 | Shanghai |
+----+----------+------+-----------+
更多的sqoop教程,参考官方文档:http://sqoop.apache.org/docs/1.4.7/index.html
转载:https://blog.csdn.net/weixin_44510615/article/details/106888957