Hive优化
- MapJoin
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成Join,容易发生数据倾斜,可以用MapReduce把小表全部加载到内存,在map端进行join,避免reduce处理 - 行列过滤
列处理:在select中,只拿需要的列,如果有,尽量使用分区过滤,少用select *
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在where后面,那么就会先全表关联,之后再过滤 - 采用分桶技术
- 采用分区技术
- 设置合理的Map数
(1)通常情况下,作业会通过input的目录产生一个或多个map任务
主要的决定因素有:input的文件总个数,input的文件大小,集群设置的文件快大小
(2)是不是map数越多越好?
不是。如果一个任务有很多小文件(远远小于块大小128MB),则每个小文件也会被当作一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费,而且,同时可执行的map数是有限的。
(3)是不是保证每个map处理接近128MB的文件块,就可以放心了?
不一定。比如有一个127MB的文件,正常会用一个map取完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。
问题2、3的解决方法:减少map数和增加map数 - 小文件进行合并
在map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并的功能。 - 合理设置Reduce数
Reduce个数是不是越多越好?
(1)过多的启动和初始化Reduce也会消耗时间和资源
(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一任务的输入,则也会出现小文件过多的问题。
设置Reduce个数的原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适。 - 常用参数
//输出合并小文件
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; //当输出文件的平均大小小于该值时,
//启动一个独立的map-reduce任务进行文件merge
9.Hive推测执行
759

被折叠的 条评论
为什么被折叠?



