赞
踩
set hive.execution.engine=spark;
在hive或beeline窗口运行该命令,则在该会话的sql将会使用spark执行引擎
当运行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;
重要配置参数:
yarn.nodemanager.resource.cpu-vcores
yarn.nodemanager.resource.memory-mb
这两个参数与集群资源(cpu和内存)以及服务有关,不做配置建议,请自行参考yarn的资源配置相关建议
配置executor memory的大小是,最主要参考以下两点因素:
为了减少剩余的核心数(指无法充分分配,比如20个核,每个executor设置为3,那么20/3余2,则有2个核剩余),Cloudera建议配置核心数为4或5或6(由总可用核数进行计算);
一个executor分配的内存由spark.executor.memory 和 spark.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将共享同一个堆空间。
注意:
Cloudera给出了一下的配置参考,设yarn.nodemanager.resource.memory-mb为X,那么有
driver memory | 参考值 |
---|---|
12G | X >= 50G |
4G | 12G <= X < 50G |
1G | 1G <= X < 12G |
256MB | X < 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。
集群中executors的数量取决于worker的数量和每个主机的executors数。设置executors数量越多,hive任务执行越快。可以通过参数配置spark.executor.instances直接设定。
设置动态资源分配,有利于executor的释放与分享,避免占用过多的资源。具体配置参考Spark动态资源配置
在绝大多数情况下,Hive自动确定并行度。但我们也可以控制一些参数来调整并行度。调整hive.exec.reducers.bytes.per.reducer来控制每个reducer能够处理的数据量,然后Hive根据可用的Executor、Executor的内存设置进行配置追加的分区数以及其他参数。实验证明,spark对该值的敏感性不如MR。但为了获得最佳性能,请设置该属性,使得Hive生成足够的任务以充分利用所有可用的执行程序。
Hive on Spark能够共享绝大多数的Hive优化配置,但并不是全部。因此,需要调整一些配置,因为每个框架对此的解析不同,如hive.auto.convert.join.noconditionaltask.size。
数据的大小有两个统计数据描述:
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
当首次提交任务启动新的会话时,可能会看到一定延时后任务才开始执行。但在此提交相同任务时,完成时间会比第一次更快。
原因在于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。因此谨慎使用预热。
在HiveServer2的日志中
Error: org.apache.thrift.transport.TTransportException (state=08S01,code=0)
HiveServer2的内存太小了
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
Spark driver没有足够的堆外内存
增大“spark.driver.memory”的值并且确保“spark.yarn.driver.memoryOverhead”的值至少是driver内存的20%
集群资源呗Spark应用占据
同时运行多个Hive on Spark会话可能会发生这种情况
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?)
因为spark开启了身份认证的设置
参考:https://www.ericlin.me/2018/06/spark-job-sasl-authentication-error/
set spark.authenticate=true;
Spark job failed due to task failures:org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
使用Hive on Spark无法加载Snappy的类,因此无法处理Snappy的表文件;
查阅大量相关资料都能够得到一个处理方案,就是env中添加hadoop的native路径。但有的是在hadoop中添加,有的是在spark中添加。经过测试,确认Hive on MR无该问题,Spark直接读取文件也没有该问题,可以证明原生的hive和spark的env并没有问题。问题在于Hive on Spark。
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;
提交任务时的一些设计样板,可做参考
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;
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。