大数据Sqoop快速入门 1

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 大数据Sqoop快速入门

1 Apache Sqoop

1.1 sqoop 介绍

Apache Sqoop 是在 Hadoop 生态体系和 RDBMS 体系之间传送数据的一种工具。来自于 Apache 软件基金会提供。


Sqoop 工作机制是将导入或导出命令翻译成 mapreduce 程序来实现。在翻译出的 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。


Hadoop 生态系统包括:HDFS、Hive、Hbase 等

RDBMS 体系包括:Mysql、Oracle、DB2 等

Sqoop 可以理解为:“SQL 到 Hadoop 和 Hadoop 到 SQL”。


站在 Apache 立场看待数据流转问题,可以分为数据的导入导出:

Import:数据导入。RDBMS----->Hadoop hadoop就是自己家,整个生态体系

Export:数据导出。Hadoop---->RDBMS


2. sqoop 安装

安装 sqoop 的前提是已经具备 java 和 hadoop 的环境。

最新稳定版: 1.4.6

配置文件修改:

cd $SQOOP_HOME/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh

创建这些hadoop生态体系这些位置:

export HADOOP_COMMON_HOME= /export/servers/hadoop-2.7.5
export HADOOP_MAPRED_HOME= /export/servers/hadoop-2.7.5\
export HIVE_HOME= /export/servers/hive

加入 mysql 的 jdbc 驱动包

cp /hive/lib/mysql-connector-java-5.1.32.jar $SQOOP_HOME/lib/

验证启动

bin/sqoop list-databases \
--connect jdbc:mysql://localhost:3306/ \
--username root --password hadoop

本命令会列出所有 mysql 的数据库。

到这里,整个 Sqoop 安装工作完成。


2 Sqoop 导入

“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录都存储为文本文件的文本数据

下面的语法用于将数据导入 HDFS。

$ sqoop import (generic-args) (import-args)

Sqoop 测试表数据

在 mysql 中创建数据库 userdb,然后执行参考资料中的 sql 脚本:

创建三张表: emp 雇员表、 emp_add 雇员地址表、emp_conn 雇员联系表。


2.1 全量导入 mysql 表数据到 HDFS

下面的命令用于从 MySQL 数据库服务器中的 emp 表导入 HDFS。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--delete-target-dir \
--target-dir /sqoopresult \
--table emp 
--m 1

其中--target-dir 可以用来指定导出数据存放至 HDFS 的目录;

mysql jdbc url 请使用ip 地址。

为了验证在 HDFS 导入的数据,请使用以下命令查看导入的数据:

hdfs dfs -cat /sqoopresult/part-m-00000

可以看出它会在 HDFS 上默认用逗号,分隔 emp 表的数据和字段。可以通过--fields-terminated-by '\t'来指定分隔符。

--m 1:表明需要使用几个map任务并发执行

1201,gopal,manager,50000,TP
1202,manisha,Proof reader,50000,TP
1203,khalil,php dev,30000,AC
1204,prasanth,php dev,30000,AC
1205,kranthi,admin,20000,TP

2.2 全量导入 mysql 表数据到 HIVE


f341b78d05b0411aaa72c1d5a3be276c.png

d080cf13a7954a2f830551741d6ca71c.png

2.2.1 方式一:先复制表结构到 hive 中再导入数据

肯定是先有表才可以导入数据


将关系型数据的表结构复制到 hive 中

bin/sqoop create-hive-table \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--table emp_add \
--username root \
--password hadoop \
--hive-table test.emp_add_sp

其中:

–table emp_add 为 mysql 中的数据库 sqoopdb 中的表。

–hive-table emp_add_sp 为 hive 中新建的表名称。

从关系数据库导入文件到 hive 中

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password hadoop \
--table emp_add \
--hive-table test.emp_add_sp \
--hive-import \
--m 1

2.2.2 方式二:直接复制表结构数据到 hive 中

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table emp_conn \
--hive-import \ --m 1 \
--hive-database test;

2.3 导入表数据子集(where 过滤)

–where 可以指定从关系数据库导入数据时的查询条件。它执行在数据库服

务器相应的 SQL 查询,并将结果存储在 HDFS 的目标目录。

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/sqoopdb \
--username root \
--password hadoop \
--where "city ='sec-bad'" \
--target-dir /wherequery \
--table emp_add --m 1

2.4 导入表数据子集(query 查询)

注意事项:

使用 query sql 语句来进行查找不能加参数--table;

并且必须要添加 where 条件;

并且 where 条件后面必须带一个$CONDITIONS 这个字符串;

并且这个sql 语句必须用单引号,不能用双引号;

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /wherequery12 \
--query 'select id,name,deg from emp WHERE id>1203 and $CONDITIONS' \
--split-by id \
--fields-terminated-by '\t' \
--m 2

sqoop 命令中,–split-by id 通常配合-m 10 参数使用。用于指定根据哪

个字段进行划分并启动多少个 maptask。


2.5 增量导入

在实际工作当中,数据的导入,很多时候都是只需要导入增量数据即可,并不需要将表中的数据每次都全部导入到 hive 或者 hdfs 当中去,这样会造成数据重复的问题。因此一般都是选用一些字段进行增量的导入, sqoop 支持增量的

