Hive on Spark ERROR java.lang.NoSuchFieldError: SPARK_RPC_SE



使用简单的select * from table查询在 Spark 上运行 Hive 运行流畅,但在连接和求和时,ApplicationMaster 会返回关联 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$4.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$4.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$2.apply$mcV$sp(ApplicationMaster.scala:260)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$2.apply(ApplicationMaster.scala:260)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$run$2.apply(ApplicationMaster.scala:260)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$5.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$4.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$4.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

我已经尝试增加纱线容器内存分配(并减少火花内存),但没有成功。

用: Hadoop 2.9.2 火花 2.3.0 蜂巢 2.3.4

谢谢你的帮助。

这是 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)上使用本手册启用 hive-on-spark,以便在 YARN 上运行。但是,手册需要更新,它缺少一些关键项目。

  1. 要使用 YARN 模式(yarn-client 或 yarn-cluster )运行,请将以下 jar 链接到 HIVE_HOME/lib。手册没有提到链接最后一个库火花不安全.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
<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 元存储交互的详细信息,请查看此链接。

事实证明,Hive-on-Spark 有很多实现问题,除非您编写自己的自定义 Hive 连接器,否则基本上根本无法工作。简而言之,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 完美配合使用。第三方Hadoop生态系统,如Azure,AWS和Hortonworks的生态系统,都添加了专有代码,仅用于运行Hive-On-Spark,因为它变得一团糟。

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

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

使用火花在纱线上安装Hive-on-Tez

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

版本矩阵

Hadoop   2.9.2
Tez      0.9.2
Hive     2.3.4
Spark    2.4.2

Hadoop 以集群模式安装。

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

基本指南

  1. 按照官方安装指南中的说明从源代码编译 Tez,模式 A 用于共享 hadoop jar。不要使用任何预编译的 Tez 发行版。通过 hive shell 使用简单的查询对其进行测试,该查询不是简单的数据访问(即只是一个选择)。例如,使用:select count(*) from myDb.myTable.应会看到配置单元控制台中的 Tez 条形图。
  2. 从源代码编译 Spark。为此,请遵循官方指南(重要提示:下载标记为without-hadoop!!) 的存档,但在编译之前,请在./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala处编辑源代码并注释掉以下行:ConfVars.HIVE_STATS_JDBC_TIMEOUT -> TimeUnit.SECONDS,
  3. 分享$HIVE_HOME/conf/hive-site.xml,在您的$SPARK_HOME/conf/目录中。您必须创建此配置文件的硬拷贝,而不是符号链接。原因是必须从中删除所有与 Tez 相关的 Hive 配置值,以确保 Spark 与 Tez 独立共存,如上所述。这确实包括必须留空的hive.execution.engine=tez属性。只需将其从 Spark 的蜂巢站点.xml中完全移除,同时将其保留在 Hive 的蜂巢站点.xml。
  4. $HADOOP_HOME/etc/hadoop/mapred-site.xml设置属性mapreduce.framework.name=yarn.即使它未设置为yarn-tez,两个环境也会正确选取它。这只是意味着原始mapreduce作业不会在Tez上运行,而Hive作业确实会使用它。这仅适用于旧版作业,因为原始映射已过时。
<小时 />

祝你好运!

最新更新