我正在尝试在配置单元表上运行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工作得很好,但是现在它根本不工作了。
原因是什么?我是如何运行上述代码的?
我使用的是eclispeide,我的spark版本是2.1.0
1条答案
按热度按时间w1e3prcc1#
类路径中很可能存在版本冲突。为了理解发生了什么,我将简要地解释java服务提供者机制。
在java中,服务提供者机制允许api指定api的实现必须子类化的一些(抽象)类。一
ServiceLoader
然后可以用来查找提供者类的实现。这个类的一个例子是javaapi中的jaxbcontext。jaxb本身就是api,您可以在应用程序中使用它,但是有多个jaxb实现(一个参考实现和eclipselink moxy)。抽象类(本例中为jaxbcontext)是api的入口点。服务提供程序机制可以找到实现的一种方法是通过类路径上特殊文件夹中的文件:META-INF/services
. 您通常会在jar文件中找到这样的文件夹。服务文件夹可以包含具有抽象提供程序类名称的文件。可能有多个这样的文件。每个文件可以包含任意数量的特定类名,这些类名是抽象类的实现。所以,对于jaxb,可以找到文件名为
javax.xml.bind.JAXBContext
在jar文件中。这是抽象提供程序类的名称。然后,这些文件将包含一行或多行jaxbcontext的实现列表,这些实现可以被示例化以向该提供者提供一个条目。让我们看看你的堆栈跟踪。在某个时刻,一个叫做
DataSource
希望找到实现。它发生在堆栈中:这个
java.util.ServiceLoader
类用于迭代通过上述机制注册的实现。它遍历实现列表,直到根据调用代码的某些条件找到一些东西。发生在这里:这就是问题所在。该问题的细节见本部分:
这需要一点挖掘,但你可以从中推断出
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直到1.6.3版本的软件包中找到
org.apache.spark.sql.sources
. 在版本2.1.0中它已经不存在了,所以我怀疑它已经从2.xapi中删除了。在版本1.6.3中,您还可以找到类org.apache.spark.sql.hive.orc.OrcRelation
在那个版本中,它确实实现了hadoopfsrelation。现在是spark 2.1.0版。没有找到类hadoopfsrelation。我在与以前相同的包(以及spark 2.1.0发行版的jar spark-hive2.11-2.1.0.jar)中找到了orcrational。只是现在类没有实现hadoopfsrelation。
所以发生的事情是这样的。您尝试在代码中使用spark和hive。这个
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.1.0版之后的任何版本)加载的,该版本不实现hadoopfsrelation。如果您已经安装了spark 2.1.0并使用了它的库,然后添加了一些您下载的库,那么我打赌您已经下载了一些2.x以前的版本。它们最终成为执行代码时的入口点,但它们意外地发现了具有不同定义的较新类。您需要检查类路径上的内容并删除不正确的条目。最好删除与spark、hive和hadoop相关的所有内容,确保只使用安装中的内容,或者通过apache下载最新版本,检查您是否根据其api编写代码,并且只使用那些jar。如果您需要任何额外的东西,请确保它来自同一版本或它的一些实用程序与您正在使用的版本兼容。