使用sqoop工具进行oracle、mysql 数据导入

使用sqoop工具进行oracle、mysql 数据导入

不管你是mysql 库也好还是 oracle 库 首先我们都要去下载jar 包放 到 sqoop 的lib 目录下
mysql-connector-java-5.1.26-bin.jar
ojdbc6.jar
至于下载地址 自己百度一下吧

1.导入数据到 HDFS 中
sqoop import –append –connect jdbc:oracle:thin:@服务器IP:1521:数据库名–username 用户名 –password 密码 –target-dir HDFS上存放的路径 –num-mappers 1 –table 来源表名称 –columns 表字段,表字段 –fields-terminated-by ‘\t’

说明:
–append 导入模式为追加
–connect 链接数据库 方式为jdbc:oracle mysql为jdbc:mysql
–target-dir 存放在HDFS 上的路径
–fields-terminated-by 字段间的分隔符

2.导入到hive 中同时增量导入

假设在本地假设了Mysql服务器,我们需要每天从main数据库中导入visit_log表,表结构是 id, url, time。
首先指定sqoop中源参数:
–connect jdbc:mysql://localhost:3306/main
–username root
–password pass
–table user
–columns “id,url,time”
–direct

我们需要将数据表导入hive中,所以在hive中建立新表

create table hive_visit_log ( id int, url string, time string);

然后指定sqoop中关于目标数据源的参数:

–hive-import
–hive-table hive_visit_log
最后指定增量的参数:

–incremental append
–check-column id
–last-value 0
这样,sqoop会从visit_log中id比0大的id开始导入,实现了增量导入。可以采用非增量导入,但是sqoop似乎会在warehouse-dir目录下建立一个源表名的目录,如果有此目录存在会报错,所以建议采用增量导入。

* 如果导入时候需要采用分区,可以用–where控制条件配合–hive-partition-key dt –hive-partition-value ‘2011-03-21′ 参数

还有一个问题,每天导入时候的last value值不一样,如何做到每天动态的读取新的last value呢?这点sqoop也想到了,在技术指南中,sqoop支持把一条sqoop命令变为一个job,sqoop会通过job结果自动的更换last value的值。将sqoop命令建立为job的命令很简单,在原来命令基础上将import 替换为job –create — import就可以命名一个job_name的任务。执行任务是直接用 sqoop job –exec

最后我们得到的sqoop命令是:

sqoop job visit_import –create — import –connect jdbc:mysql://localhost:3306/main –username root –password pass –table user –columns “id,url,time” –direct –hive-import –hive-table hive_visit_log –incremental append –check-column id –last-value 0

sqoop job –exec visit_import