hive 数据倾斜解决办法
从 map 的数量角度
1)通常情况下,作业会通过 input 的目录产生一个或者多个 map 任务。
复制代码
2)举例:
复制代码
复制代码
3)是不是 map 数越多越好?
复制代码
4)是不是保证每个 map 处理接近 128m 的文件块,就高枕无忧了?
复制代码
复制代码
2 小文件的合并
在 map 执行前合并小文件,减少 map 数:
1) 参数设置(下面的 API 属于 hadoop 低版本的 API)
复制代码
3 如何适当的增加 map 数
当 input 的文件都很大,任务逻辑复杂,map 执行非常慢的时候,可以考虑增加 Map 数,来使得每个 map 处理的数据量减少,从而提高任务的执行效率。
假设有这样一个任务:
复制代码
如果表 a 只有一个文件,大小为 120M,但包含几千万的记录,如果用 1 个 map 去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个 map 任务去完成。
复制代码
复制代码
这样会将 a 表的记录,随机的分散到包含 10 个文件的 a_1 表中,再用 a_1 代替上面 sql 中的 a 表,则会用 10 个 map 任务去完成。
每个 map 任务处理大于 12M(几百万记录)的数据,效率肯定会好很多。
看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方,根据实际情况,控制 map 数量需要遵循两个原则:使大数据量利用合适的 map 数;使单个 map 任务处理合适的数据量;
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/f2c63b1632033a22f4d427a8f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论