Hive参数深入浅出
一. Hive参数介绍
-
特别说明
-
关于MapJoin的问题剖析
-
概念说明
-
将join的本来应该是reduce进行关联查找的过程,改成由纯map端进行关联查找。
-
-
特点特征
-
减少了reduce的处理,全部放到map端进行操作。
-
减少了数据移动,提升了IO和计算效率。
-
-
应用场景
-
大表join小表的时候,
-
大数据块join小数据块的时候。
-
-
代码实现
-
在hive当中已经默认开启了该功能。
-
-
-
关于数据倾斜的问题剖析
-
概念说明
-
在大数据处理环境下,数据处理过程出现明显的倾斜现象,导致任务整体迟迟不能完全结束。
-
-
特点特征
-
在作业或是任务在分布式执行时,经常出现大部分Task任务很快结速,而很少一部分Task,往往是1个或是1-2个一直卡在99%的情况下。
-
典型的木桶原理,任务的执行完成时间,取决于最后一个Task的完成时间。
-
-
应用场景
-
假倾斜场景
-
实际数据并没有倾斜,而是由于人为代码原因导致的倾斜。
-
比如:
-
数据格式设置不对,导致没有发挥分布式处理的优势
-
:比如说设置成gzip,snappy。
-
-
SQL编写不合理-计算用户uv数
-
如:select count(distinct uid) from visted_log;
-
改成:
-
select count(1) from (select 1 from user group by uid) temp;
-
-
-
-
代码优化就可以了
-
-
真倾斜场景
-
即数据或是任务本身真的存在客观的倾斜性
-
比如:VIP会员数据的倒卖倒买问题,导致极少数VIP帐号对应的数据量极多,而正常帐号较少。
-
解决方法:只能分而治之,将倾斜的数据分类,将正常数据分类,然后进行分别计算。
-
-
比如:硬件机器本身配置不均衡导致的计算能力倾斜问题。
-
解决方法:
-
第1种是硬性解决即让硬件更加均衡。
-
第2种是通过NodeLabel方式。
-
-
-
-
-
-
代码实现
-
参考如上的解决方法即可。
-
-
-
关于二次排序的问题剖析
-
概念说明
-
在map到reduce的处理过程当中,按照2个字段进行升序排列,而不是像默认的一次排序那样,只按照key一个字段排序。
-
-
特点特征
-
2个字段排序,第1个字段若有比较结果则按第1个字段排序,若相等,则按第2个字段升序排列。
-
-
应用场景
-
当单个字段不能够满足排序要求时,均可使用二次排序。
-
-
代码实现
-
Hadoopcore之mapreduce实现
-
重写Map和Reduce之前的输入输出的Key和Value。
-
-
HiveSQL实现
-
Select * from table order by c1,c2 asc
-
-
-
-
二. Hive参数使用方式
四种使用方式:
-
通过配置文件设置
此种主要是设置系统配置文件,多是全局性质的。在安装完hive后基本不需要再改动。主要是修改hive-site.xml或是hive-default.xml文件。
-
通过在进入hive cli时指定配置参数
模板:hive --hiveconf param=value来设定session级参数
如:hive --hiveconf tez.queue.name=oncourse
-
在进入hive cli后,通过set来设定也是session级参数,此种最为常见
如之前提到的set tez.queue.name=oncourse;
-
通过shell脚本调用hive -e做参数设置和脚本执行,生产环境采用最多.
详细步骤:
-
创建一个shell文件,名为hive_shell.sh:touch hive_shell.sh
-
编辑文件,加入以下脚本:
#!/bin/sh
db="job017"
table_name="practice_set "
hive -e "
use $db;
set tez.queue.name=oncourse;
select count(1) from $table_name;
"
-
执行脚本
sh hive_shell.sh
-
输出效果
-
执行过程与结果
-
-
参数生效-队列
三. Hive参数实际应用
-
升级到Tez/Spark引擎后一般均采用集群平台参数值即可,应用开发层设置参数的场景很少,只有极个别情况情下的jvm的内存相关参数设置需要特别设置,待后续高资源需求量时再另行使用。