Hive学习路线-优化
  yXrgnj2AQg6w 2023年11月26日 102 0

十、优化

1. 数据倾斜

maptask和reducetask的个数

1.1 maptask的个数: 文件的大小、文件的个数、集群上blocksize的大小

问题:小文件过多的问题 ( maptask并不是越多越好 )

在map执行前进行合并,减少maptask的个数

//配置文件修改配置 <property> <name>hive.input.format</name> <value>org.apache.hadoop.hive.ql.io.CombineHiveInputFormat</value> </property> //命令行修改配置 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

问题:字段少,数据量,大小于128M的文件数据处理,造成一个maptask压力过大

添加maptask的个数( 127.999M<128M — maptask )

computeSpliteSize(){ 50 128 return Math.max( 0, Math.min(maxSize,blockSize)) } //命令行修改配置 set mapreduce.input.fileinputformat.split.maxsize=50 # 默认是256M 127.999 50 ----maptask 50 ----maptask 27.999 ----maptask

1.2 reducetask的个数,合理的设计

设置reduce的个数:

set mapreduce.job.reduces=10; # 一个job中的

reduce的个数决定的输出文件的个数,参考当前环境下的数据量和数据分布

2. JVM的重用(性能提升的力度很大50%)

在hadoop的配置文件mapred-site.xml,添加jvm配置:

mapreduce.job.jvm.numtasks

15

JVM的创建和启动会消耗大量的性能,不建议频繁的创建和启动

重用:一个jvm实例在同一个job作业中重用15次。

3.Fetch 抓取

Hive对某些操作不执行MapReduce计算

select * from user_tb; //查询语句没有必要去开启mr运算

配置文件:hive-site.xml <property> <name>hive.fetch.task.conversion</name> <value>more</value> <description> 0. none : 所有操作都执行mr 1. minimal : 全表查询,字段查询,limit,分区等操作 2. more : 查询和limit语句不走mr (不需要执行mr计算) </description> </property>

命令行修改:

set hive.fetch.task.conversion ; 查看默认值 set hive.fetch.task.conversion = more ; 查看默认值 select * from tbName;//不需要使用mr计算

4.本地模式

处理数据量非常小,hive可以在本地模式下的一台机器上处理当前job的所有的任务,减少执行时间。

开启本地模式:

//开启本地模式 <property> <name>hive.exec.mode.local.auto</name> <value>true</value> </property> //设置本地模式下能够处理的数据的数量规模 128M <property> <name>hive.exec.mode.local.auto.inputbytes.max</name> <value>134217728</value> </property> //设置本地模式下能够处理的数据的个数 <property> <name>hive.exec.mode.local.auto.input.files.max</name> <value>4</value> </property>

命令行:

set hive.exec.mode.local.auto=true|false;

5. 并发执行

Hive将命令划分成多个阶段执行,默认hive一次只执行一个阶段,减少执行时间

设置Hive的并发操作:

//是否并发的执行一个job作业 <property> <name>hive.exec.parallel</name> <value>false</value> </property> //一个job的并发度,默认 8 (此大小的设置和当前机器的硬件配置有关) <property> <name>hive.exec.parallel.thread.number</name> <value>8</value> </property>

命令行:

set hive.exec.parallel = true; //开启任务的并发执行 set hive.exec.parallel.thread.number = 10; //设置一个job的并发度

6.表的设计和查询优化

mapjoin:在map阶段进行数据的合并

默认情况下,join操作在reduce阶段完成。

开启Mapjoin: //开启mapjoin <property> <name>hive.auto.convert.join</name> <value>true</value> </property> //如果文件小于25M则是要被合并小表 <property> <name>hive.mapjoin.smalltable.filesize</name> <value>25000000</value> </property> set hive.auto.convert.join = true; set hive.mapjoin.smalltable.filesize = 20000000; 案例: order_tb join user_tb 总结:在map阶段进行合并操作,避免reduce数据的倾斜和压力 group by: map阶段切割的同一个key------------->一个reduce处理----------->outputFile (数据倾斜) 同一个key的数量级大 默认聚合操作在reduce端处理 在map阶段对key进行聚合操作 实现:在map端开启聚合操作 //开启map阶段聚合操作 <property> <name>hive.map.aggr</name> <value>true</value> </property> //map阶段能够聚合的数据量 <property> <name>hive.groupby.mapaggr.checkinterval</name> <value>100000</value> //十万条 </property> //如果存在数据倾斜,启动均衡负载 ,默认是关闭 <property> <name>hive.groupby.skewindata</name> <value>true</value> </property> 启动均衡负载原理: job-----添加一个新的MR JOB,在当前job的map中将处理结果 随机 交给reduce,避免数据发生倾斜 然后使用第二个MR JOB实现对结果数据的分组在合并。 总结:使用两个job,一个实现负载均衡,一个实现最终数据的聚合操作。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月26日 0

暂无评论

推荐阅读
yXrgnj2AQg6w