当前位置:   article > 正文

Hive on spark 配置_spark on hive 配置

spark on hive 配置

1. 配置

1.1 配置hive使用spark引擎

1.1.1 临时配置

set hive.execution.engine=spark;
  • 1

在hive或beeline窗口运行该命令,则在该会话的sql将会使用spark执行引擎

1.1.2 永久配置

  1. 进入Cloudera Manager,进入Hive服务页面;
  2. 点击配置(Configuration)按钮;
  3. 搜索"execution";
  4. 设置“default execution engine”的配置为Spark
  5. 保存,并重启相关的集群服务则生效;

1.2 配置Hive依赖于Spark服务

  1. 进入Cloudera Manager,进入Hive服务页面;
  2. 点击配置(Configuration)按钮;
  3. 搜索“Spark On YARN Service”,选择Spark服务,若要移除,则选择none;
  4. 保存,并重启相关集群服务则生效;

1.3 Hive Map Joins的动态分区修剪

当运行Hive on Spark时,可以开启map joins的动态分区修剪功能。这是一项数据库优化功能能够减少数据的扫描量,从而使任务运行更快。但必须从分区表才能达到效果。

-- CDH不建议也不支持设置此项:所有的join都开启,包括map joins和common joins
set hive.spark.dynamic.partition.pruning=true;
-- 此项支持:仅在map joins开启
set hive.spark.dynamic.partition.pruning.map.join.only=true;
  • 1
  • 2
  • 3
  • 4

1.4 其他优化配置

1.4.1 Yarn的配置

重要配置参数:
yarn.nodemanager.resource.cpu-vcores
yarn.nodemanager.resource.memory-mb

这两个参数与集群资源(cpu和内存)以及服务有关,不做配置建议,请自行参考yarn的资源配置相关建议

1.4.2 Spark的配置

1.4.2.1 配置Executor资源

配置executor memory的大小是,最主要参考以下两点因素:

  1. 更多的executor内存能够优化map join查询,但可能增加GC;
  2. HDFS的客户端在某种情况下不能很好处理并发写入,因此更多的核心数可能会发生竞争;

为了减少剩余的核心数(指无法充分分配,比如20个核,每个executor设置为3,那么20/3余2,则有2个核剩余),Cloudera建议配置核心数为4或5或6(由总可用核数进行计算);

一个executor分配的内存由spark.executor.memoryspark.yarn.executor.memoryOverhead 两个参数确定。Cloudera建议配置堆外内存为executor总内存的15%-20%。

假设设置spark.execuotr.memoryOverhead=2G,spark.executor.memory=12G,yarn.nodemanager.resource.memory-mb=100G,那么最多能够同时运行7个executor,每个executor能够运行4个task(一个核一个任务)。那么每个任务平均有3.5G(14/4)内存。在一个executor里的所有tasks将共享同一个堆空间。

注意:

  1. 在不同版本,spark.yarn.executor.memoryOverhead的参数过时了,由spark.executor.memoryOverhead替代;
  2. 必须确保spark.execuotr.memoryOverhead 和 spark.executor.memory 的和小于 yarn.scheduler.maximum-allocation-mb,否则资源不够,无法分配资源,则永远无法运行任务。
1.4.2.2 配置Driver资源

Cloudera给出了一下的配置参考,设yarn.nodemanager.resource.memory-mb为X,那么有

driver memory参考值
12GX >= 50G
4G12G <= X < 50G
1G1G <= X < 12G
256MBX < 1G

driver的内存有spark.driver.memory和spark.yarn.driver.memoryOverhead两部分组成,堆外内存应该占总内存的10%-15%。如yarn.nodemanager.resource.memory-mb=100GB,那么driver的总内存为12G。最终spark.driver.memory=10.5G,spark.yarn.driver.memoryOverhead=1.5G。

1.4.2.3 配置Executors的数量

集群中executors的数量取决于worker的数量和每个主机的executors数。设置executors数量越多,hive任务执行越快。可以通过参数配置spark.executor.instances直接设定。

1.4.2.4 动态Executor分配

设置动态资源分配,有利于executor的释放与分享,避免占用过多的资源。具体配置参考Spark动态资源配置

