小言_互联网的博客

七、Sqoop架构,安装和基本使用

479人阅读  评论(0)

@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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场