Hive on Spark ERROR java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS

Hive on Spark ERROR java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS

运行 具有简单 select * from table 查询的 Spark 上的 Hive 运行平稳,但在连接和求和时,ApplicationMaster returns 相关 spark 容器的堆栈跟踪:

2019-03-29 17:23:43 ERROR ApplicationMaster:91 - User class threw exception: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon.run(ApplicationMaster.scala:706)
2019-03-29 17:23:43 INFO  ApplicationMaster:54 - Final app status: FAILED, exitCode: 13, (reason: User class threw exception: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon.run(ApplicationMaster.scala:706)
)
2019-03-29 17:23:43 ERROR ApplicationMaster:91 - Uncaught exception: 
org.apache.spark.SparkException: Exception thrown in awaitResult: 
    at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:205)
    at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:486)
    at org.apache.spark.deploy.yarn.ApplicationMaster.org$apache$spark$deploy$yarn$ApplicationMaster$$runImpl(ApplicationMaster.scala:345)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run.apply$mcV$sp(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run.apply(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run.apply(ApplicationMaster.scala:260)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon.run(ApplicationMaster.scala:800)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
    at org.apache.spark.deploy.yarn.ApplicationMaster.doAsUser(ApplicationMaster.scala:799)
    at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:259)
    at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:824)
    at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)
Caused by: java.util.concurrent.ExecutionException: Boxed Error
    at scala.concurrent.impl.Promise$.resolver(Promise.scala:55)
    at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolveTry(Promise.scala:47)
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:244)
    at scala.concurrent.Promise$class.tryFailure(Promise.scala:112)
    at scala.concurrent.impl.Promise$DefaultPromise.tryFailure(Promise.scala:153)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon.run(ApplicationMaster.scala:724)
Caused by: java.lang.NoSuchFieldError: SPARK_RPC_SERVER_ADDRESS
    at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:47)
    at org.apache.hive.spark.client.RemoteDriver.<init>(RemoteDriver.java:134)
    at org.apache.hive.spark.client.RemoteDriver.main(RemoteDriver.java:516)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.yarn.ApplicationMaster$$anon.run(ApplicationMaster.scala:706)
2019-03-29 17:23:43 INFO  ApplicationMaster:54 - Deleting staging directory hdfs://LOSLDAP01:9000/user/hdfs/.sparkStaging/application_1553880018684_0001
2019-03-29 17:23:43 INFO  ShutdownHookManager:54 - Shutdown hook called

我已经尝试增加 yarn 容器内存分配(并减少 spark 内存)但没有成功。

使用: Hadoop 2.9.2 火花 2.3.0 配置单元 2.3.4

感谢您的帮助。

事实证明 Hive-on-Spark 有很多实现问题,除非您编写自己的自定义 Hive 连接器,否则基本上根本不起作用。简而言之shell,Spark 开发人员正在努力跟上 Hive 的发布,他们尚未决定如何处理向后兼容性,即如何加载 Hive 版本 ~< 2,同时专注于最新的分支。


解决方案

1) 返回 Hive 1.x

不理想。特别是如果您想要与 ORC 等文件格式进行更现代的集成。

2) 使用Hive-on-Tez

这是我们决定采用的。 *This solution does not break the open source stack* 并与 Spark-on-Yarn 完美配合。第 3 方 Hadoop 生态系统,如 Azure、AWS 和 Hortonworks 的生态系统,都只为 运行ning Hive-On-Spark 添加专有代码,因为它变得一团糟。

通过安装 Tez,您的 Hadoop 查询将像这样工作:

  • 直接 Hive 查询(例如来自 DBeaver 的 jdbc 连接)将 运行 集群上的 Tez 容器
  • Spark 作业 将能够正常访问 Hive Metastore,并且在创建 SparkSession.builder.enableHiveSupport().getOrCreate() 时将在集群上使用 Spark 容器(这是 pyspark 代码)

安装 Hive-on-Tez 和 Spark-on-Yarn

注意:我会保持简短,因为我没有看到对这些板有太多兴趣。询问详细信息,我很乐意提供帮助和扩展。

版本矩阵

Hadoop   2.9.2
Tez      0.9.2
Hive     2.3.4
Spark    2.4.2

