Spark 读取Hbase 映射到Hive中的外部表报java.lang.NoSuchMethodError: org.apache.hadoop.hive.serde2.lazy.LazySim

2 篇文章 0 订阅
错误信息
java.lang.NoSuchMethodError: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.initSerdeParams(Lorg/apache/hadoop/conf/Configuration;Ljava/util/Properties;Ljava/lang/String;)Lorg/apache/hadoop/hive/serde2/lazy/LazySimpleSerDe$SerDeParameters;
    at org.apache.hadoop.hive.hbase.HBaseSerDeParameters.<init>(HBaseSerDeParameters.java:93)
    at org.apache.hadoop.hive.hbase.HBaseSerDe.initialize(HBaseSerDe.java:92)
    at org.apache.hadoop.hive.serde2.AbstractSerDe.initialize(AbstractSerDe.java:53)
    at org.apache.hadoop.hive.serde2.SerDeUtils.initializeSerDe(SerDeUtils.java:521)
    at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:391)
    at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:276)
    at org.apache.hadoop.hive.ql.metadata.Table.getDeserializer(Table.java:258)
    at org.apache.hadoop.hive.ql.metadata.Table.getCols(Table.java:605)
    at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1$$anonfun$apply$11.apply(HiveClientImpl.scala:377)
    at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1$$anonfun$apply$11.apply(HiveClientImpl.scala:373)
    at scala.Option.map(Option.scala:146)
    at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1.apply(HiveClientImpl.scala:373)
	at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$getTableOption$1.apply(HiveClientImpl.scala:371)
    at org.apache.spark.sql.hive.client.HiveClientImpl$$anonfun$withHiveState$1.apply(HiveClientImpl.scala:290)
	at org.apache.spark.sql.hive.client.HiveClientImpl.liftedTree1$1(HiveClientImpl.scala:231)
	at org.apache.spark.sql.hive.client.HiveClientImpl.retryLocked(HiveClientImpl.scala:230)
	at org.apache.spark.sql.hive.client.HiveClientImpl.withHiveState(HiveClientImpl.scala:273)
	at org.apache.spark.sql.hive.client.HiveClientImpl.getTableOption(HiveClientImpl.scala:371)
	at org.apache.spark.sql.hive.client.HiveClient$class.getTable(HiveClient.scala:74)
	at org.apache.spark.sql.hive.client.HiveClientImpl.getTable(HiveClientImpl.scala:79)
	at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$org$apache$spark$sql$hive$HiveExternalCatalog$$getRawTable$1.apply(HiveExternalCatalog.scala:118)
	at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$org$apache$spark$sql$hive$HiveExternalCatalog$$getRawTable$1.apply(HiveExternalCatalog.scala:118)
	at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:97)
	at org.apache.spark.sql.hive.HiveExternalCatalog.org$apache$spark$sql$hive$HiveExternalCatalog$$getRawTable(HiveExternalCatalog.scala:117)
    at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$getTable$1.apply(HiveExternalCatalog.scala:648)
	at org.apache.spark.sql.hive.HiveExternalCatalog$$anonfun$getTable$1.apply(HiveExternalCatalog.scala:648)
    at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:97)
    at org.apache.spark.sql.hive.HiveExternalCatalog.getTable(HiveExternalCatalog.scala:647)
    at org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupRelation(SessionCatalog.scala:681)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.org$apache$spark$sql$catalyst$analysis$Analyzer$ResolveRelations$$lookupTableFromCatalog(Analyzer.scala:640)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.resolveRelation(Analyzer.scala:595)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:625)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:618)
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:62)
	at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$resolveOperators$1.apply(LogicalPlan.scala:62)
    at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperators(LogicalPlan.scala:61)
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$1.apply(LogicalPlan.scala:59)
	at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan$$anonfun$1.apply(LogicalPlan.scala:59)
    at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:306)
	at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187)
	at org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:304)
	at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperators(LogicalPlan.scala:59)
	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:618)
	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:564)
	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:69)
	at org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:67)
	at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:50)
	at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:66)
	at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:623)
	at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:691)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLDriver.run(SparkSQLDriver.scala:62)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.processCmd(SparkSQLCLIDriver.scala:340)
	at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:376)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver$.main(SparkSQLCLIDriver.scala:248)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.main(SparkSQLCLIDriver.scala)
	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.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
错误背景

spark 与hbase集成时,当用spark sql 去查询Hbase映射到hive中的外部表时报这个错误,这个错误咋一看以为是缺包问题,遂检查是不是hbase 中有的包没有放到spark/jars下面来,但是没有发现自己少包呀。于是一狠心就Hbase 下的 hbase-*.jar包都拷贝到spark下来,同时将hive-hbase-handler-1.2.1.jar 和htrace-core-2.04.jar拷贝过来。详见如下

  • hbase-*.jar
  • hive-hbase-handler-1.2.1.jar
  • htrace-core-2.04.jar

当我把包都拷完后依然报这个错误,顿时一脸懵逼呀,于是去网上搜索原因,百度基本搜索不出来我类似的问题,于是动用核武器,采用google搜索,google在英文领域果然效果好,能找到相关度很高的问题,spark的邮件列表也有这个问题,但是没有给出解决方案看来还是有不少人也遇到这个问题,总结这些答案,基本上俩个解决办法一个是少包,一个是版本不兼容,但是我看视频,我和老师用的版本是一样的,老师能行为什么我不行,所以我不想换掉hive的版本,很麻烦,又得重新导数据。顺便说下我的spark,hbase,hive的版本,供大家参考下

