ETL是指数据收集层,指的是数据抽取(Extract)、转换(Transform)、加载(Load),在真正的大数据工作中,很大的工作量都在做这一块的内容。
Sqoop简介
只要用于在Hadoop和关系数据库之间进行批量数据迁移的工具。
Hadoop:HDFS、Hive/Inceptor、HBase/Hyperbase
基于MapReduce实现面向大数据集的批量导入导出,将输入数据集分为N个切片,然后启动N个Map任务并行传输(Sqoop 1不进行Reduce)。
提供多种Sqoop连接器:内置的有经过优化的专用RDBMS连接器(MySQL、PostgreSQL、Oracle、DB2、SQL Server、Netzza等)以及通用的JDBC连接器(支持JDBC协议的数据库),也支持第三方的连接器(数据仓库:Teradata(MPP)NoSQL数据库:Couchbase(文档数据库))
但是目前Sqoop发展的一般,Sqoop 2的开发效果一般,项目发展不顺利。这里主要介绍Sqoop1的内容。Sqoop 1和2完全不兼容。
Sqoop原理
数据导入
RDBMS → Hadoop
Sqoop使用
安装测试
# 列出MySQL中的所有数据库
sqoop list-databases --connect jdbc:mysql://192.168.0.123:3316/ --username root --password transwarp
Sqoop命令的两种形式:
- 命令行
sqoop list-databases --connect jdbc:mysql://192.168.0.123:3316/ --username root --password transwarp
sqoop --options-file /users/home/work/import.txt
- 命令行 + 配置文件
list-databases
--connect
jdbc:mysql://192.168.0.123:3316/
--username
root
--password
*****
基本用法
列出RDBMS的所有数据库
# 明文密码
sqoop list-databases \
--connect jdbc:mysql://192.168.0.123:3316/ \
--username root \
--password 123456
# 手工输入密码
sqoop list-databases \
--connect jdbc:mysql://192.168.0.123:3316/ \
--username root \
-P
# 密码文件
sqoop list-databases \
--connect jdbc:mysql://192.168.0.123:3316/ \
--username root \
--password-file file:/root/pwd
Command Options | Description |
---|---|
list-databases | 列出所有数据库 |
–connect | JDBC连接 |
–username | 用户名 |
–password | 明文密码 |
-P | 手工输入密码 |
–password-file | 密码文件(400权限) |
列出数据库的所有表
Command Options | Description |
---|---|
list-tables | 列出所有表 |
–connect | JDBC连接 |
–username | 用户名 |
–password | 明文密码 |
-P | 手工输入密码 |
–password-file | 密码文件(400权限) |
全量数据导入
Command Options | Description |
---|---|
import | 数据导入 |
–query | SQL查询语句 |
–target-dir | HDFS目标目录(确保目录不存在,否则会报错) |
–fields-terminated-by | 列分隔符 |
–hive-drop-import-delims | 删除数据中包含的Hive默认分隔符(^A, ^B, \n) |
–null-string | string类型空值的替换符(Hive中Null用\n表示) |
–null-non-string | 非string类型空值的替换符 |
–split-by | 数据切片字段(int类型,m>1时必须指定) |
-m | Map任务数,默认为4 |
基于递增列的增量数据导入(Append方式)
Command Options | Description |
---|---|
–incremental append | 基于递增列的增量导入(将递增列大于阈值的所有数据增量导入Hadoop) |
–check-column | 递增列(int) |
–last-value | 阈值(int) |
基于时间列的增量数据导入(LastModified方式)
Command Options | Description |
---|---|
–incremental lastmodified | 基于时间列的增量导入(将时间列大于等于阈值的所有数据增量导入Hadoop) |
–merge-key | 合并列(主键,合并键值相同的记录) |
–check-column | 时间列(timestamp) |
–last-value | 阈值(timestamp) |
并发度控制
数据导入的性能瓶颈:RDBMS和Hadoop集群的网络带宽以及RDBMS的IO限制。
数据导入的性能可按每个Map任务的处理速度5~10MB/s做估算。Map任务并非越多越好,过多的Map会导致RDBMS发生IO抢占,反而降低整体性能。
RDBMS的导出速度控制在60~80MB/s。实战中一般设置4-8个Map任务,通过Query人工均匀切分数据。
参考
课程内容来自:南京大学+星环科技课程,大数据大数据理论与实践课程