使用 Spark 2.2.0 从 Hive Metastore 2.x 读取 [重复]

Posted

技术标签:

【中文标题】使用 Spark 2.2.0 从 Hive Metastore 2.x 读取 [重复]【英文标题】:Use Spark 2.2.0 to read from Hive metastore 2.x [duplicate] 【发布时间】:2017-07-26 10:28:36 【问题描述】:

在 2.2.0 版本之前,Spark 无法与 Hive 2.X 通信,因此我无法使用 Hive 1 + Spark 1/2。对于我在这两个方面所读到的内容:

https://issues.apache.org/jira/browse/SPARK-18112 https://spark.apache.org/releases/spark-release-2-2-0.html

现在可以使用 Spark 2 + Hive 2,但我仍然面临一些问题。使用预编译的 Spark-without-hadoop,在访问临时配置单元表时出现以下错误:

线程“main”java.lang.IllegalArgumentException 中的异常:无法使用 Hive 支持实例化 SparkSession,因为找不到 Hive 类。 在 org.apache.spark.sql.SparkSession$Builder.enableHiveSupport(SparkSession.scala:845) 在 io.bigdatabenchmark.v2.queries.q05.LogisticRegression$.main(LogisticRegression.scala:87) 在 io.bigdatabenchmark.v2.queries.q05.LogisticRegression.main(LogisticRegression.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我通常通过使用选项“-Phive -Phive-thriftserver”编译我自己的 Spark 版本来解决此问题,但默认情况下,Spark 将使用 Hive 1.2.1 绑定进行构建,如文档中所示。

所以,Spark 2.2.0 似乎解决了 Spark 2 -> Hive 2 绑定的问题,但我找不到合适的方法来编译它,以便它可以访问具有架构 2.x 的元存储。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

将以下依赖项添加到您的 maven 项目中。

<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.11</artifactId>
        <version>2.2.0</version>
        <scope>provided</scope>
</dependency>

【讨论】:

在常规文件夹 (/spark-2.2.0/pom.xml) 和 sql 项目中的 pom.xml 中添加新依赖项时,我无法完成编译(/spark-2.2.0/sql/hive/pom.xml)。在这两个测试中,我收到以下错误:[error] /home/alejandro/Documents/projects/spark/spark-2.2.0/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveStrategies.scala:165: type mismatch; [error] found : org.apache.spark.sql.catalyst.catalog.CatalogTable [error] required: org.apache.spark.sql.hive.MetastoreRelation 我已经更新了答案中的依赖关系。让我知道这是否有帮助。 这次编译成功完成,但是当尝试从 Metastore 读取时,我得到:Exception in thread "main" java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found. 可能我将依赖项放在它不属于的地方。 你在使用 spark-submit 吗? 是的,在一堆罐子旁边。

以上是关于使用 Spark 2.2.0 从 Hive Metastore 2.x 读取 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

初次启动hive,解决 ls: cannot access /home/hadoop/spark-2.2.0-bin-hadoop2.6/lib/spark-assembly-*.jar: No su

使用 spark-submit 无法从 hive 中找到表

Spark上的Hive如何从jdbc读取数据?

无法从 impala/hive/spark sql 访问“spark 注册表”

使用 API 而不是 SQL 从 Spark 创建 Hive 表?

无法从 spark 创建 Hive 表