失效链接处理 |
hive优化建议 PDF 下载
本站整理下载:
相关截图:
主要内容:
慎用count(distinct( columnA ))
在大数据场景下不怕数据量大,怕的是数据倾斜,在数据量较大的情况下不要使用count(distinct ( columnA )),这个函数极易触发数据倾斜问题,要用group代替。
Map阶段优化
一、减少map数:
是为了避免小文件过多造成启动很多map任务,浪费集群资源,影响其他job的正常运行。对于总运行时间的减少大部分是节省在map任务的启停与排队等待资源上。注意:对于我们集群上大部分作业来说减少map数更好一些
set mapred.max.split.size= 268435456;
set mapred.min.split.size.per.node= 134217728;
set mapred.min.split.size.per.rack= 134217728;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
参数解释:
268435456 Bytes = 256MB
134217728 Bytes = 128MB
mapred.max.split.size:每个Map最大输入大小
mapred.min.split.size.per.node:一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
mapred.min.split.size.per.rack:一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat:执行Map前进行小文件合并
前三个参数用于确定map任务切割大小。注:集群hdfs的block块大小为128MB。
第四个参数表示在任务执行前进行小文件合并。
在hive sql加上这4个参数后表示:
1、大于256MB的文件,按照256MB分割输入文件
2、小于256MB但大于128MB的文件,按照128MB分割
3、小于128MB的文件(包括小文件和大文件切割后剩下的),进行合并
注意:要结合实际情况进行着三个参数的设置,找到最合适的设置。
未加参数:
加参数之后:
set mapred.max.split.size= 268435456;
set mapred.min.split.size.per.node= 134217728;
set mapred.min.split.size.per.rack= 134217728;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
测试结论:
可以看到在stage-6阶段相比之下减少了10个map,stage18阶段减少了2个map,stage2阶段减少了14个map,总运行时间减少了89秒,资源占用总共减少了26个map任务,如果是在资源池繁忙的时候,总运行时间会减少的更多。
二、增加map数:
当input的文件都很大,任务逻辑复杂(用到了很多sum\case when等),map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
参数依然是上面四个,值调整如下:
set mapred.max.split.size= 67108864;
set mapred.min.split.size.per.node= 67108864;
set mapred.min.split.size.per.rack= 67108864;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
未加参数:
加参数之后:
注意:看上去,貌似这两种配置有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这正是需要重点关注的地方:使单个map任务处理合适的数据量
Join优化(通用)
1、首先明确一点,对于数据量大的表,不要全表join,只join自己需要的数据即可。
2、对要join表的连接字段进行null值处理,可以用函数过滤null,也可以用where条件
3、在对要join的表进行数据过滤时,要把过滤条件写在子句里面
4、保持连接字段类型一致,若不一致会发生数据倾斜,所有数据会集中到1个reduce中处理。不一致的话可以在join时用cast转换一下类型: Select column1 from tableA left join tableB on tableA.id = cast(tableB.id as string);
|