《Hadoop实战手册》一1.5 使用Sqoop从HDFS导出数据到MySQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.5节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.5 使用Sqoop从HDFS导出数据到MySQL

Sqoop是Apache基金会下的一个项目,是庞大Hadoop生态圈中的一部分。在很多方面Sqoop和distcp很相似(见1.3节)。这两个工具都是构建在MapReduce之上的,利用了MapReduce的并行性和容错性。与集群间的数据复制不同,Sqoop设计通过JDBC驱动连接实现Hadoop集群与关系数据库之间的数据复制。

它的功能非常广泛,本节将以网络日志条目为例展示如何使用Sqoop从HDFS导入数据到MySQL数据库。

准备工作
本例使用Sqoop V1.3.0版本。

如果你使用的是CDH3版本,Sqoop默认是已经安装了。如果不是CDH3,你可以通过https://ccp.cloudera.com/display/CDHDOC/Sqoop+Installation找到发行版的说明。

在本节假设你已经启动了一个MySQL实例,并且能够访问Hadoop集群。mysql.user表配置了你运行Sqoop的那台机器上被允许连接的用户。访问http://dev.mysql.com/doc/refman/5.5/en/installing.html获取更多关于MySQL安装与配置的相关信息。

将MySQL JDBC驱动包复制到$SQOOP_HOME/libs目录下。该驱动包可以从http://dev.mysql.com/downloads/connector/j/ 下载。

按照1.1节介绍的导入weblog_entires.txt文件到HDFS的方式操作。

操作步骤
完成以下步骤实现将HDFS数据导出到MySQL表中。

1.在MySQL实例中创建一个新数据库:

CREATE DATABASE logs;

2.创建表weblogs_from_hdfs:

USE logs;
CREATE TABLE weblogs_from_hdfs (
    md5             VARCHAR(32),
    url             VARCHAR(64),
    request_date    DATE,
    request_time    TIME,
    ip              VARCHAR(15)
);

3.从HDFS导出weblog_entries.txt文件到MySQL:

sqoop export -m 1 --connect jdbc:mysql://<HOST>:<PORT>/logs --username hdp_usr 
--password test1 --table weblogs_from_hdfs --export-dir /data/weblogs/05102012 
--input-fields-terminated-by '\t' --mysql-delmiters

输出结果如下:

INFO mapreduce.ExportJobBase: Beginning export of weblogs_from_
hdfs
input.FileInputFormat: Total input paths to process : 1
input.FileInputFormat: Total input paths to process : 1
mapred.JobClient: Running job: job_201206222224_9010
INFO mapred.JobClient: Map-Reduce Framework
INFO mapred.JobClient: Map input records=3000
INFO mapred.JobClient: Spilled Records=0
INFO mapred.JobClient: Total committed heap usage
(bytes)=85000192
INFO mapred.JobClient: Map output records=3000
INFO mapred.JobClient: SPLIT_RAW_BYTES=133
INFO mapreduce.ExportJobBase: Transferred 248.3086 KB in 12.2398
seconds (20.287 KB/sec)
INFO mapreduce.ExportJobBase: Exported 3000 records.

工作原理
Sqoop连接数据库的JDBC驱动可使用-connect参数声明,并从$SQOOP_HOME/libs目录中加载相应的包。其中$SQOOP_HOME为Sqoop安装的绝对路径。--username和--password选项用于验证用户访问MySQL实例的权限。mysql.user表必须包含Hadoop集群每个节点的主机域名以及相应的用户名,否则Sqoop将会抛出异常,表明相应的主机不允许被连接到MySQL服务器。

mysql> USE mysql; 
mysql> select host, user from user; 
+-----------------+------------+ 
| user            | host       | 
+-----------------+------------+ 
| hdp_usr         | hdp01      | 
| hdp_usr         | hdp02      | 
| hdp_usr         | hdp03      | 
| hdp_usr         | hdp04      | 
| root            | 127.0.0.1  | 
| root            | ::1        | 
| root            | localhost  | 
+-----------------+------------+ 
7 rows in set (1.04 sec)

在这个例子中,我们使用hdp_usr用户连接到MySQL服务器。我们的集群拥有4台机器,即hdp01、hdp02、hdp03和hdp04。

--table参数决定了HDFS导出的数据将存储在哪个MySQL表中。这个表必须在执行Sqoop export语句之前创建好。Sqoop通过表的元数据信息、列数量以及列类型来校验HDFS需要导出目录中的数据并生成相应的插入语句。举个例子,导出作业可以被想象为逐行读取HDFS的weblogs_entries.txt文件并产生以下输出:

INSERT INTO weblogs_from_hdfs 
VALUES('aabba15edcd0c8042a14bf216c5', '/jcwbtvnkkujo.html', '2012-05- 10',   
'21:25:44', '148.113.13.214'); 

INSERT INTO weblogs_from_hdfs 
VALUES('e7d3f242f111c1b522137481d8508ab7', '/ckyhatbpxu.html', '2012- 05-10',   
'21:11:20', '4.175.198.160');

INSERT INTO weblogs_from_hdfs 
VALUES('b8bd62a5c4ede37b9e77893e043fc1', '/rr.html', '2012-05-10', '21:32:08',   
'24.146.153.181'); 
...

Sqoop export默认情况下是创建新增语句。如果--update-key参数被设置了,则将是创建更新语句。如果前面的例子使用了参数--update-key md5那么生成的Sql代码将运行如下:

UPDATE weblogs_from_hdfs SET url='/jcwbtvnkkujo.html', request_ date='2012-   
05-10'request_time='21:25:44' 
ip='148.113.13.214'WHERE md5='aabba15edcd0c8042a14bf216c5' 

UPDATE weblogs_from_hdfs SET url='/jcwbtvnkkujo.html', request_ date='2012-05-   
10' request_time='21:11:20' ip='4.175.198.160' WHERE md5='e7d3f242f111c1b   
522137481d8508ab7' 

UPDATE weblogs_from_hdfs SET url='/jcwbtvnkkujo.html', request_ date='2012-   
05-10'request_time='21:32:08' ip='24.146.153.181' WHERE md5='b8bd62a5c4ede37b   
9e77893e043fc1'

如果--update-key设置的值并没找到,可以设置--update-mode为allowinsert允许新增这行数据。

-m参数决定将配置几个mapper来读取HDFS上文件块。每个mapper各自建立与MySQL服务器的连接。每个语句将会插入100条记录。当完成100条语句也就是插入10000条记录,将会提交当前事务。一个失败的map任务,很可能导致数据的不一致,从而出现插入冲突数据或者插入重复数据。这种情况可以通过使用参数--staging-table来解决。这会促使任务将数据插入一个临时表,等待一个事务完成再将数据从临时表复制到--table参数配置的表中。临时表结构必须与最终表一致。临时表必须是一个空表否则需要配置参数--clear-staging-table。

延伸阅读

  • 使用Sqoop从MySQL数据库导入HDFS(1.4节)。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
186 6
|
17天前
|
数据采集 分布式计算 Hadoop
使用Hadoop MapReduce进行大规模数据爬取
使用Hadoop MapReduce进行大规模数据爬取
|
2月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
70 1
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
104 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
49 0
|
2月前
|
SQL 分布式计算 监控
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
71 3
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
56 4
|
2月前
|
存储 分布式计算 资源调度
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
86 5
|
2月前
|
资源调度 数据可视化 大数据
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
37 4
|
2月前
|
XML 分布式计算 资源调度
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
182 5