目录
一、sqoop基本原理
1.1、何为Sqoop?
Sqoop(SQL-to-Hadoop)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导出到关系型数据库中。
1.2、为什么需要用Sqoop?
我们通常把有价值的数据存储在关系型数据库系统中,以行和列的形式存储数据,以便于用户读取和查询。但是当遇到海量数据时,我们需要把数据提取出来,通过MapReduce对数据进行加工,获得更符合我们需求的数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。为了能够和HDFS系统之外的数据库系统进行数据交互,MapReduce程序需要使用外部API来访问数据,因此我们需要用到Sqoop。
1.3、关系图
1.4、架构图
在 mapreduce 中主要是对 inputformat 和 outputformat 进行定制。
Sqoop工具接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器(Task Translator)将命令转换为对应的MapReduce任务,而后将关系型数据库和Hadoop中的数据进行相互转移,进而完成数据的拷贝。
二、Sqoop可用命令
命令 | 方法 |
---|---|
codegen | 生成与数据库记录交互的代码 |
create-hive-table | 将表定义导入到Hive中 |
eval | 评估SQL语句并显示结果 |
export | 导出一个HDFS目录到一个数据库表 |
help | 可用命令列表 |
import | 将一个表从数据库导入到HDFS |
import-all-tables | 从数据库导入表到HDFS |
import-mainframe | 从大型机服务器导入数据集到HDFS |
job | 使用已保存的工作 |
list-databases | 列出服务器上可用的数据库 |
list-tables | 列出数据库中可用的表 |
merge | 合并增量导入的结果 |
metastore | 运行一个独立的Sqoop转移 |
version | 显示版本信息 |
对于不同的命令,有不同的参数,这里给大家列出来了一部分Sqoop操作时的常用参数,以供参考,需要深入学习的可以参看对应类的源代码,本文目前介绍常用的导入、导出的一些命令。
2.1、公用参数:数据库连接
参数 | 说明 |
---|---|
--connect | 连接关系型数据库的URL |
--connection-manager | 指定要使用的连接管理类 |
--driver | JDBC的driver class |
--help | 打印帮助信息 |
--username | 连接数据库的用户名 |
--password | 连接数据库的密码 |
--verbose | 在控制台打印出详细信息 |
2.2、公用参数:import
参数 | 说明 |
---|---|
--enclosed-by | 给字段值前后加上指定的字符 |
--escaped-by | 对字段中的双引号加转义符 |
--fields-terminated-by | 设定每个字段是以什么符号作为结束,默认为逗号 |
--lines-terminated-by | 设定每行记录之间的分隔符,默认是\n |
--mysql-delimiters | Mysql默认的分隔符设置,字段之间以逗号分隔,行之间以\n分隔,默认转义符是\,字段值以单引号包裹。 |
--optionally-enclosed-by | 给带有双引号或单引号的字段值前后加上指定字符。 |
2.3、公用参数:export
参数 | 说明 |
---|---|
--input-enclosed-by | 对字段值前后加上指定字符 |
--input-escaped-by | 对含有转移符的字段做转义处理 |
--input-fields-terminated-by | 字段之间的分隔符 |
--input-lines-terminated-by | 行之间的分隔符 |
--input-optionally-enclosed-by | 给带有双引号或单引号的字段前后加上指定字符 |
2.4、公用参数:hive
参数 | 说明 |
---|---|
--hive-delims-replacement | 用自定义的字符串替换掉数据中的\r\n和\013 \010等字符 |
--hive-drop-import-delims | 在导入数据到hive时,去掉数据中的\r\n\013\010这样的字符 |
--map-column-hive < map> | 生成hive表时,可以更改生成字段的数据类型 |
--hive-partition-key | 创建分区,后面直接跟分区名,分区字段的 |