使用Sqoop将Oracle数据导入hdfs遇到的问题

案例介绍:原数据表存在Oracle数据库中,表数据量上亿条,业务需求将该数据库中表导入令一台数据库(oracle)表中,原实现采用dblink,但是数据量过大,导致数据传送过慢,甚至是失败。

解决方法:使用Sqoop工具将表中数据先抽取到hdfs上,然后再经hdfs抽取到目标数据库。

实际操作过程中遇到的问题:

1.Sqoop import 当使用多线程(多map)时,需要提供索引列,因为sqoop 会根据索引列来进行线程分布。Sqoop会查询min(索引列)和max(索引列),分别使用min,max来作为数据边界。但是当在oracle使用select min(x),max(x) from table; 语句时,会遇到查询瓶颈。当数据量一定大时,该sql语句执行效率非常低下。这时候只能自定义边界查询语句。将以上语句修改为复合语句查询

select  a.x,b.x from   (

select min(x) , 1 as key from table

) a left join (

select max(x), 1 as key from table

) b on a.key = b.key

这里需要使用sqoop import 中的boundary-query参数,来执行边界的自定义语句。

2.split-by 字段数据偏移问题。当sqoop import中split-by参数设置的索引列并不是均匀分布时,会导致map线程的数据分布偏移,偏移大的情况下会导致map线程卡死。如果表中不存在可以均匀分布的列,那么就得使用oraoop插件,该插件在sqoop1.4.5版本后已经集成,该oraoop插件可以采用rowid模式来import。避免了数据偏移的问题。

使用Sqoop将Oracle数据导入hdfs遇到的问题
滚动到顶部