gpt4 book ai didi

java - OrcRelation不可分配给HadoopFsRelation

转载 作者:搜寻专家 更新时间:2023-11-01 02:58:55 25 4
gpt4 key购买 nike

我正在尝试在配置单元表上运行SparkSql。但是这个问题我听不懂。这是我的代码:

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.hive.*;
import org.apache.spark.sql.SQLContext;
public class queryhive {
public static void main(String[] args)
{
//SparkSession sc = new SparkConf().setAppName("SparkSessionZipsExample").setMaster("local");
SparkConf sparkConf = new SparkConf().setAppName("SparkSessionZipsExample").setMaster("local");
JavaSparkContext scon = new JavaSparkContext(sparkConf);
SQLContext sqlContext = new SQLContext(scon);
String warehouseLocation = "file:${system:user.dir}/spark-warehouse";
SparkSession sc = SparkSession
.builder()
.appName("SparkSessionZipsExample")
.config("spark.sql.warehouse.dir", warehouseLocation)
.enableHiveSupport()
.getOrCreate();
HiveContext hc = new org.apache.spark.sql.hive.HiveContext(sc);
hc.sql("select count(*) from SparkHive.health");
Row[] results = (Row[]) sqlContext.sql("FROM src SELECT key, value").collect();
}
}

我得到的异常是:
17/02/16 16:36:51 INFO SparkSqlParser: Parsing command: select count(*) from SparkHive.health
Exception in thread "main" java.util.ServiceConfigurationError: org.apache.spark.sql.sources.DataSourceRegister: Provider org.apache.spark.sql.hive.orc.DefaultSource could not be instantiated
at java.util.ServiceLoader.fail(ServiceLoader.java:232)
at java.util.ServiceLoader.access$100(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at scala.collection.convert.Wrappers$JIteratorWrapper.next(Wrappers.scala:43)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.filterImpl(TraversableLike.scala:247)
at scala.collection.TraversableLike$class.filter(TraversableLike.scala:259)
at scala.collection.AbstractTraversable.filter(Traversable.scala:104)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:550)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass$lzycompute(DataSource.scala:86)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass(DataSource.scala:86)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:325)
at org.apache.spark.sql.execution.datasources.ResolveDataSource$$anonfun$apply$1.applyOrElse(rules.scala:58)
at org.apache.spark.sql.execution.datasources.ResolveDataSource$$anonfun$apply$1.applyOrElse(rules.scala:41)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:61)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:61)
at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperators(LogicalPlan.scala:60)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$1.apply(LogicalPlan.scala:58)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$1.apply(LogicalPlan.scala:58)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:331)
at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:188)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformChildren(TreeNode.scala:329)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperators(LogicalPlan.scala:58)
at org.apache.spark.sql.execution.datasources.ResolveDataSource.apply(rules.scala:41)
at org.apache.spark.sql.execution.datasources.ResolveDataSource.apply(rules.scala:40)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:85)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:82)
at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)
at scala.collection.immutable.List.foldLeft(List.scala:84)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:82)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:74)
at scala.collection.immutable.List.foreach(List.scala:381)
at org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:74)
at org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:64)
at org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:62)
at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:48)
at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:63)
at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:592)
at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:699)
at SparkHiveSql.sparkhivesql.queryhive.main(queryhive.java:27)
Caused by: java.lang.VerifyError: Bad return type
Exception Details:
Location:
org/apache/spark/sql/hive/orc/DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;[Ljava/lang/String;Lscala/Option;Lscala/Option;Lscala/collection/immutable/Map;)Lorg/apache/spark/sql/sources/HadoopFsRelation; @35: areturn
Reason:
Type 'org/apache/spark/sql/hive/orc/OrcRelation' (current frame, stack[0]) is not assignable to 'org/apache/spark/sql/sources/HadoopFsRelation' (from method signature)
Current Frame:
bci: @35
flags: { }
locals: { 'org/apache/spark/sql/hive/orc/DefaultSource', 'org/apache/spark/sql/SQLContext', '[Ljava/lang/String;', 'scala/Option', 'scala/Option', 'scala/collection/immutable/Map' }
stack: { 'org/apache/spark/sql/hive/orc/OrcRelation' }
Bytecode:
0x0000000: b200 1c2b c100 1ebb 000e 592a b700 22b6
0x0000010: 0026 bb00 2859 2c2d b200 2d19 0419 052b
0x0000020: b700 30b0

at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)
... 43 more
17/02/16 16:36:55 INFO SparkContext: Invoking stop() from shutdown hook
17/02/16 16:36:55 INFO SparkUI: Stopped Spark web UI at http://10.0.0.3:4040

我不知道为什么会这样。在运行该程序之前,我的HIVE工作正常,但现在根本无法工作。
是什么原因以及如何使以上代码运行?
我正在使用Eclispe IDE,我的Spark版本是2.1.0

最佳答案

您的类路径中最有可能发生版本冲突。为了了解发生了什么,我将简要解释Java服务提供者机制。