Hadoop以集群模式安装。

这对我们有用。我不希望它在切换到 Hadoop 时无缝工作 3.x,我们将在未来的某个时间点这样做,但如果您不更改每个组件的主要发布版本,它应该可以正常工作。

基本指南

  1. official install guide 中所写的源代码编译 Tez,使用模式 A 共享 hadoop jar。不要使用任何 pre-compiled Tez 发行版。通过 hive shell 使用一个简单的查询来测试它 不是 一个简单的数据访问(即只是一个 select)。例如,使用:select count(*) from myDb.myTable。您应该从配置单元控制台看到 Tez 栏。
  2. 从源代码编译 Spark。为此,follow the official guide重要:下载标记为 without-hadoop !! 的存档,但在编译之前编辑./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala 处的源代码注释掉 以下行:ConfVars.HIVE_STATS_JDBC_TIMEOUT -> TimeUnit.SECONDS,
  3. 在您的 $SPARK_HOME/conf/ 目录中分享 $HIVE_HOME/conf/hive-site.xml。您必须制作此配置文件的硬拷贝,而不是符号链接。原因是您必须 从中删除所有 Tez-related Hive 配置值 以保证 Spark co-exist 独立于 Tez,如上所述。这确实包括必须留空的 hive.execution.engine=tez 属性。只需将其从 Spark 的 hive-site.xml 中完全删除,同时将其留在 Hive 的 hive-site.xml.
  4. $HADOOP_HOME/etc/hadoop/mapred-site.xml中设置属性mapreduce.framework.name=yarn。即使它没有设置为 yarn-tez,这两个环境也会正确地拾取它。这只是意味着原始 mapreduce 作业不会 运行 在 Tez 上,而 Hive 作业确实会使用它。这只是遗留作业的问题,因为原始 mapred 已过时。

祝你好运!

6 个月前有人问过这个问题。希望这对其他人有帮助。 出现此错误的原因是 SPARK_RPC_SERVER_ADDRESS 添加到 hive 版本 2.x 并且 Spark 默认支持 hive 1.2.1.

我能够在 EMR 5.25 集群(Hadoop 2.8.5、hive 2.3.5、Spark 2.4.3)上使用 this manual 为 YARN 上的 运行ning 启用 hive-on-spark .但是,手册需要更新,它缺少一些关键项目。

  1. 使用 YARN 模式(yarn-client 或 yarn-cluster)运行,link 以下 jar 到 HIVE_HOME/lib。手册没有提到 linking 最后一个库 spark-unsafe.jar
ln -s /usr/lib/spark/jars/scala-library-2.11.12.jar /usr/lib/hive/lib/scala-library.jar
ln -s /usr/lib/spark/jars/spark-core_2.11-2.4.3.jar /usr/lib/hive/lib/spark-core.jar
ln -s /usr/lib/spark/jars/spark-network-common_2.11-2.4.3.jar /usr/lib/hive/lib/spark-network-common.jar
ln -s /usr/lib/spark/jars/spark-unsafe_2.11-2.4.3.jar /usr/lib/hive/lib/spark-unsafe.jar
  1. 允许 Yarn 在节点上缓存必要的 spark 依赖 jar,这样就不需要在每次应用 运行 时都分发它。 Hive 2.2.0,将$SPARK_HOME/jars 中的所有jar 上传到hdfs 文件夹,并在hive-site.xml
  2. 中添加以下内容
<property>
  <name>spark.yarn.jars</name>
  <value>hdfs://xxxx:8020/spark-jars/*</value>
</property>

手册缺少您需要排除默认配置单元 1.2.1 jar 的关键信息。这就是我所做的:

hadoop fs -mkdir /spark-jars
hadoop fs -put /usr/lib/spark/jars/*.jar /spark-jars/
hadoop fs -rm /spark-jars/*hive*1.2.1*

此外,您需要将以下内容添加到 spark-defaults.conf 文件中:

spark.sql.hive.metastore.version        2.3.0;
spark.sql.hive.metastore.jars       /usr/lib/hive/lib/*:/usr/lib/hadoop/client/*

有关与不同版本的 Hive Metastore 交互的更多信息,请查看此 link