Spark操作hive异常:Two non-abstract methods “public int scala.collection.TraversableOnce.size()“ have the

文章讲述了在使用Spark操作Hive时遇到的NoClassDefFoundError和InternalCompilerException异常,原因在于spark-sql和janino版本间的依赖冲突。作者通过添加缺失依赖并解决版本冲突,成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用Spark操作hive是遇到一个异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException
	at org.apache.spark.sql.catalyst.expressions.codegen.CodegenContext.addMutableState(CodeGenerator.scala:275)
	at org.apache.spark.sql.execution.InputRDDCodegen.doProduce(WholeStageCodegenExec.scala:458)
	at org.apache.spark.sql.execution.InputRDDCodegen.doProduce$(WholeStageCodegenExec.scala:456)
	at org.apache.spark.sql.execution.InputAdapter.doProduce(WholeStageCodegenExec.scala:496)
	at org.apache.spark.sql.execution.CodegenSupport.$anonfun$produce$1(WholeStageCodegenExec.scala:95)
	at org.apache.spark.sql.execution.SparkPlan.$anonfun$executeQuery$1(SparkPlan.scala:213)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)..............

我这原本涉及该问题的相关依赖是这些:

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>

查阅资料说缺少相关依赖,于是加上该依赖:

       <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.0.8</version>
        </dependency>

添加完依赖记得重新加载一下

 再运行代码又出了个新异常:

2023-08-07 21:22:59,172{yy/MM/ddorg.codehaus.janino.InternalCompilerException: Compiling "GeneratedClass": Two non-abstract methods "public int scala.collection.TraversableOnce.size()" have the same parameter types, declaring type and return type
	at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:361)
	at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:234)
	at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:446)
	at org.codehaus.janino.ClassBodyEvaluator.compileToClass(ClassBodyEvaluator.java:313)
	at org.codehaus.janino.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:235)
	at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:204)
	at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:80)
	at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$.org$apache$spark$sql$catalyst$expressions$codegen$CodeGenerator$$doCompile(CodeGenerator.scala:1370)
	at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1467)
	at org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1464)
	at org.sparkproject.guava.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3599).................

这是因为上述两个依赖间发生了冲突,在这里可以查看到spark-sql_2.12冲突部分版本是3.0.16,

而我刚刚添加的依赖版本是3.0.8,所以为了解决冲突需要把spark-sql_2.12冲突部分排除掉,新加的依赖要和spark-sql_2.12里版本一致,即3.0.16版本的janino

 现在这两个依赖改为下面这样:

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.janino</groupId>
                    <artifactId>janino</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.codehaus.janino</groupId>
                    <artifactId>commons-compiler</artifactId>
                </exclusion>
            </exclusions>
</dependency>
<dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>3.0.16</version>
</dependency>

重新加载一下依赖,问题成功解决

