使用简单的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 上运行。但是,手册需要更新,它缺少一些关键项目。
- 要使用 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
- 允许 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时无缝工作,我们将在将来的某个时候这样做,但是如果您不更改每个组件的主发布版本,它应该可以正常工作。
基本指南
- 按照官方安装指南中的说明从源代码编译 Tez,模式 A 用于共享 hadoop jar。不要使用任何预编译的 Tez 发行版。通过 hive shell 使用简单的查询对其进行测试,该查询不是简单的数据访问(即只是一个选择)。例如,使用:
select count(*) from myDb.myTable
.应会看到配置单元控制台中的 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 相关的 Hive 配置值,以确保 Spark 与 Tez 独立共存,如上所述。这确实包括必须留空的hive.execution.engine=tez
属性。只需将其从 Spark 的蜂巢站点.xml中完全移除,同时将其保留在 Hive 的蜂巢站点.xml。 - 在
$HADOOP_HOME/etc/hadoop/mapred-site.xml
设置属性mapreduce.framework.name=yarn
.即使它未设置为yarn-tez
,两个环境也会正确选取它。这只是意味着原始mapreduce作业不会在Tez上运行,而Hive作业确实会使用它。这仅适用于旧版作业,因为原始映射已过时。
祝你好运!