2017-02-15 77 views
1

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

蜂巢版本:1.2.1000.2.5.3.0 -37

可能涉及到:

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

回答

1

remove选项--num-mappers 1与默认运行进口4名映射器OR将其更改为一些较大的数字--num-mappers 8(如果硬件允许) - 这是一种用于具有主键的表上运行更多的中并行作业进口,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
  • 直接
  • 取尺寸
  • NUM映射器
+0

它l使用ooks like I can not use'--direct' with'--hive-drop-import-delims',但会尝试你的其他建议,然后找回... –

+0

几乎相同的结果;每个数据库大约25分钟。我也试着用总行数不同的数据库,但数据量大致相同,所花费的总时间相当接近。似乎每个表有一些不变的时间,这与其中的数据量无关。 –

+0

您可以尝试将mapper内存从当前值增加到更高的数字吗?:'sqoop import-all-tables -D mapreduce.map.memory.mb = 2048 -D mapreduce.map.java.opts = -Xmx1024m ' –

相关问题