1. 配置
1.1 配置hive使用spark引擎
1.1.1 临时配置
set hive.execution.engine=spark;
在hive或beeline窗口运行该命令,则在该会话的sql将会使用spark执行引擎
1.1.2 永久配置
- 进入Cloudera Manager,进入Hive服务页面;
- 点击配置(Configuration)按钮;
- 搜索"execution";
- 设置“default execution engine”的配置为Spark
- 保存,并重启相关的集群服务则生效;
1.2 配置Hive依赖于Spark服务
- 进入Cloudera Manager,进入Hive服务页面;
- 点击配置(Configuration)按钮;
- 搜索“Spark On YARN Service”,选择Spark服务,若要移除,则选择none;
- 保存,并重启相关集群服务则生效;
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.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的大小是,最主要参考以下两点因素:
- 更多的executor内存能够优化map join查询,但可能增加GC;
- HDFS的客户端在某种情况下不能很好处理并发写入,因此更多的核心数可能会发生竞争;
为了减少剩余的核心数(指无法充分分配,比如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将共享同一个堆空间。
注意:
- 在不同版本,spark.yarn.executor.memoryOverhead的参数过时了,由spark.executor.memoryOverhead替代;
- 必须确保spark.execuotr.memoryOverhead 和 spark.executor.memory 的和小于 yarn.scheduler.maximum-allocation-mb,否则资源不够,无法分配资源,