spark上的配置单元错误java.lang.nosuchfielderror:spark\u rpc\u服务器\u地址

yrdbyhpb  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(805)

用一个简单的 select * from table 查询运行平稳,但在连接和求和时,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 hive 2.3.4
谢谢你的帮助。

cqoc49vn

cqoc49vn1#

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

解决方案

1) 回到Hive1.x
不太理想。尤其是如果你想与文件格式(如orc)进行更现代的集成。
2) 在tez上使用Hive
这是我们决定采用的。 *This solution does not break the open source stack* 与Yarn上的Spark完美结合。第三方hadoop生态系统,比如azure、aws和hortonworks都添加了专有代码,只用于在spark上运行hive,因为它变得一团糟。
通过安装tez,hadoop查询的工作方式如下:
直接的配置单元查询(例如来自dbeaver的jdbc连接)将在集群上运行一个tez容器
spark作业将能够正常访问配置单元元存储,并在创建配置单元时使用集群上的spark容器 SparkSession.builder.enableHiveSupport().getOrCreate() (这是pyspark代码)

在tez上安装Hive,Yarn上有Spark

注:我将保持简短,因为我看不出有多少兴趣在这些董事会。询问细节,我很乐意提供帮助和扩展。
版本矩阵

Hadoop   2.9.2
Tez      0.9.2
Hive     2.3.4
Spark    2.4.2

hadoop是以集群模式安装的。
这就是我们的工作。我不希望它在切换到hadoop3.x时能够无缝工作,我们将在将来的某个时候这样做,但是如果您不更改每个组件的主发布版本,它应该可以正常工作。
基本指南
从官方安装指南中的源代码处编译tez,使用共享hadoopjar的模式a。不要使用任何预编译的tez发行版。用一个简单的查询来测试它,这个查询不是一个简单的数据访问(即,只是一个select)。例如,使用: select count(*) from myDb.myTable . 你应该从Hive控制台看到tez条。
从源代码编译spark。要做到这一点,请遵循官方指南(重要提示:下载标有without hadoop!!)的归档文件,但在编译之前,请在 ./sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveUtils.scala 并注解掉以下行: ConfVars.HIVE_STATS_JDBC_TIMEOUT -> TimeUnit.SECONDS, 分享 $HIVE_HOME/conf/hive-site.xml ,在您的 $SPARK_HOME/conf/ 目录。必须制作此配置文件的硬拷贝,而不是符号链接。原因是您必须从中删除所有与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=yarn . 即使未设置为 yarn-tez . 这只是意味着原始mapreduce作业不会在tez上运行,而hive作业确实会使用它。这只是遗留作业的问题,因为原始Map已过时。
祝你好运!

y3bcpkx1

y3bcpkx12#

这是6个月前问的。希望这能帮助别人。此错误的原因是在配置单元版本2.x中添加的spark\u rpc\u server\u地址,默认情况下spark支持配置单元1.2.1。
我能够在emr5.25集群(hadoop2.8.5、hive2.3.5、spark 2.4.3)上使用本手册启用hiveonspark,以便在yarn上运行。然而,手册需要更新,它缺少一些关键项目。
要使用yarn模式(yarn client或yarn cluster)运行,请将以下jar链接到hive\u home/lib。手册没有提到链接最后一个库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

允许yarn在节点上缓存必要的spark依赖jar,这样在应用程序每次运行时就不需要分发它。hive 2.2.0,将$spark\u 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 metastore交互的更多信息,请查看此链接。

相关问题