目前有5000个mysql的数据库,每个库中有10个表,每个mysql的10个表的对应的表结构都是一致的。10个表,其中有两个表数据量较大,有几十、上百万的数据。
当前需要把mysql中的数据导入hive,并做定时任务的增量更新。
我使用sqoop命令将数据导入mysql,但是执行效率很慢,一晚上执行了200+个库。
当前分析影响效率原因:
1.每个库的每个表的数据同步,执行一个sqoop命令。也就是说执行一轮至少执行5000*10=50000次的sqoop的命令。而不管数据量多大,执行sqoop的每次耗时,至少有个30秒+。
2.使用多个shell脚本执行sqoop,分别执行不同表的同步操作。但是发现不同的sh在执行过程中,hive的sql转换为mapreduce时,在同一时间内,执行执行一个mapreduce。类似下方的日志信息。
2015-09-21 09:48:46,311 Stage-1 map = 0%, reduce = 0%
2015-09-21 09:48:57,628 Stage-1 map = 1%, reduce = 0%, Cumulative CPU 7.01 sec
2015-09-21 09:49:01,272 Stage-1 map = 14%, reduce = 0%, Cumulative CPU 15.17 sec
2015-09-21 09:49:05,257 Stage-1 map = 30%, reduce = 0%, Cumulative CPU 18.77 sec
2015-09-21 09:49:12,676 Stage-1 map = 32%, reduce = 0%, Cumulative CPU 31.75 sec
想根据以上两点进行优化,第1点通过每次执行增加为每次执行10个数据库的sql进行union all,应该会加快效率。但是第二点,增加hive的并发执行效率(当前好像不能并发),还不知道怎么优化,请大神们指点一下,或者有其他的提高效率的方法,请赐教!
|
|