Apache spark Spark上的配置单元错误java.lang.NoSuchFieldError:Spark\u RPC\u服务器\u地址

Apache spark Spark上的配置单元错误java.lang.NoSuchFieldError:Spark\u RPC\u服务器\u地址,apache-spark,hive,hadoop2,Apache Spark,Hive,Hadoop2,使用简单的select*from表查询在Spark上运行配置单元运行平稳,但在连接和求和时,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_RP

使用简单的select*from表查询在Spark上运行配置单元运行平稳,但在连接和求和时,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
我已经尝试增加纱线容器内存分配和减少spark内存,但没有成功

使用: Hadoop 2.9.2 Spark 2.3.0 蜂巢2.3.4

感谢您的帮助。

事实证明,Spark上的Hive存在很多实现问题,除非您编写自己的自定义Hive连接器,否则根本无法工作。简而言之,Spark开发人员正在努力跟上Hive版本的步伐,他们还没有决定如何处理向后兼容性,即如何加载Hive版本~<2,同时关注最新的分支

解决 1返回蜂巢1.x

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

2在Tez上使用蜂箱

这是我们决定采用的*此解决方案不会破坏开源堆栈*并与Spark on Thread完美配合。第三方Hadoop生态系统,比如Azure、AWS和Hortonworks的生态系统,都添加了专有代码,只是为了在Spark上运行Hive,因为它变得一团糟

通过安装Tez,Hadoop查询的工作方式如下:

直接配置单元查询(例如来自DBeaver的jdbc连接)将在集群上运行一个Tez容器 Spark作业将能够正常访问配置单元元存储,并在创建SparkSession.builder.enableHiveSupport.getOrCreate时使用群集上的Spark容器。这是pyspark代码 在Tez上安装蜂巢,并在纱线上安装火花 注:我会保持简短,因为我没有看到这些董事会有多大的兴趣。询问详细情况,我很乐意提供帮助和扩展

版本矩阵

Hadoop是以集群模式安装的

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

基本指南

从源代码中编译Tez,如中所述,模式A用于共享hadoop JAR。不要使用任何预编译的Tez发行版。通过配置单元外壳使用一个简单的查询来测试它,该查询不是简单的数据访问,即只是一个选择。例如,使用:从myDb.myTable中选择count*。您应该可以从蜂巢控制台看到Tez条。 从源代码编译Spark。为此,重要提示:下载标有without hadoop!!,但在编译之前,请在./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala编辑源代码,并注释掉以下行:ConfVars.hive\u STATS\u JDBC\u TIMEOUT->TimeUnit.SECONDS, 在$SPARK\u HOME/conf/dir中共享$HIVE\u HOME/conf/HIVE-site.xml。您必须制作此配置文件的硬拷贝,而不是符号链接。原因是您必须从中删除所有与Tez相关的配置单元配置值,以确保Spark与Tez独立共存,如上所述。这确实包括hive.execution.engine=tez属性,该属性必须为空。只需将其从Spark的hive-site.xml中完全移除,同时将其保留在hive的hive-site.xml中。 在$HADOOP_HOME/etc/HADOOP/mapred-site.xml中,设置属性mapreduce.framework.name=thread。即使未设置为Thread tez,这两种环境也会正确拾取。这只是意味着原始mapreduce作业不会在Tez上运行,而Hive作业确实会使用它。这只是遗留作业的问题,因为原始映射已过时。
祝你好运

这是6个月前提出的问题。希望这能帮助别人。 此错误的原因是配置单元版本2.x中添加的SPARK_RPC_服务器_地址,SPARK默认支持配置单元1.2.1

我能够使用EMR 5.25集群Hadoop 2.8.5、hive 2.3.5和spark 2.4.3启用spark上的hive,以便在纱线上运行。然而,手册需要更新,它缺少一些关键项目

要使用纱线模式运行纱线客户端或纱线集群,请将以下jar链接到HIVE_HOME/lib。手册没有提到链接上一个库spark-unsafe.jar 允许Thread在节点上缓存必要的spark dependency JAR,以便在应用程序每次运行时都不需要分发它。 Hive 2.2.0,将$SPARK_HOME/jars中的所有JAR上载到hdfs文件夹,并在Hive-site.xml中添加以下内容 此外,还需要将以下内容添加到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交互的更多信息,请检查此项。

对于在spark上难以设置hive的用户,可以访问以在aws emr上获取hive metastore版本,可以运行以下查询:/usr/lib/hive/bin/schematool-dbType mysql-u-p-info并查找hive分发版本
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
<property>
  <name>spark.yarn.jars</name>
  <value>hdfs://xxxx:8020/spark-jars/*</value>
</property>
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.sql.hive.metastore.version        2.3.0;
spark.sql.hive.metastore.jars       /usr/lib/hive/lib/*:/usr/lib/hadoop/client/*