组件名称版本号
spark2.2.0
hbase0.98.6-cdh5.3.0
hive0.13.1-cdh5.3.0

由于错误还没有解决,网上又找不到好的解决办法,于是我尝试自己解决,由于报找不到这个方法,于是我找到这个类所在的jar包,如下命令搜索是否有这个方法

javap -classpath hive-serde-0.13.1.jar org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | grep initSerdeParams

搜索结果如下:

public static org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe$SerDeParameters initSerdeParams(org.apache.hadoop.conf.Configuration, java.util.Properties, java.lang.String) throws org.apache.hadoop.hive.serde2.SerDeException;

图片版
图片版
说明这个类有这个方法呀,于是我干脆一不做二不休将hive-serde-0.13.1.jar 拷贝到spark目录下,结果奇迹出现了,spark-sql 可以顺利读取hbase表的内容了。

解决方案

将hive/lib目录下的hive-serde-0.13.1.jar拷贝到spark/jars目录下(前提是前面改拷的包都拷贝了)

参考资料

Cloudera 问题列表
spark问题邮件列表
GitHub issue
版本问题回答

### 回答1: 这个错误是因为Spark无法找到HBase的配置文件。可能是因为HBase的依赖库没有正确地添加到Spark的classpath。您需要确保在Spark的classpath包含了HBase的依赖库,或者将HBase的依赖库添加到Spark的lib目录。 ### 回答2: 在使用Spark读取HBase的时候,如果出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”的报错,一般是由于缺少了HBase依赖包或者版本不匹配导致的。 解决方法如下: 1. 确认HBase依赖包是否存在,以及是否与Spark版本兼容。 可以通过以下两种方式解决: ① 直接将HBase的依赖包复制到Spark的lib目录。具体操作:将HBasehbase-client-xxx.jar和hbase-common-xxx.jar复制到Spark的安装目录下的lib目录即可。 ② 修改Spark的pom.xml文件,添加HBase的依赖。具体操作:在Spark源码根目录的pom.xml文件添加以下代码: <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>x.x.x</version> </dependency> 注意:x.x.x表示HBase的版本号,需要根据实际情况替换。 2. 确认HBase配置文件是否正确。 如果上述方法解决不了问题,可能是HBase的配置文件不正确导致的。请确认HBasehbase-site.xml文件是否有以下配置项: <property> <name>hbase.client.keyvalue.maxsize</name> <value>2097152</value> </property> 如果没有,请手动添加并重启HBase服务。 3. 确认系统环境变量是否正确。 如果上述方法都没有解决问题,可以检查系统的环境变量是否正确。请确认系统的HADOOP_CLASSPATH、JAVA_HOME、HBASE_HOME和SPARK_HOME环境变量是否正确设置,以及是否包含了HBaseSpark的相关依赖。 综上所述,出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”报错,在排查的过程需要关注HBase依赖包、配置文件和系统环境等多方面的原因。需要进行彻底的排查才能找到问题的症结并解决问题。 ### 回答3: 在 Spark 读取 HBase 时,可能会出现“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”这个错误。这是因为在 Spark 没有找到一些必需的 HBase 的类文件,导致无法成功读取 HBase 数据。 解决此问题的步骤如下: 第一步:检查 Classpath 环境变量 请确保 Classpath 环境变量包含 HBaseHadoop 的 JAR 文件的路径。因为这两个框架的配置文件都被加载到这些 JAR 文件,如果 Spark 找不到它们,就会导致错误。 如果 Classpath 设置正确,那么需要检查 Spark 主节点的 Spark 配置是否包含 HBaseHadoop 的 JAR 文件。 这可以通过将 HBaseHadoop JAR 文件置于 Spark 的 lib 目录来实现。可以使用以下命令检查 SPARK_HOME/lib 目录是否存在 HBaseHadoop 的 JAR 文件: $ ls $SPARK_HOME/lib | grep -i hbase $ ls $SPARK_HOME/lib | grep -i hadoop 第二步:检查 HBASE_CLASSPATH 环境变量 如果在环境变量HBASE_CLASSPATH 设置为包含配置文件的路径,那么 Spark 可能不会找到它们。 要更正此错误,请确保在 Shell 运行 HBase 脚本时也加载了这些配置文件。可以通过将 HBase 目录添加到 HBASE_CLASSPATH 环境变量来实现,例如: $ export HBASE_CLASSPATH=$HBASE_HOME/conf 第三步:操作系统权限问题 还有可能出现因操作系统权限不足而导致无法读取 HBase 数据的情况。此时,可以修改文件的权限以解决此问题。可以使用以下命令检查当前目录下的权限: $ ls -ld $PWD 如果权限不正确,可以使用以下命令更正: $ chmod 777 $PWD 总之,如果 Spark 在从 HBase 读取数据时遇到“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”错误,需要按照上述步骤检查并修复问题,以确保 Spark 可以顺利地从 HBase 读取数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值