Hive on Spark参数调优姿势小结

Stella981
• 阅读 729

前言

Hive on Spark是指使用Spark替代传统MapReduce作为Hive的执行引擎,在HIVE-7292提出。Hive on Spark的效率比on MR要高不少,但是也需要合理调整参数才能最大化性能,本文简单列举一些调优项。为了符合实际情况,Spark也采用on YARN部署方式来说明。

Hive on Spark参数调优姿势小结

**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.joinhive.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.avgsizehive.merge.size.per.task都没有变化。

Hive on Spark参数调优姿势小结

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这