我正在使用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
可能与:
有关答案 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
)