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都没有变动。