解决:Spark-HBASE Error Caused by: java.lang.IllegalStateException: unread block data

在Spark-2.1.0-bin-hadoop2.7环境中,通过Spark-SQL连接HBase时遇到'java.lang.IllegalStateException: unread block data'错误。通过在spark-env.sh中添加HIVE_HOME、HBASE_HOME等环境变量,并在hive-site.xml中配置相关jar路径,问题仍未解决。最终,通过在spark-sql命令行使用--jars选项指定相关HBase库解决该问题,避免每次运行时手动输入长串jar路径。这提供了一种更便捷的方式来连接HBase和Spark进行数据操作。

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

参考:1 http://stackoverflow.com/questions/31701273/setting-spark-classpaths-on-ec2-spark-driver-extraclasspath-and-spark-executor

参考:2 http://stackoverflow.com/questions/34901331/spark-hbase-error-java-lang-illegalstateexception-unread-block-data

参考:3 http://blog.youkuaiyun.com/wzq294328238/article/details/48054525


1 基本环境:spark-2.1.0-bin-hadoop2.7,apache-hive-1.2.2,Hbase 1.3.1

2 问题描述:通过spark-sql连接hbase出现错误,Caused by: java.lang.IllegalStateException: unread block data。

spark-env.sh:

export HIVE_HOME=/root/apache-hive-1.2.2-bin
export HBASE_HOME=/root/hbase-1.3.1
export SCALA_HOME=/usr/share/scala
export JAVA_HOME=/usr/java/jdk1.7.0_79
export SPARK_MASTER_IP=centos01
export SPARK_WORKER_MEMORY=4G
export HADOOP_CONF_DIR=/root/hadoop-2.7.3/etc/hadoop
export JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true"
#export SPARK_CLASSPATH=$HIVE_HOME/lib:$SPARK_CLASSPATH
export SPARK_MEM=512M
export LD_LIBRARY_PATH=/root/hadoop-2.7.3/lib/native


hive-site.xml:

<configuration>
 <!--配置连接的URL,现在我们的mysql安装在了itcast05上了,因此我们改成itcast05>,如果hive库不存在我们创建它-->
 <property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://centos03:3306/hive?createDatabaseIfNotExist=true</value>
   <description>JDBC connect string for a JDBC metastore</description>
 </property>
 <!--连接驱动-->
 <property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>com.mysql.jdbc.Driver</value>
   <description>Driver class name for a JDBC metastore</description>
 </property>
 <!--连接数据库的用户名-->
 <property>

   <name>javax.jdo.option.ConnectionUserName</name>
   <value>...</value>
   <description>username to use against metastore database</description>
 </property>
 <!--连接数据库的密码-->
 <property>
   <name>javax.jdo.option.ConnectionPassword</name>
   <value>...</value>
   <description>password to use against metastore database</description>
 </property>
<property>
<name>hive.aux.jars.path</name>
<value>file:///root/apache-hive-1.2.2-bin/lib/mysql-connector-java-5.1.41-bin.jar,file:///root/hbase-1.3.1/lib/activation-1.1.jar,file:///root/hbase-1.3.1/lib/aopalliance-1.0.jar,file:///root/hbase-1.3.1/lib/apacheds-i18n-2.0.0-M15.jar,file:///root/hbase-1.3.1/lib/apacheds

### HBase 中 `InvocationTargetException` 的原因及解决方案 #### 一、异常概述 在 Java 调用 HBase 过程中,可能会遇到 `java.lang.reflect.InvocationTargetException` 异常。该异常通常是由底层方法调用失败引发的反射机制错误[^1]。 --- #### 二、常见原因分析 1. **JDK 版本不兼容** 如果使用的 JDK 版本与 HBase 所需版本不符,则可能导致此类异常。例如,在 IDEA 开发环境中,如果项目配置了较高版本的 JDK(如 JDK 11),而 HBase 需要较低版本(如 JDK 1.8),则可能触发此问题[^2]。 2. **Maven 依赖冲突** 当 Maven 工程中的依赖项顺序不当或存在重复导入时,也可能导致异常。具体来说,如果 `hdfs-client` 的引入优先级低于 `hbase-client`,那么前者可能会被后者覆盖,从而引起运行时错误[^3]。 --- #### 三、解决方法 1. **调整 JDK 版本** - 在开发工具(如 IntelliJ IDEA)中确认当前项目的 JDK 设置是否满足 HBase 官方文档的要求。 - 方法:右键点击项目 -> 按下 F4 键进入模块设置界面 -> 修改 Project SDK 和 Module SDK 至目标版本(通常是 JDK 1.8)。完成后重新构建项目并测试连接功能。 2. **优化 Maven 依赖管理** - 确保 `pom.xml` 文件内的依赖声明遵循正确的加载次序。以下是推荐的依赖写法: ```xml <dependencies> <!-- hdfs-client 应放在前面 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs-client</artifactId> <version>3.x.x</version> </dependency> <!-- 后面才是 hbase-client --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.x.x</version> </dependency> </dependencies> ``` - 此外,建议通过命令行执行以下操作来验证是否存在潜在冲突: ```bash mvn dependency:tree | grep -E 'hbase|hadoop' ``` 3. **排查其他环境因素** - 若上述措施仍无法解决问题,可以尝试清理本地缓存文件夹 `.m2/repository/` 下的相关 jar 包后再重试下载;或者切换至纯净的工作目录以排除外部干扰源的影响。 --- ### 总结 针对 `java.lang.reflect.InvocationTargetException` 异常,主要应关注 JDK 兼容性和 Maven 构建脚本两方面内容。合理调整这些参数能够有效降低发生概率,并提升系统的稳定性表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值