<think>嗯,用户现在遇到了另一个问题,是关于Spark的警告信息:“Warning: Ignoring non-Spark config property: hive.metastore.uris”。之前他们遇到了数据库hive不存在的问题,现在可能是在尝试配置Hive元存储时出现了这个警告。我需要先理解这个警告的原因,然后给出解决方法。 首先,这个警告的意思是Spark在配置过程中忽略了一个不属于Spark配置项的属性,也就是hive.metastore.uris。用户可能在SparkSession的配置中直接使用了这个属性,但Spark并不识别,导致配置被忽略。接下来要分析为什么会发生这种情况,以及如何正确配置Hive的元存储地址。 可能的原因是,用户在使用SparkSession.Builder.config()方法时,直接传入了Hive的配置属性,如hive.metastore.uris,而Spark期望的是以spark.hadoop.开头的Hadoop配置,或者是通过其他方式传递Hive的配置。正确的做法应该是将这些Hive相关的配置以Hadoop配置的形式传递,或者在hive-site.xml文件中设置。 接下来需要验证用户可能的配置方式。比如,用户可能写了类似这样的代码: spark = SparkSession.builder \ .appName("App") \ .config("hive.metastore.uris", "thrift://localhost:9083") \ .enableHiveSupport() \ .getOrCreate() 这里的问题在于直接使用了hive.metastore.uris作为配置项,而Spark不会直接识别,因此会被忽略,导致警告出现。正确的做法应该是在配置项前加上spark.hadoop.前缀,或者将Hive的配置放在hive-site.xml文件中。 此外,用户可能没有正确创建hive-site.xml文件,或者文件的位置不正确,导致Spark无法读取到Hive的配置。需要检查hive-site.xml是否在Spark的conf目录下,并且配置正确。 解决方案方面,应该建议用户通过spark.hadoop.前缀来传递Hive配置,或者使用hive-site.xml文件。例如,修改代码中的.config("spark.hadoop.hive.metastore.uris", "thrift://localhost:9083"),或者将配置写入hive-site.xml并放置在正确的位置。 同时,需要提醒用户检查Hive元存储服务是否确实在运行,并且端口是否正确。可能用户启动了Hive服务,但端口不是默认的9083,或者网络配置有问题,导致Spark无法连接。 最后,可能需要用户验证配置是否生效,可以通过spark.sql("SET -v").show()来查看当前的配置参数,确认hive.metastore.uris是否正确设置。或者通过执行一个简单的Hive查询,比如spark.sql("SHOW DATABASES").show(),看是否能够正常访问Hive的元数据。 总结来说,这个警告的出现是因为配置方式不正确,需要调整配置项的传递方式,或者使用正确的配置文件。同时需要确保Hive服务正常运行,配置正确,网络可达。</think>--- ### **警告含义** 当你在 Spark 配置中直接设置 `hive.metastore.uris` 时,Spark 会提示 `Ignoring non-Spark config property`,表示 **Spark 不识别此配置项**。这是因为 `hive.metastore.uris` 是 Hive 的配置属性,而非 Spark 原生支持的配置项,直接通过 Spark 的 `config()` 方法设置会被忽略。 --- ### **原因分析** 1. **配置项命名规则不匹配** Spark 的配置项通常以 `spark.` 开头,而 `hive.metastore.uris` 是 Hive 的配置参数。直接通过 `SparkSession.builder.config()` 设置时,Spark 无法识别它,因此会忽略并抛出警告。 2. **配置未传递给底层 Hive 库** 即使启用了 `enableHiveSupport()`,Spark 也不会自动将非 `spark.` 开头的配置传递给 Hive。需要显式指定这些配置的归属(例如通过 `spark.hadoop.` 前缀)。 --- ### **解决方案** #### **方法 1:通过 `spark.hadoop.` 前缀传递 Hive 配置** 在 Spark 配置中,使用 `spark.hadoop.` 前缀将 Hive 属性传递给底层的 Hadoop 配置: ```python spark = SparkSession.builder \ .appName("YourApp") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .config("spark.hadoop.hive.metastore.uris", "thrift://localhost:9083") \ # 关键修改 .enableHiveSupport() \ .getOrCreate() ``` #### **方法 2:使用 `hive-site.xml` 文件** 将 Hive 的配置文件 `hive-site.xml` 放到 Spark 的配置目录(如 `$SPARK_HOME/conf`)中,Spark 会自动读取该文件的配置。这是 Hive 集成的推荐方式。 文件内容示例: ```xml <configuration> <property> <name>hive.metastore.uris</name> <value>thrift://localhost:9083</value> </property> </configuration> ``` #### **方法 3:通过 `--conf` 参数传递(Spark Submit 场景)** 如果使用 `spark-submit` 提交作业,可以通过 `--conf` 指定配置: ```bash spark-submit \ --conf "spark.hadoop.hive.metastore.uris=thrift://localhost:9083" \ your_script.py ``` --- ### **验证配置是否生效** 在代码中检查配置是否被正确加载: ```python # 打印所有 Hive 相关配置 spar
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值