如何处理hive中的数据倾斜
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理hive中的数据倾斜相关的知识,希望对你有一定的参考价值。
参考技术Ahive在shuffle的部分操作时,由于数据key的分化不均,造成有的节点数据很多,而有的节点数据很少。表现在实际应用上:
一句话,“不患多而患不均”。
当有以下操作时:
count distinct之所以执行缓慢,主要是因为在map阶段不会有combin操作。而是会把所有的数据sql都仍在1个reduce中。
例如:
可以将其改写为:
这样的话,就相当与先通过多个reduce进行去重,然后再放至单个reduce进行计数。
参数调节
其他
可以将倾斜的数据单独处理再union回来
大数据之Hive:hive的小文件如何处理
1.小文件如何产生的?
(1)动态分区插入数据,分区数太多,产生大量的小文件,导致map数量剧增;
(2)reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);
(3)数据源本身就包含大量的小文件。
2.小文件解决方案
(1)在Map执行前合并小文件,减少Map数:
CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
set hive.input.format=org.apache.hadoop.hive.al.io.CombineHiveInputFormat
(2)merge
输出合并小文件
SET hive.merge.mapfiles = true; # 默认true,在map-only任务结束时合并小文件
SET hive.merge.mapredfiles = true;#默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456; #默认256M
SET hive.merge.smallfiles.avgsize = 16777216; # 当输出文件的平均大小小于16m该值时,启动一个独立的map-reduce任务进行文件merge
(3)开启JVM重用
JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。
Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。默认值是1
<property>
<name>mapreduce.job.jvm.numtasks</name>
<value>10</value>
<description>How many tasks to run per jvm. If set to -1, there is no limit. </description>
</property>
这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。
以上是关于如何处理hive中的数据倾斜的主要内容,如果未能解决你的问题,请参考以下文章