Sqoop 实际应用及自定query导出
前置条件
已经成功安装配置Hadoop以及Sqoop和Mysql数据库服务器,如果将数据导入或从Hbase导出,还应该已经成功安装配置Hbase。
示例如何将Oracle中的数据导出到Hdfs中,query参数中为导出的查询sql,如查询语句中有where 条件则最后追加 and \$CONDITIONS
nohup /home/hadoop/sqoop/bin/sqoop import
--connect jdbc:oracle:thin:@192.168.10.33:1521:orcl
--username runvista
--password runco
--fields-terminated-by '\0001'
-m 6
--split-by idnum
--target-dir airport
--delete-target-dir
--compress
--as-textfile
--query "select replace(a.mac,':',''),
a.idtype,
a.idnum,
trunc(to_number(a.visittime-to_date('1970-01-01 8:0:0','yyyy-MM-DD HH24:MI:SS'))*24*60*60) visittime,
trunc(to_number(a.createtime-to_date('1970-01-01 8:0:0','yyyy-MM-DD HH24:MI:SS'))*24*60*60),
trunc(to_number(a.offtime-to_date('1970-01-01 8:0:0','yyyy-MM-DD HH24:MI:SS'))*24*60*60),
d.placeaddress
from airportdata a
left join dic d
on a.remoteip = d.placeip
where a.remoteip is not null and length(a.mac)>10 and \$CONDITIONS " & > /dev/null
/*
*导出hdfs上的数据
*/
hadoop fs -copyToLocal /user/hadoop/airport/* /tmp/
/*
*解压导出的数据
*/
gunzip /tmp/airport/*.gz
Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中(由此也可知,导入导出的事务是以Mapper任务为单位)。同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。
参数解释
数据导入工具import
import工具,是将HDFS平台外部的结构化存储系统中的数据导入到Hadoop平台,便于后续分析。我们先看一下import工具的基本选项及其含义,如下表所示:
表格
Markdown Extra 表格语法:
选项 | 含义说明 |
---|---|
–append | 将数据追加到HDFS上一个已存在的数据集上 |
–as-avrodatafile | 将数据导入到Avro数据文件 |
–as-sequencefile | 将数据导入到SequenceFile |
–as-textfile | 将数据导入到普通文本文件(默认) |
–boundary-query | 边界查询,用于创建分片(InputSplit) |
–columns | 从表中导出指定的一组列的数据 |
–delete-target-dir | 如果指定目录存在,则先删除掉 |
–direct | 使用直接导入模式(优化导入速度) |
–direct-split-size | 分割输入stream的字节大小(在直接导入模式下) |
–fetch-size | 从数据库中批量读取记录数 |
–inline-lob-limit | 设置内联的LOB对象的大小 |
-m,–num-mappers | 使用n个map任务并行导入数据 |
-e,–query | 导入的查询语句 |
–split-by | 指定按照哪个列去分割数据 |
–table | 导入的源表表名 |
–target-dir | 导入HDFS的目标路径 |
–warehouse-dir | HDFS存放表的根路径 |
–where | 指定导出时所使用的查询条件 |
-z,–compress | 启用压缩 |
–compression-codec | 指定Hadoop的codec方式(默认gzip) |
–null-string | 果指定列为字符串类型,使用指定字符串替换值为null的该类列的值 |
–null-non-string | 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值 |
数据导出工具export
export工具,是将HDFS平台的数据,导出到外部的结构化存储系统中,可能会为一些应用系统提供数据支持。我们看一下export工具的基本选项及其含义,如下表所示:
选项 | 含义说明 |
---|---|
–validate | 启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现类 |
–validation-threshold | 指定验证门限所使用的类 |
–direct | 使用直接导出模式(优化速度) |
–export-dir | 导出过程中HDFS源路径 |
-m,–num-mappers | 使用n个map任务并行导出 |
–table | 导出的目的表名称 |
–call | 导出数据调用的指定存储过程名 |
–update-key | 更新参考的列名称,多个列名使用逗号分隔 |
–update-mode | 指定更新策略,包括:updateonly(默认)、allowinsert |
–input-null-string | 使用指定字符串,替换字符串类型值为null的列 |
–input-null-non-string | 使用指定字符串,替换非字符串类型值为null的列 |
–staging-table | 在数据导出到数据库之前,数据临时存放的表名称 |
–clear-staging-table | 清除工作区中临时存放的数据 |
–batch | 使用批量模式导出 |