1.Sqoop介绍
概述
Hadoop的数据传输工具sqoop是Apache顶级项目,主要用来在Hadoop和关系数据库、数据仓库、NoSql系统中传递数据。通过sqoop,我们可以方便的将数据从关系数据库导入到HDFS、Hbase、Hive,或者将数据从HDFS导出到关系数据库。
sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。Sqoop集成了工作流程协调的Apache Oozie,定义安排和自动导入/导出任务。
sqoop主要通过JDBC和关系数据库进行交互。理论上支持JDBC的database都可以使用sqoop和hdfs进行数据交互。
但是,只有一小部分经过sqoop官方测试,如下:
Database | version | –direct support | connect string |
---|---|---|---|
HSQLDB | 1.8.0+ | No | jdbc:hsqldb:*// |
MySQL | 5.0+ | Yes | jdbc:mysql:// |
Oracle | 10.2.0+ | No | jdbc:oracle:*// |
PostgreSQL | 8.3+ | Yes | jdbc:postgresql:// |
较老的版本有可能也被支持,但未经过测试。 出于性能考虑,sqoop提供不同于JDBC的快速存取数据的机制,可以通过–direct使用。
sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过map任务来传输数据,map负责数据的加载、转换,存储到HDFS、Hbase或者Hive中。
Sqoop1架构
- 数据大概流程
- 1.读取要导入数据的表结构,生成运行类,默认是QueryResult,打成jar包,然后提交给Hadoop
- 2.设置好job,主要也就是设置好sqoop的各个参数
3.这里就由Hadoop来执行MapReduce来执行Import命令了,
1)首先要对数据进行切分,也就是DataSplit
DataDrivenDBInputFormat.getSplits(JobContext job)
2)切分好范围后,写入范围,以便读取
DataDrivenDBInputFormat.write(DataOutput output) 这里是lowerBoundQuery and upperBoundQuery
3)读取以上2)写入的范围
DataDrivenDBInputFormat.readFields(DataInput input)
4)然后创建RecordReader从数据库中读取数据
DataDrivenDBInputFormat.createRecordReader(InputSplit split,TaskAttemptContext context)
5)创建Map
TextImportMapper.setup(Context context)
6)RecordReader一行一行从关系型数据库中读取数据,设置好Map的Key和Value,交给Map
DBRecordReader.nextKeyValue()
7)运行map
TextImportMapper.map(LongWritable key, SqoopRecord val, Context context)
最后生成的Key是行数据,由QueryResult生成,Value是NullWritable.get()
数据导入图例
数据导出图例
2.Sqoop安装
参考:
http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.5-cdh5.3.6/SqoopUserGuide.html
https://cwiki.apache.org/confluence/display/SQOOP/Home
Sqoop安装步骤
1 下载
2 解压
3 copy mysql的驱动类到lib文件夹中
cp ~/bigdater/hive-0.13.1-cdh5.3.6/lib/mysql-connector-java-5.1.31.jar ./lib/ 或者 cp ~/bigdater/softs/mysql-connector-java-5.1.31.jar ./lib/
4 copy hadoop的hadoop-common-2.5.0-cdh5.3.6.jar hadoop-hdfs-2.5.0-cdh5.3.6.jar hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar三个jar到lib文件夹中。
cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/hadoop-common-2.5.0-cdh5.3.6.jar ./lib/ cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/hdfs/hadoop-hdfs-2.5.0-cdh5.3.6.jar ./lib/ cp ~/bigdater/hadoop-2.5.0-cdh5.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar ./lib/
5 配置sqoop-env.sh文件内容,
vim conf/sqoop-env.sh 内容如下: export HADOOP_COMMON_HOME=/home/hadoop/bigdater/hadoop-2.5.0-cdh5.3.6 export HADOOP_MAPRED_HOME=/home/hadoop/bigdater/hadoop-2.5.0-cdh5.3.6 export HBASE_HOME=/home/hadoop/bigdater/hbase-0.98.6-cdh5.3.6 export HIVE_HOME=/home/hadoop/bigdater/hive-0.13.1-cdh5.3.6
6 添加sqoop常量导用户环境变量中去
vim ~/.bash_profile 在最后添加内容(如下): \###### sqoop export SQOOP_HOME=/home/hadoop/bigdater/sqoop-1.4.5-cdh5.3.6 export PATH=$PATH:$SQOOP_HOME/bin 退出保存后执行命令source ~/.bash_profile
7 测试是否安装成功
sqoop version
3.Sqoop工具import和export使用详解
Sqoop可以在HDFS/Hive/Hbase和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。
这两个工具非常强大,提供了很多选项帮助我们完成数据的迁移和同步。比如,下面两个潜在的需求:业务数据存放在关系数据库中,数据量达到一定规模后需要对其进行分析或同统计,单纯使用关系数据库可能会成为瓶颈,这时可以将数据从业务数据库数据导入(import)到Hadoop平台进行离线分析。
对大规模的数据在Hadoop平台上进行分析以后,可能需要将结果同步到关系数据库中作为业务的辅助数据,这时候需要将Hadoop平台分析后的数据导出(export)到关系数据库。
这里,我们介绍Sqoop完成上述基本应用场景所使用的import和export工具,通过一些简单的例子来说明这两个工具是如何做到的
- 1.工具通用选项
import和export工具有些通用的选项,如下表所示:
选项 含义说明
选项 | 含义说明 |
---|---|
–connect | 指定JDBC连接字符串 |
–connection-manager | 指定要使用的连接管理器类 |
–driver | 指定要使用的JDBC驱动类 |
–hadoop-mapred-home
| 指定$HADOOP_MAPRED_HOME路径 |
–help
| 打印用法帮助信息 |
–password-file
| 设置用于存放认证的密码信息文件的路径 |
-P
| 从控制台读取输入的密码 |
–password
| 设置认证密码 |
–username
| 设置认证用户名 |
–verbose
| 打印详细的运行信息 |
–connection-param-file
| 可选,指定存储数据库连接参数的属性文件 |
- 2.数据导入工具import
import工具,是将HDFS平台外部的结构化存储系统中的数据导入到Hadoop平台,便于后续分析。我们先看一下import工具的基本选项及其含义,如下表所示:
选项 含义说明
选项 | 含义说明 |
---|---|
–append | 将数据追加到HDFS上一个已存在的数据集上 |
–as-avrodatafile | 将数据导入到Avro数据文件 |
–as-sequencefile | 将数据导入到SequenceFile |
–as-textfile
| 将数据导入到普通文本文件(默认) |
–boundary-query | 边界查询,用于创建分片(InputSplit) |
–columns |
4.Sqoop命令案例介绍
- 1、import案列
案例1:将mysql表test中的数据导入hive的hivetest表,hive的hivetest表不存在。
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –hive-table hivetest –hive-import -m 1
案例2:在案例1的基础上,分别进行overwrite(覆盖)导入和into(直接加入)导入。
into: 命令同案例1
overwrite:
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –hive-table hivetest –hive-import -m 1 –hive-overwrite
案例3:在案例2的基础上,通过增加mysql的test表数据,增量导入到hive表中。
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –where “id>9” –hive-table hivetest –hive-import -m 1
或者
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –query “select id,name from test where id>9” –hive-table hivetest –hive-import -m 1
案例4:将test表中的数据导出到使用’,’分割字段的hive表(hivetest2)中。
创建表: create table hivetest2(id int,name string) row format delimited fields terminated by ‘,’;
sqoop:
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –hive-table hivetest2 –hive-import -m 1 –fields-terminated-by “,”
案例5:将test表的数据导入到hdfs中。
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –target-dir /test -m 1
案例6:在案例5的基础上,增量导入数据到hdfs中。
sqoop import –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test –target-dir /test -m 1 –check-column id –incremental append –last-value 11
- 2、export案列
案例1:将hdfs上的文件导出到关系型数据库test2表中。
sqoop export –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test2 –export-dir /test
- 案例2:将hive表(hivetest)数据导出到关系型数据库test2表中(使用insertOrUpdate方法导入)。
hivetest表只留id为1,2,3,4,5的数据,其他数据删除。
hivetest表分隔方式是’\u0001’,但是export命令默认使用’,’分隔数据
sqoop export –connect jdbc:mysql://hh:3306/test –username hive –password hive –table test2 –export-dir /hive/hivetest –input-fields-terminated-by “\01” –update-mode allowinsert –update-key id
- 3、Phoenix导入案列
案列1:
目标 | 将mysql中的TC_order表导入到Phoenix中 |
前提 | phoenix的phoenix表必须存在 |
命令 | sqoop import -D sqoop.hbase.insert.put.transformer.class= com.easypec.hbase.ToBytesPutTransformer -libjars /opt/shell_script/phoenix-core-4.6.0-HBase-1.0.jar, /opt/shell_script/sqoop-hbase-custom.jar –connect dbc:mysql://10.248.248.103:3306/tc?tinyInt1isBit=false –username tc_ro –password q1w2_e3r4 –table tc_order –num-mappers 15 –hbase-table TC.TC_ORDER –hbase-row-key orderId,purchaseCompanyId –column-family 0 –hbase-bulkload |
说明 | -D sqoop.hbase.insert.put.transformer.class 指定Hbase Put转换类. -libjars 添加Phoenix jar包, 以及自定义jar包. –hbase-bulkload 批量导入, 当数据量过大的时候, 建议使用该参数 |