使用import-all-tables优化从MySQL到Hive的Sqoop数据导入

时间:2017-02-15 12:52:49

标签: mysql hadoop hive sqoop

我正在使用Sqoop 1.4.6使用 import-all-tables 选项将数据从MySQL导入Hive。结果还可以,但导入过程本身很慢。例如,其中一个数据库包含40-50个表,总计不到100万行,并且需要 25-30分钟才能完成。经过调查,似乎大部分时间花在为每个导入的表初始化Hive上。在同一数据库上测试一个普通的mysqldump在 1分钟内完成。所以问题是如何减少这个初始化时间,如果是这种情况,例如使用单个Hive会话?

导入命令是:

sqoop import-all-tables -Dorg.apache.sqoop.splitter.allow_text_splitter=true --compress --compression-codec=snappy --num-mappers 1 --connect "jdbc:mysql://..." --username ... --password ... --null-string '\\N' --null-non-string '\\N' --hive-drop-import-delims --hive-import --hive-overwrite --hive-database ... --as-textfile --exclude-tables ... --warehouse-dir=...

更新

Sqoop版本:1.4.6.2.5.3.0-37

Hive版本:1.2.1000.2.5.3.0-37

可能与:

有关

https://issues.apache.org/jira/browse/HIVE-10319

1 个答案:

答案 0 :(得分:1)

删除选项--num-mappers 1以使用默认的4位映射器运行导入 将其更改为更高的数字--num-mappers 8(如果硬件允许) - 这是为具有主键的表格运行带有更多parellel作业的导入, AND 使用--autoreset-to-one-mapper选项 - 对于没有主键的表,它将使用1个映射器。还可以使用--direct模式:

sqoop import-all-tables \
--connect "jdbc:mysql://..." --username ... \
--password ... \
-Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--compress --compression-codec=snappy \
--num-mappers 8 \
--autoreset-to-one \ 
--direct \
--null-string '\\N' 
...

告诉我们这是否会改善效果......

<强> 更新

  

--fetch-size=<n> - 其中表示条目数   Sqoop必须一次取。默认值为1000。

     

根据音量增加fetch-size参数的值   需要阅读的数据。根据可用内存设置值   和带宽。

  

将映射器内存从当前值增加到更高的数字:   例如:sqoop import-all-tables -D mapreduce.map.memory.mb=2048 -D mapreduce.map.java.opts=-Xmx1024m <sqoop options>

<强> Sqoop Performance Tuning Best Practices

在JDBC连接或Sqoop映射中调整以下Sqoop参数以优化性能

  • 批次(用于出口)
  • 拆分和边界查询(因为我们不需要) 起诉--autoreset-to-one-mapper,不能与import-all-tables
  • 一起使用
  • 直接
  • fetch-size
  • NUM-映射器