导入数据。

增量导入是仅导入新添加的表中的行的技术。

–check-column (col)

用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据

进行导入,和关系型数据库中的自增字段及时间戳类似。

注意:这些被指定的列的类型不能使任意字符类型,如 char、varchar 等类

型都是不可以的,同时-- check-column 可以去指定多个列。

–incremental (mode)

append:追加,比如对大于 last-value 指定的值之后的记录进行追加导入。

lastmodified:最后的修改时间,追加 last-value 指定的日期之后的记录

–last-value (value)

指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值


2.5.1 Append 模式增量导入

执行以下指令先将我们之前的数据导入:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /appendresult \
--table emp --m 1

使用 hadoop fs -cat 查看生成的数据文件,发现数据已经导入到 hdfs 中。


然后在 mysql 的 emp 中插入 2 条增量数据:

insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1206', 'allen', 
'admin', '30000', 'tp');
insert into `userdb`.`emp` (`id`, `name`, `deg`, `salary`, `dept`) values ('1207', 'woon', 
'admin', '40000', 'tp');

执行如下的指令,实现增量的导入:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root --password hadoop \
--table emp --m 1 \
--target-dir /appendresult \
--incremental append \
--check-column id \
--last-value 1205


--last-value 1205最后确定的id,之后向后进行同步


最后验证导入数据目录 可以发现多了一个文件 里面就是增量数据

2.5.2 Lastmodified 模式增量导入

首先创建一个 customer 表,指定一个时间戳字段:

create table customertest(id int,name varchar(20),last_mod 
timestamp default current_timestamp on update current_timestamp);
此处的时间戳设置为在数据的产生和更新时都会发生改变.  分别插入如下记录:
insert into customertest(id,name) values(1,'neil');
insert into customertest(id,name) values(2,'jack');
insert into customertest(id,name) values(3,'martin');
insert into customertest(id,name) values(4,'tony');
insert into customertest(id,name) values(5,'eric');

执行 sqoop 指令将数据全部导入 hdfs:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--target-dir /lastmodifiedresult \
--table customertest --m 1

查看此时导出的结果数据:


再次插入一条数据进入 customertest 表

insert into customertest(id,name) values(6,'james')


使用 incremental 的方式进行增量的导入:


bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--append


此处已经会导入我们最后插入的一条记录,但是我们却发现此处插入了2 条数据,这是为什么呢?

这是因为采用 lastmodified 模式去处理增量时,会将大于等于 last-value 值的数据当做增量插入。


2.5.3 Lastmodified 模式:append、merge-key

使用 lastmodified 模式进行增量处理要指定增量数据是以 append 模式(附 加)还是 merge-key(合并)模式添加

下面演示使用 merge-by 的模式进行增量更新,我们去更新 id 为 1 的 name

字段。

update customertest set name = ‘Neil’ where id = 1;

更新之后,这条数据的时间戳会更新为更新数据时的系统时间.

执行如下指令,把 id 字段作为 merge-key:

bin/sqoop import \
--connect jdbc:mysql://node-1:3306/userdb \
--username root \
--password hadoop \
--table customertest \
--target-dir /lastmodifiedresult \
--check-column last_mod \
--incremental lastmodified \
--last-value "2019-05-28 18:42:06" \
--m 1 \
--merge-key id

由于 merge-key 模式是进行了一次完整的 mapreduce 操作,

因此最终我们在 lastmodifiedresult 文件夹下可以看到生成的为part-r-00000 这样的文件,会发现 id=1 的 name 已经得到修改,同时新增了id=6 的数据。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
8月前
|
SQL 分布式计算 大数据
大数据Spark SQL快速入门
大数据Spark SQL快速入门
97 0
|
8月前
|
分布式计算 监控 大数据
大数据Spark快速入门
大数据Spark快速入门
95 0
|
5月前
|
大数据 索引 Python
Python大数据之pandas快速入门(二)
Python大数据之pandas快速入门(二)
34 0
|
5月前
|
存储 SQL 数据可视化
Python大数据之pandas快速入门(一)
Python大数据之pandas快速入门(一)
77 0
|
5月前
|
Ubuntu 大数据 Linux
【大数据组件】一篇文章让你快速入门Docker
【大数据组件】一篇文章让你快速入门Docker
46 0
|
5月前
|
Dubbo Java 应用服务中间件
大数据开发前置技能__Dubbox快速入门
大数据开发前置技能__Dubbox快速入门
14 0
|
7月前
|
分布式计算 运维 大数据
盘点下近几年退役的顶级 Apache 大数据项目 - 继 Sentry,Sqoop 之后,Ambari 正式退役!
盘点下近几年退役的顶级 Apache 大数据项目 - 继 Sentry,Sqoop 之后,Ambari 正式退役!
|
7月前
|
存储 分布式计算 关系型数据库
大数据组件Sqoop-安装与验证
大数据组件Sqoop-安装与验证
78 0
|
8月前
|
关系型数据库 MySQL 大数据
大数据Sqoop将mysql直接抽取至Hbase
大数据Sqoop将mysql直接抽取至Hbase
80 0
|
8月前
|
关系型数据库 MySQL 大数据
大数据Sqoop搭建
大数据Sqoop搭建
94 0