关于hive:hive-on-spark参数调整

Hive on Spark是指应用Spark代替传统MapReduce作为Hive的执行引擎,在HIVE-7292提出。Hive on Spark的效率比on MR要高不少,然而也须要正当调整参数能力最大化性能,本文简略列举一些调优项。为了符合实际状况,Spark也采纳on YARN部署形式来阐明。

Driver参数

spark.driver.cores

该参数示意每个Executor可利用的CPU外围数。其值不宜设定过大,因为Hive的底层以HDFS存储,而HDFS有时对高并发写入解决不太好,容易造成race condition。依据咱们的实际,设定在3~6之间比拟正当。

假如咱们应用的服务器单节点有32个CPU外围可供使用。思考到零碎根底服务和HDFS等组件的余量,个别会将YARN NodeManager的​​yarn.nodemanager.resource.cpu-vcores​​​参数设为28,也就是YARN可能利用其中的28核,此时将​​spark.executor.cores​​​设为4最合适,最多能够正好调配给7个Executor而不造成节约。又假如​​yarn.nodemanager.resource.cpu-vcores​​​为26,那么将​​spark.executor.cores​​设为5最合适,只会残余1个核。

因为一个Executor须要一个YARN Container来运行,所以还需保障​​spark.executor.cores​​​的值不能大于单个Container能申请到的最大外围数,即​​yarn.scheduler.maximum-allocation-vcores​​的值。

 

spark.executor.memory/spark.yarn.executor.memoryOverhead

这两个参数别离示意每个Executor可利用的堆内内存量和堆外内存量。堆内内存越大,Executor就能缓存更多的数据,在做诸如map join之类的操作时就会更快,但同时也会使得GC变得更麻烦。Hive官网提供了一个计算Executor总内存量的教训公式,如下:

​​yarn.nodemanager.resource.memory-mb * (spark.executor.cores / yarn.nodemanager.resource.cpu-vcores)​​

其实就是按外围数的比例调配。在计算出来的总内存量中,80%~85%划分给堆内内存,残余的划分给堆外内存。

 

假如集群中单节点有128G物理内存,​​yarn.nodemanager.resource.memory-mb​​​(即单个NodeManager可能利用的主机内存量)设为120G,那么总内存量就是:120 1024 (4 / 28) ≈ 17554MB。再按8:2比例划分的话,最终​​spark.executor.memory​​​设为约13166MB,​​spark.yarn.executor.memoryOverhead​​设为约4389MB。大数据培训

 

与上一节同理,这两个内存参数相加的总量也不能超过单个Container最多能申请到的内存量,即​​yarn.scheduler.maximum-allocation-mb​​。

spark.executor.instances

该参数示意执行查问时一共启动多少个Executor实例,这取决于每个节点的资源分配状况以及集群的节点数。若咱们一共有10台32C/128G的节点,并依照上述配置(即每个节点承载7个Executor),那么实践上讲咱们能够将​​spark.executor.instances​​设为70,以使集群资源最大化利用。然而实际上个别都会适当设小一些(举荐是理论值的一半左右),因为Driver也要占用资源,并且一个YARN集群往往还要承载除了Hive on Spark之外的其余业务。

spark.dynamicAllocation.enabled

下面所说的固定调配Executor数量的形式可能不太灵便,尤其是在Hive集群面向很多用户提供剖析服务的状况下。所以更举荐将​​spark.dynamicAllocation.enabled​​参数设为true,以启用Executor动态分配。

Driver参数
spark.driver.cores

该参数示意每个Driver可利用的CPU外围数。绝大多数状况下设为1都够用。

spark.driver.memory/spark.driver.memoryOverhead

这两个参数别离示意每个Driver可利用的堆内内存量和堆外内存量。依据资源充裕水平和作业的大小,个别是将总量管制在512MB~4GB之间,并且沿用Executor内存的“二八调配形式”。例如,​​spark.driver.memory​​​能够设为约819MB,​​spark.driver.memoryOverhead​​设为约205MB,加起来正好1G。

Hive参数
绝大部分Hive参数的含意和调优办法都与on MR时雷同,但仍有两个须要留神。 

hive.auto.convert.join.noconditionaltask.size

咱们晓得,当Hive中做join操作的表有一方是小表时,如果​​hive.auto.convert.join​​​和​​hive.auto.convert.join.noconditionaltask​​​开关都为true(默认即如此),就会主动转换成比拟高效的map-side join。而​​hive.auto.convert.join.noconditionaltask.size​​这个参数就是map join转化的阈值,在Hive on MR下默认为10MB。

然而Hive on MR下统计表的大小时,应用的是数据在磁盘上存储的近似大小,而Hive on Spark下则改用在内存中存储的近似大小。因为HDFS上的数据很有可能被压缩或序列化,使得大小减小,所以由MR迁徙到Spark时要适当调高这个参数,以保障map join失常转换。个别会设为100~200MB左右,如果内存富余,能够更大点。

hive.merge.sparkfiles

小文件是HDFS的天敌,所以Hive原生提供了合并小文件的选项,在on  MR时是​​hive.merge.mapredfiles​​​,然而on Spark时会改成​​hive.merge.sparkfiles​​​,留神要把这个参数设为true。至于小文件合并的阈值参数,即​​hive.merge.smallfiles.avgsize​​​与​​hive.merge.size.per.task​​都没有变动。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理