1.4.2.5 并行度

在绝大多数情况下,Hive自动确定并行度。但我们也可以控制一些参数来调整并行度。调整hive.exec.reducers.bytes.per.reducer来控制每个reducer能够处理的数据量,然后Hive根据可用的Executor、Executor的内存设置进行配置追加的分区数以及其他参数。实验证明,spark对该值的敏感性不如MR。但为了获得最佳性能,请设置该属性,使得Hive生成足够的任务以充分利用所有可用的执行程序。

1.4.3 Hive的配置

Hive on Spark能够共享绝大多数的Hive优化配置,但并不是全部。因此,需要调整一些配置,因为每个框架对此的解析不同,如hive.auto.convert.join.noconditionaltask.size

数据的大小有两个统计数据描述:

  1. totalSize : 磁盘上数据的大概大小
  2. rawDataSize : 内存中数据的大概大小

Hive on MR 使用的是totalSize,而Hive on Spark使用的是rawDataSize。因为压缩和序列化的原因,同一个文件的totalSize和rawDataSize值可能差异很大。在Hive on Spark中,你可能需要为hive.auto.convert.join.noconditionaltask.size指定一个更大的值(在MR任务中相同的map join)。但如果该值设置过大,则小表会使用更多的内存,最终导致任务因内存不足而失败,因此请根据实际情况进行调整。

可以使用hive.stats.collect.rawdatasize属性控制是否应收集rawDataSize统计信息。 Cloudera建议在Hive(默认设置)中将此设置为true。

Cloudera还建议使用HiveServer2的Cloudera Manager高级配置代码段设置两个其他配置属性:

hive.stats.fetch.column.stats = true

hive.optimize.index.filter = true

通常建议一下的Hive性能调优配置(并不一定是特定于Hive on Spark,也有通用的配置):

# 注意: 以下配置请根据实际用途配置,切勿盲目配置

hive.optimize.reducededuplication.min.reducer=4
hive.optimize.reducededuplication=true
hive.merge.mapfiles=true
hive.merge.mapredfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.sparkfiles=true
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask=true
hive.auto.convert.join.noconditionaltask.size=20M(might need to increase for Spark, 200M)
hive.optimize.bucketmapjoin.sortedmerge=false
hive.map.aggr.hash.percentmemory=0.5
hive.map.aggr=true
hive.optimize.sort.dynamic.partition=false
hive.stats.autogather=true
hive.stats.fetch.column.stats=true
hive.compute.query.using.stats=true
hive.limit.pushdown.memory.usage=0.4 (MR and Spark)
hive.optimize.index.filter=true
hive.exec.reducers.bytes.per.reducer=67108864
hive.smbjoin.cache.rows=10000
hive.fetch.task.conversion=more
hive.fetch.task.conversion.threshold=1073741824
hive.optimize.ppd=true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

1.4.4 Yarn Containers预热

当首次提交任务启动新的会话时,可能会看到一定延时后任务才开始执行。但在此提交相同任务时,完成时间会比第一次更快。

原因在于Spark executors需要额外的时间启动和初始化,因此产生了一定的延时和等待。另外,Spark不需要等待所有的executors都准备好了才开始执行任务。然而,Spark任务提交作业的可用executors数量取决与reducers数量。当executor数量还没完全启动,那么并行度也不会达到最大,这也导致了首次运行任务会较慢。

对于长时间存活的会话,额外的时间机会不会影响到作业的运行。而对于短时间存活的会话,就无法达到最佳性能。

为了减少启动时间,可以在作业启动前开启container预热功能。在任务执行前,设置 hive.prewarm.enabled 为true,同时也可以 hive.prewarm.numcontainers (默认值为10) 来制定containers的数量。

实际上预热的executors的上限取决于 spark.executor.instances ( 静态分配) 或 spark.dynamicAllocation.maxExecutors (动态分配)。

注意: 预热需要几秒钟,对于短暂会话而已比较好,尤其是在查询涉及reduce阶段。但是,如果hive.prewarm.numcontainers的值高于集群中可用的值,则该过程最多需要30s。因此谨慎使用预热。