在Java中,服务提供者机制允许API指定一些(抽象)类,该类的API实现必须是子类。然后可以使用ServiceLoader查找提供程序类的实现。此类的示例是Java API中的JAXBContext。 JAXB本身就是您将在应用程序中使用的API,但是有多个JAXB实现(参考实现和EclipseLink Moxy)。抽象类(在此示例中为JAXBContext)是API的入口点。服务提供商机制可以找到实现的一种方法是通过类路径上的特殊文件夹META-INF/services中的文件。通常,您会在jar文件中找到此类文件夹。 services文件夹可以包含具有抽象提供程序类名称的文件。可能有多个此类文件。每个文件可以包含许多特定的类名称,这些名称是抽象类的实现。

因此,对于JAXB,您将在jar文件中找到文件名为javax.xml.bind.JAXBContext的文件。那就是抽象提供程序类的名称。然后,这些文件将包含列出JAXBContext实现的一行或多行,可以实例化这些行以向该提供程序提供条目。

让我们看看您的堆栈跟踪。在某个时候,一个名为DataSource的类希望找到实现。它发生在堆栈中:

at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:550)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass$lzycompute(DataSource.scala:86)
at org.apache.spark.sql.execution.datasources.DataSource.providingClass(DataSource.scala:86)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:325)
java.util.ServiceLoader类用于迭代通过上述机制注册的实现。它遍历实现列表,直到根据调用代码的某些条件找到某些内容为止。发生在这里:
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)

这是出问题的地方。有关此问题的详细信息,请参见以下部分:
Location:
org/apache/spark/sql/hive/orc/DefaultSource.createRelation(Lorg/apache/spark/sql/SQLContext;[Ljava/lang/String;Lscala/Option;Lscala/Option;Lscala/collection/immutable/Map;)Lorg/apache/spark/sql/sources/HadoopFsRelation; @35: areturn
Reason:
Type 'org/apache/spark/sql/hive/orc/OrcRelation' (current frame, stack[0]) is not assignable to 'org/apache/spark/sql/sources/HadoopFsRelation' (from method signature)
Current Frame:
bci: @35
flags: { }
locals: { 'org/apache/spark/sql/hive/orc/DefaultSource', 'org/apache/spark/sql/SQLContext', '[Ljava/lang/String;', 'scala/Option', 'scala/Option', 'scala/collection/immutable/Map' }
stack: { 'org/apache/spark/sql/hive/orc/OrcRelation' }

这需要一点点挖掘,但是您可以从中推断出发现了一个 org.apache.spark.sql.hive.orc.DefaultSource类,据称该类实现了呼叫的查找内容。创建它的一个实例,然后使用它调用 createRelation方法。至少根据抽象类,该方法的返回类型为 org.apache.spark.sql.sources.HadoopFsRelation。但是,返回的是一个 org.apache.spark.sql.hive.orc.OrcRelation类。如果它是HadoopFsRelation的子类,那很好,但显然不是。

最有可能发生这种情况的方式是,如果同一类的不同实现最终出现在类路径上,并且您获得的实现具有不同的方法返回类型或只是具有不同的(不兼容的)类层次结构。

我去寻找HadoopFsRelation类。可以在Spark up up 1.6.3版之前的 org.apache.spark.sql.sources包中找到它。在版本2.1.0中,它不再存在,因此我怀疑它已从2.x API开始删除。在1.6.3版中,您还将找到 org.apache.spark.sql.hive.orc.OrcRelation类,在该版本中,它确实实现了HadoopFsRelation。

现在到Spark版本2.1.0。找不到HadoopFsRelation类。我已经在与以前相同的程序包中(以及在Spark 2.1.0发行版的一部分jar jar-hive_2.11-2.1.0.jar中)找到了OrcRelation。直到现在,该类还没有实现HadoopFsRelation。

所以这是怎么回事。您尝试使用Hive在代码中使用Spark。您创建的 SQLContext类可能是从Spark 1.6.x(或早于2.x的其他版本)加载的。它去寻找DataSourceRegister实现(被列为服务提供者的类),并找到一个 META-INF/services/org.apache.spark.sql.sources.DataSourceRegister文件(或更可能是多个)。它决定需要的是实现 org.apache.spark.sql.hive.orc.DefaultSource。找到并实例化该类。到目前为止,一切都很好。然后,1.6.x代码在其上调用 createRelation并期望实现 HadoopFsRelation。但是,返回的 org.apache.spark.sql.hive.orc.OrcRelation从2.1.0版本(或2之后的任何版本)加载了其类,该类未实现HadoopFsRelation。

如果您已经安装了Spark 2.1.0并使用了它的库,然后添加了一些已下载的库,那么我敢打赌,您已经下载了2.x之前的版本。那些最终成为执行代码时的切入点,但是它们意外地找到了具有不同定义的较新类。您需要检查类路径上的内容并删除不正确的条目。最好删除与Spark,Hive和Hadoop相关的所有内容,并确保仅使用安装中的内容,或者通过Apache下载最新版本,检查是否根据其API编码并且仅使用这些jar。如果您需要任何其他功能,请确保它来自相同版本或与您使用的版本兼容的实用程序。

关于java - OrcRelation不可分配给HadoopFsRelation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42272479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com