Sqoop 使用详解
Sqoop 是 Cloudera 公司创造的一个数据同步工具,现在已经完全开源了。
目前已经是 hadoop 生态环境中数据迁移的首选,另外还有 ali 开发的 DataX 属于同类型工具,由于社区的广泛使用和文档的健全,调研之后决定使用 Sqoop 来做我们之后数据同步的工具。
我们首先来看下 Sqoop 的工作流
他将我们传统的关系型数据库 | 文件型数据库 | 企业数据仓库 同步到我们的 hadoop 生态集群中。
同时也可以将 hadoop 生态集群中的数据导回到传统的关系型数据库 | 文件型数据库 | 企业数据仓库中。
Sqoop 如何抽取数据
1. 首先 Sqoop 去 rdbms 抽取元数据。
2. 当拿到元数据之后将任务切成多个任务分给多个 map。
3. 然后再由每个 map 将自己的任务完成之后输出到文件。
Sqoop import Command:
先从最简单的任务开始
sqoop import\
--connect jdbc:mysql://10.66.38.125:3306/user_db \
--username cloudera \
--password secretkey \
--table department \
--target-dir /sqoopdata/departments \ # HDFS 的目标存储位置
--where "department_id = 1000" \ # 指定条件,只有达成这个条件的才会被 import 进来
-- m 1
就这个语句就可以将我们关系型数据库中的某个表 import 进 HDFS 的某个位置。
同样我们可以 import 某些字段进来生成文件
sqoop import \
--connect jdbc:mysql://localhost:3306/retry_db \
--username cloudera \
--password secret \
--table departments \
--columns "dept_id, name" \ # 指定需要的字段
--as-avrodatafile # 指定存成 avro 数据文件
如果我们要 import 一个库里面的所有表可以使用
sqoop import-all-tables \
--connect jdbc:mysql://localhost:3306/retry_db \
--username cloudera \
--password secret \
--warehouse-dir /mydata # HDFS parent for table 这个会将所有这些表都放到 HDFS 这个文件夹下面
Sqoop import Command:
我们将数据从 Hadooop HDFS 导出向 RDBMS
sqoop export \
--connect jdbc:mysql://localhost:3306/retry_db \
--username cloudera \
--password departments \
--export-dir /sqoopdata/departments \ # HDFS source path for the export
--table departments
Sqoop Job:
Sqoop 提供一种能力,可以把我们经常会执行的任务存储成 jobs. 这些 jobs 可以在未来任何一个时间点被我们拿来使用。
sqoop job \
--create job_name \
--import \
--connect jdbc:mysql://localhost:3306/retry_db \
--username cloudera \
--password departments
常用姿势介绍完了,当我们需要将 MySQL 数据同步到 Hive 去的时候如果表还没有创建我们只需要执行:
sudo-u hive sqoop import \--connect jdbc:mysql://10.66.38.15:3306/user \ # 连接需要被同步的 MySQL
--username xxx \--password xxx \--table user \ # 需要被同步的表 --delete-target-dir \ # 之前有同步的文件已经存在删除掉 - m 1 \ # 开一个 map 这个值得注意,不是每个 source 表都可以轻松被分为多个 map 的。如果你这里要填写非 1 的数最好去熟悉一些细节--hive-import \ --hive-tableuser.user \
--create-hive-table \ # 创建 hive 表
--hive-drop-import-delims # Drops \n, \r, and \01 from string fields when importing to Hive.
如果是表已经创建好而需要全量同步数据执行:
sudo -u hive sqoop import\--connect jdbc:mysql://10.66.38.125:16033/user \
--username xxx \--password xxx \--table user \--delete-target-dir \--hive-overwrite \ # 全量重写数据- m 1 \--hive-import \--hive-table user.user \--hive-drop-import-delims
同样的 Sqoop 还支持 Hive 的增量同步。但是基于 mapreduce 的全量同步速度也快得超出想象。实测在三机集群上(12核 | 32内存)机器上1分钟基本能完成对 20 个字段左右的表 250w 条记录的抽取。并且对目标数据库机器的压力不算大。是非常理想的大数据同步工具。
Sqoop 的配置参数非常之多,在使用的时候建议先撸一遍文档(文档不长大概撸一次 2 3 个小时左右),找到自己需要注意的地方和更多适合自己的功能在使用的时候就能避免踩坑。比如上面使用的 hive-drop-import-delims 参数的使用就是还没看完文档就使用造成的坑。我们数据库中有字段没有过滤 \n 。有个用户的名字被误操作使用 \n 开头导致 hive 误以为遇到了换行符,该数据不仅错乱而且后面字段全部被置为 NULL。要避免这种问题一方面要对这个使用链上各个组件有所了解,更是应该读一读文档可以最大程度的避免踩坑。
语法(Syntax)
首先我们上面看到命令 Sqoop Command 这个 Command 其实是指定 Sqoop 使用哪种 Tool 。
$ sqoop help