On this page
Hive on Spark:入门
Hive on Spark 使 Hive 能够利用Apache Spark作为其执行引擎。
set hive.execution.engine=spark;
Hive on Spark 已在HIVE-7292中添加。
Version Compatibility
Hive on Spark 仅在特定版本的 Spark 上进行了测试,因此,给定版本的 Hive 仅能与特定版本的 Spark 一起使用。其他版本的 Spark 可以与给定版本的 Hive 一起使用,但这不能保证。以下是 Hive 版本及其对应的兼容 Spark 版本的列表。
Hive Version | Spark Version |
---|---|
master | 2.3.0 |
3.0.x | 2.3.0 |
2.3.x | 2.0.0 |
2.2.x | 1.6.0 |
2.1.x | 1.6.0 |
2.0.x | 1.5.0 |
1.2.x | 1.3.1 |
1.1.x | 1.2.0 |
Spark Installation
按照说明安装 Spark:
纱线模式:http://spark.apache.org/docs/latest/running-on-yarn.html
独立模式:https://spark.apache.org/docs/latest/spark-standalone.html
Hive on Spark 默认支持纱上的火花模式。
对于安装,请执行以下任务:
安装 Spark(下载预构建的 Spark,或从源代码构建程序集)。
安装/构建兼容版本。Hive 根
pom.xml
的\ <spark.version>定义了构建/测试的 Spark 版本。安装/构建兼容的发行版。每个版本的 Spark 都有多个发行版,分别对应于不同的 Hadoop 版本。
一旦安装了 Spark,请找到并记下\ <spark-assembly-*.jar>的位置。
请注意,您必须具有不包含 Hive 罐子的 Spark 版本。意思是不是使用 Hive 配置文件构建的。如果要使用 Parquet 表,建议也启用“ parquet 提供的”配置文件。否则,Parquet 依赖项可能会发生冲突。要从安装中删除 Hive jar,只需在 Spark 存储库下使用以下命令:
在 Spark 2.0.0 之前:
./make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.4,parquet-provided"
从 Spark 2.0.0 开始:
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided"
从 Spark 2.3.0 开始:
./dev/make-distribution.sh --name "hadoop2-without-hive" --tgz "-Pyarn,hadoop-provided,hadoop-2.7,parquet-provided,orc-provided"
启动 Spark 集群
记下\ 。可以在 Spark 主 WebUI 中找到。
Configuring YARN
不是capacity scheduler,而是fair scheduler。这样可以公平分配 YARN 群集中作业的资源。
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
Configuring Hive
要将 Spark 依赖项添加到 Hive:
在 Hive 2.2.0 之前,请将火花装配罐链接到
HIVE_HOME/lib
。从 Hive 2.2.0 开始,Spark 上的 Hive 在 Spark 2.0.0 及更高版本上运行,后者没有程序集 jar。
要以 YARN 模式(yarn-client 或 yarn-cluster)运行,请将以下 jar 链接到
HIVE_HOME/lib
。scala-library
spark-core
spark-network-common
要以 LOCAL 模式运行(仅用于调试),除了上面的 jar 之外,还将以下 jar 链接到
HIVE_HOME/lib
。
chill-java chill jackson-module-paranamer jackson-module-scala jersey-container-servlet-core
泽西服务器 json4s-ast kryoshade 的 minlog scala-xml spark-launcher
spark-network-shuffle spark-unsafe xbean-asm5-shaded
配置 Hive 执行引擎以使用 Spark:
set hive.execution.engine=spark;
有关配置 Hive 和 Remote Spark Driver 的其他属性,请参见Hive 配置属性的 Spark 部分。
- 为 Hive 配置 Spark 应用程序配置。参见:http://spark.apache.org/docs/latest/configuration.html。这可以通过将具有这些属性的文件“ spark-defaults.conf”添加到 HiveClasspath 中,或通过在 Hive 配置(
hive-site.xml
)上进行设置来完成。例如:
set spark.master=<Spark Master URL>
set spark.eventLog.enabled=true;
set spark.eventLog.dir=<Spark event log folder (must exist)>
set spark.executor.memory=512m;
set spark.serializer=org.apache.spark.serializer.KryoSerializer;
配置属性详细信息
spark.executor.memory
:每个执行程序进程要使用的内存量。spark.executor.cores
:每个执行程序的核心数。spark.yarn.executor.memoryOverhead
:在 Yarn 上运行 Spark 时,将为每个执行程序分配的堆外内存量(以兆字节为单位)。这是用于解决 VM 开销,内部字符串,其他本机开销等问题的内存。除了执行程序的内存外,启动执行程序的容器还需要一些额外的内存用于系统进程,这就是这些开销对于。spark.executor.instances
:分配给每个应用程序的执行程序的数量。spark.driver.memory
:分配给远程 Spark 上下文(RSC)的内存量。我们建议使用 4GB。spark.yarn.driver.memoryOverhead
:我们建议 400(MB)。允许 Yarn 在节点上缓存必需的 spark 依赖项 jar,以便不需要在每次运行应用程序时将其分发。
在 Hive 2.2.0 之前,请将 spark-assembly jar 上传到 hdfs 文件(例如:hdfs://xxxx:8020/spark-assembly.jar),然后在 hive-site.xml 中添加以下内容
<property>
<name>spark.yarn.jar</name>
<value>hdfs://xxxx:8020/spark-assembly.jar</value>
</property>
- Hive 2.2.0,将$ SPARK_HOME/jars 中的所有 jar 都上传到 hdfs 文件夹(例如:hdfs:///xxxx:8020/spark-jars),然后在 hive-site.xml 中添加以下内容
<property>
<name>spark.yarn.jars</name>
<value>hdfs://xxxx:8020/spark-jars/*</value>
</property>
Configuring Spark
设置执行程序的内存大小比简单地设置尽可能大要复杂得多。有几件事情需要考虑:
更多的执行程序内存意味着可以为更多查询启用 mapjoin 优化。
另一方面,从 GC 的角度来看,更多的执行者 Memory 变得笨拙。
一些实验表明,HDFSClient 端不能很好地处理并发编写器,因此,如果执行者内核过多,它可能会面临竞争状态。
需要针对集群调整以下设置,这些设置也可能适用于在 Hive on Spark 之外提交 Spark 作业:
Property | Recommendation |
---|---|
spark.executor.cores | 5-7 岁之间,请参阅“调整详细信息”部分 |
spark.executor.memory | yarn.nodemanager.resource.memory-mb *(spark.executor.cores/yarn.nodemanager.resource.cpu-vcores) |
spark.yarn.executor.memoryOverhead | 15 -20%的 spark.executor.memory |
spark.executor.instances | 取决于 spark.executor.memory spark.yarn.executor.memoryOverhead,请参阅调整详细信息部分。 |
Tuning Details
在 YARN 模式下运行 Spark 时,我们通常建议将 spark.executor.cores 设置为 5、6 或 7,这取决于可被典型节点整除的对象。例如,如果 yarn.nodemanager.resource.cpu-vcores 为 19,则 6 是一个更好的选择(所有执行程序只能具有相同数量的内核,在这里,如果我们选择 5,则每个执行程序只能获得 3 个内核;如果我们选择选择 7,则仅使用 2 个执行程序,并且将浪费 5 个内核)。如果是 20,那么 5 是一个更好的选择(因为这样,您将获得 4 个执行程序,并且不会浪费任何核心资源)。
对于spark.executor.memory
,我们建议计算出 yarn.nodemanager.resource.memory-mb *(spark.executor.cores/yarn.nodemanager.resource.cpu-vcores),然后将其在 spark.executor.memory 和spark.yarn.executor.memoryOverhead
之间进行分割。根据我们的实验,我们建议将spark.yarn.executor.memoryOverhead
设置为总内存的 15-20%。
在确定每个执行程序可以接收多少内存之后,您需要确定将为查询分配多少个执行程序。在 GA 版本中,将支持 Spark 动态执行程序分配。但是,对于此 Beta 版,只能使用静态资源分配。根据每个节点中的物理内存以及spark.executor.memory
和spark.yarn.executor.memoryOverhead
的配置,您将需要选择实例数并设置spark.executor.instances
。
现在是一个真实的例子。假设每个节点具有 12 个虚拟内核(例如yarn.nodemanager.resource.cpu-vcores=12
)的 10 个节点具有 64GB 的内存。一个节点将用作主节点,因此群集将具有 9 个从节点。我们将spark.executor.cores
配置为 6.假设 ram yarn.nodemanager.resource.memory-mb
的 64GB 为 50GB。我们将确定每个 Actuator 的内存量,如下所示:50GB *(6/12)= 25GB。我们将为spark.yarn.executor.memoryOverhead
或 5120 分配 20%,为spark.executor.memory
或 20GB 分配 80%。
在这 9 个节点的群集上,每个主机将有两个执行程序。这样,我们可以将spark.executor.instances
配置为 2 到 18 之间的某个值。值 18 会利用整个群集。
常见问题(绿色已解决,将从此列表中删除)
Issue | Cause | Resolution | |
---|---|---|---|
错误:找不到或加载主类 org.apache.spark.deploy.SparkSubmit | Spark 依赖关系未正确设置。 | 将 Spark 依赖项添加到 Hive,请参阅步骤 1 above。 | |
org.apache.spark.SparkException:作业由于阶段失败而中止: | |||
任务 5.0:0 的结果无法序列化:java.io.NotSerializableException:org.apache.hadoop.io.BytesWritable |
Spark 序列化器未设置为 Kryo。 | 将 spark.serializer 设置为 org.apache.spark.serializer.KryoSerializer,参见步骤 3 above。 | |
[错误]终端初始化失败;退回不受支持 java.lang.IncompatibleClassChangeError:找到类 jline.Terminal,但预期接口是 |
Hive 已升级到 Jline2,但 Hadoop lib 中存在 jline 0.94. | 从 Hadoop lib 目录中删除 jline(仅可从 ZooKeeper 临时引入)。 export HADOOP_USER_CLASSPATH_FIRST=true 如果在 mvn 测试期间发生此错误,请在根项目和 itests 目录上执行 mvn 全新安装。 |
|
火花 Actuator 一直被杀死,Sparkcontinue 重试失败的阶段;您可能会在 YARN nodemanager 日志中找到类似的信息。 警告 org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl:容器[pid = 217989,containerID = container_1421717252700_0716_01_50767235]超出了物理内存限制。当前使用情况:已使用 43.1 GB 的 43 GB 物理内存;已使用 43.9 GB 的 90.3 GB 虚拟内存。 |
杀死容器。 | 对于 YARN 上的 Spark,如果 nodemanager 使用的内存大于配置的“ spark.executor.memory”“ spark.yarn.executor.memoryOverhead”的大小,它将杀死 SparkActuator。 | 增加“ spark.yarn.executor”。 “ memoryOverhead”以确保它涵盖了执行程序堆外的内存使用情况。 |
运行查询并得到如下错误: 失败:执行错误,从 org.apache.hadoop.hive.ql.exec.spark.SparkTask 返回代码 3 在 Hive 日志中,它显示: java.lang.NoClassDefFoundError:无法初始化类 org.xerial.snappy.Snappy 在 org.xerial.snappy.SnappyOutputStream。\ (SnappyOutputStream.java:79) |
在 Mac 上发生(未正式支持)。 这是 Mac 上的一个常见的 Snappy 问题,不是 Hive on Spark 独有的,但是此处指出了解决方法,因为启动 SparkClient 端需要它。 |
在启动 Hive 或 HiveServer2 之前运行以下命令: 导出 HADOOP_OPTS =“-Dorg.xerial.snappy.tempdir =/tmp -Dorg.xerial.snappy.lib.name = libsnappyjava.jnilib $ HADOOP_OPTS” |
|
堆栈跟踪:ExitCodeException exitCode = 1:.../launch_container.sh:第 27 行:$ PWD:$ PWD/__ spark 。jar:$ HADOOP_CONF_DIR .../usr/hdp/${hdp.version}/hadoop/lib/hadoop- lzo-0.6.0. ${hdp.version} .jar:/ etc/hadoop/conf/secure:$ PWD/ app __。jar:$ PWD/*:错误替换 | /etc/hadoop/conf 中的 key mapreduce.application.classpath /mapred-site.xml 包含一个在 bash 中无效的变量。 | 从 mapreduce.application.classpath 移除:/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jar from /etc/hadoop/conf/mapred-site.xml |
|
线程“驱动程序”中的异常 scala.MatchError:java.lang.NoClassDefFoundError:org/apache/hadoop/mapreduce/TaskAttemptContext(类 java.lang.NoClassDefFoundError 的) 在 org.apache.spark.deploy.yarn.ApplicationMaster $$ anon $ 2.run(ApplicationMaster.scala:432)上 |
MR 不在 YARNClasspath 上。 | 如果在 HDP 上则从 /hdp/apps/${hdp.version}/mapreduce/mapreduce.tar.gz#mr-framework to /hdp/apps/2.2.0.0-2041/mapreduce/mapreduce.tar.gz#mr-framework |
|
java.lang.OutOfMemoryError:具有 spark.master = local 的 PermGen 空间 | 默认情况下(SPARK-1879),Spark 自己的启动脚本会将 PermGen 增加到 128 MB,因此我们需要在配置单元启动脚本中增加 PermGen。 | 如果使用 JDK7,请附加以下内容在 conf/hive-env.sh 中:export HADOOP_OPTS="$HADOOP_OPTS -XX:MaxPermSize=128m" 如果使用 JDK8,请在 Conf/hive-env.sh 中添加以下内容: export HADOOP_OPTS="$HADOOP_OPTS -XX:MaxMetaspaceSize=512m" |
Recommended Configuration
有关这些设置的详细信息,请参见HIVE-9153。
mapreduce.input.fileinputformat.split.maxsize=750000000
hive.vectorized.execution.enabled=true
hive.cbo.enable=true
hive.optimize.reducededuplication.min.reducer=4
hive.optimize.reducededuplication=true
hive.orc.splits.include.file.footer=false
hive.merge.mapfiles=true
hive.merge.sparkfiles=false
hive.merge.smallfiles.avgsize=16000000
hive.merge.size.per.task=256000000
hive.merge.orcfile.stripe.level=true
hive.auto.convert.join=true
hive.auto.convert.join.noconditionaltask=true
hive.auto.convert.join.noconditionaltask.size=894435328
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.vectorized.execution.reduce.enabled=false
hive.vectorized.groupby.checkinterval=4096
hive.vectorized.groupby.flush.percent=0.1
hive.compute.query.using.stats=true
hive.limit.pushdown.memory.usage=0.4
hive.optimize.index.filter=true
hive.exec.reducers.bytes.per.reducer=67108864
hive.smbjoin.cache.rows=10000
hive.exec.orc.default.stripe.size=67108864
hive.fetch.task.conversion=more
hive.fetch.task.conversion.threshold=1073741824
hive.fetch.task.aggr=false
mapreduce.input.fileinputformat.list-status.num-threads=5
spark.kryo.referenceTracking=false
spark.kryo.classesToRegister=org.apache.hadoop.hive.ql.io.HiveKey,org.apache.hadoop.io.BytesWritable,org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch
有关其他属性,请参见配置页面的 Spark 部分。