2. Hive on Spark的故障排除

2.1 HiveServer2的日志异常和HiveServer2异常关闭

2.1.1 现象

在HiveServer2的日志中

Error: org.apache.thrift.transport.TTransportException (state=08S01,code=0)
  • 1

2.1.2 原因

HiveServer2的内存太小了

2.1.3 解决

  1. 进入Hive服务;
  2. 点击“Configuration”;
  3. 搜索“Java Heap Size of Hive Server2”,设置最小值为2G;
  4. 保存并重启相关服务生效;

2.2 内存不足错误

2.2.1 现象

15/03/19 03:43:17 WARN channel.DefaultChannelPipeline:
An exception was thrown by a user handler while handling an exception event ([id: 0x9e79a9b1, /10.20.118.103:45603 => /10.20.120.116:39110]
      EXCEPTION: java.lang.OutOfMemoryError: Java heap space)
      java.lang.OutOfMemoryError: Java heap space
  • 1
  • 2
  • 3
  • 4

2.2.2 原因

Spark driver没有足够的堆外内存

2.2.3 解决

增大“spark.driver.memory”的值并且确保“spark.yarn.driver.memoryOverhead”的值至少是driver内存的20%

2.3 Spark应用程序卡着

2.3.1 现象

集群资源呗Spark应用占据

2.3.2 原因

同时运行多个Hive on Spark会话可能会发生这种情况

2.3.3 解决

  1. 进入YARN服务页面;
  2. 点击“Applications”标签;
  3. 选择包含Hive on Spark的应用kill掉;

2.4 权限认证问题

2.4.1 现象

Lost executor 1 on bigdatasrv01:unable to create executor due to Unable to register with external shuffle server due to : java.lang.IllegalStateException:Expected SaslMessage,received something else(maybe your client does not have SASL enabled?)
  • 1

2.4.2 原因

因为spark开启了身份认证的设置

2.4.3 解决

参考:https://www.ericlin.me/2018/06/spark-job-sasl-authentication-error/

方法1:在提交任务时,传输参数
set spark.authenticate=true;
  • 1
方法2:关闭spark的身份认证选项
  1. 进入spark服务;
  2. 搜索“spark.authenticate”
  3. 将“Spark Authentication”和“Enable Network Encryption”的勾去掉;
  4. 重启服务生效;

2.5 Spark无法使用Snappy压缩

2.5.1 现象

Spark job failed due to task failures:org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
  • 1

2.5.2 原因

使用Hive on Spark无法加载Snappy的类,因此无法处理Snappy的表文件;
查阅大量相关资料都能够得到一个处理方案,就是env中添加hadoop的native路径。但有的是在hadoop中添加,有的是在spark中添加。经过测试,确认Hive on MR无该问题,Spark直接读取文件也没有该问题,可以证明原生的hive和spark的env并没有问题。问题在于Hive on Spark。

2.5.3 解决

https://community.cloudera.com/t5/Support-Questions/spark-on-yarn-java-lang-UnsatisfiedLinkError/td-p/22724
https://forum.huawei.com/enterprise/zh/thread-472753.html
https://docs.oracle.com/cd/E93962_01/bigData.Doc/data_processing_onPrem/src_onPrem/tdp_cli_snappy.html

在hive中添加配置命令:

set spark.executorEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
set spark.driverEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
set spark.yarn.appMasterEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
  • 1
  • 2
  • 3

3. 补充

3.1 样板

提交任务时的一些设计样板,可做参考

set hive.mapred.mode=nonstrict;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.cli.print.header=true;
set hive.execution.engine=spark;
set hive.auto.convert.join.noconditionaltask.size=209715200;
set hive.spark.dynamic.partition.pruning.map.join.only=true;
set hive.prewarm.enabled=true;
set spark.executorEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
set spark.driverEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
set spark.yarn.appMasterEnv.LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.2 参考文档

https://docs.cloudera.com/documentation/enterprise/latest/topics/admin_hos_oview.html#hos_running

http://bdlabs.edureka.co/static/help/topics/admin_hos_tuning.html

https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/admin_hos_tuning.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/526906
推荐阅读
相关标签
  

闽ICP备14008679号