使用import all tables优化从mysql到hive的sqoop数据导入

0tdrvxhp  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(510)

我正在使用sqoop1.4.6使用importall tables选项将数据从mysql导入hive。结果是可以的,但是导入过程本身相当慢。例如,其中一个数据库包含总共不到100万行的40-50个表,完成大约需要25-30分钟。经过调查,似乎大部分时间都花在为每个导入的表初始化配置单元上。在同一个数据库上测试纯mysqldump只需不到1分钟。所以问题是如何减少初始化时间,如果是这样的话,例如使用单个配置单元会话?
导入命令是:

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
配置单元版本:1.2.1000.2.5.3.0-37
可能与:
https://issues.apache.org/jira/browse/hive-10319

mfuanj7w

mfuanj7w1#

删除选项 --num-mappers 1 使用默认的4个Map器运行导入或将其更改为更高的数字 --num-mappers 8 (如果硬件允许)-这是对具有主键的表运行具有更多并行作业的导入,并使用 --autoreset-to-one-mapper 选项-对于没有主键的表,它将使用1个Map器。同时使用 --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参数的值。根据可用内存和带宽设置值。
将Map器内存从当前值增加到更高的值:示例: sqoop import-all-tables -D mapreduce.map.memory.mb=2048 -D mapreduce.map.java.opts=-Xmx1024m <sqoop options> sqoop性能调优最佳实践
在jdbc连接或sqoopMap中调优以下sqoop参数以优化性能
批量(出口)
拆分方式和边界查询(不需要,因为我们正在起诉 --autoreset-to-one-mapper ,不能与一起使用 import-all-tables )
直接
获取大小
数字Map器

相关问题