前言

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.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参数,毫不夸张的说,使其性能达到最大化!相关推荐

  1. Spark性能调优系列:Spark参数配置大全(官网资料)

    Spark参数配置大全 Spark提供了三个位置来配置系统 Spark属性控制大多数应用程序参数,可以使用SparkConf对象或Java系统属性来设置. 通过conf/spark-env.sh每个节 ...

  2. Spark参数调优基础版

    Spark调优部分参数 可以在创建SparkSession对象时提供config(key,value)的方式进行赋值 1.shuffle相关调优参数 spark.shuffe.file.buffer ...

  3. hive优化之参数调优

    hive优化之参数调优 1.hive参数优化之默认启用本地模式 启动hive本地模式参数,一般建议将其设置为true,即时刻启用: hive (chavin)> set hive.exec.mo ...

  4. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

  5. Spark商业案例与性能调优实战100课》第20课:大数据性能调优的本质和Spark性能调优要点分析

    Spark商业案例与性能调优实战100课>第20课:大数据性能调优的本质和Spark性能调优要点分析 基于本元想办法,大智若愚,大巧若拙!深入彻底的学习spark技术内核!

  6. 关于hive on spark的distribute by和group by使用以及小文件合并问题

    欢迎关注交流微信公众号:小满锅 问题导言 最近在使用hive时,发现一些任务的因为使用mapreduce的缘故,跑的太慢了,才几十个G的数据就经常跑一个多小时,于是有了切换spark的想法. 但是刚刚 ...

  7. 数据分析从零到精通第二课 Hive和Spark入门

    03 离线利器:大数据离线处理工具 Hive 的常用技巧 今天为你介绍数据分析师最常用的数据处理工具 Hive 的一些使用技巧.这些技巧我们在工作中使用得比较频繁,如果运用得当,将为我们省去不少时间精 ...

  8. hive on spark 线上问题排查案例分享

    来源:明哥的IT笔记  编辑:数据社 全文共 2320个字,建议阅读 10 分钟 大家好,今天看到明哥分享一个某业务系统的线上 hive on spark 作业在高并发下频现作业失败问题的原因分析和解 ...

  9. Hive On Spark优化

    1.Hive官方建议的Hive On Spark优化 mapreduce.input.fileinputformat.split.maxsize=750000000hive.vectorized.ex ...

最新文章

  1. C++拓展笔记2-3:C++中this指针用法简介
  2. 第十五届全国大学生智能汽车竞赛各分赛区国赛获奖信息
  3. lob移表空间 oracle_移动一个带有lob字段的表到另外一个表空间
  4. 可视化拖拽 UI 布局之拖拽篇
  5. Xamarin.Forms开发实战基础篇大学霸内部资料
  6. PaddleFluid和TensorFlow基本使用概念对比 | PaddlePaddle专栏
  7. redis(19)--事务
  8. OpenCV4Android JavaCameraView实现
  9. 从零开始构建一个的asp.net Core 项目(一)
  10. 信息学奥赛一本通(1307:【例1.3】高精度乘法)
  11. 从零开始学习音视频编程技术(七) FFMPEG Qt视频播放器之SDL的使用
  12. 屏占比更高!16英寸Macbook Pro再曝光
  13. django:访问本地静态文件的配置
  14. selenium + python环境搭建步骤
  15. 浅谈互联网寒冬Android进阶之路
  16. 微信公众平台开发之定位导航功能
  17. java applet介绍,applet java 介绍
  18. 新年里真挚的情怀共祝愿南阳好
  19. mysql比对两张表数据
  20. Java if判断,while判断,Do while判断,Switch判断

热门文章

  1. BackTrack 5 发布了 ---直接下载地址
  2. 以 DirectUI 方式实现的ImageButton
  3. 牛客 - 牛牛的最大兴趣组(思维+数论)
  4. 兰州大学第一届『飞马杯』程序设计竞赛 - ★★飞马祝福语★★(动态dp)
  5. 洛谷 - P1758 [NOI2009]管道取珠(计数dp)
  6. AcWing - 165 小猫爬山(dfs)
  7. 安装php-redis遇到Error: Package: php-pecl-igbinary-1.2.1-1.el7.x86_64 (epel)
  8. delphi调用windows api
  9. 完成端口(Completion Port)详解----- By PiggyXP(小猪)
  10. Python的列表List常见操作