学习笔记:从0开始学习大数据-7.hbase java编程hello world

本文详细介绍如何在Eclipse中搭建HBase编程环境,包括创建表、插入数据、使用Java API进行数据查询等步骤,并提供完整的代码示例。

上节搭建了hbase启动环境,本节搭建hbase编程环境

1. 准备测试数据,创建表student

#hbase shell

create 'student','info','address'
put 'student','1','info:age','20'
put 'student','1','info:name','linbin'
put 'student','1','info:class','1'
put 'student','1','address:city','guangzhou'
put 'student','1','address:area','baiyun zone'
put 'student','2','info:age','21'
put 'student','2','info:name','yangdandan'
put 'student','2','info:class','1'
put 'student','2','address:city','beijing'
put 'student','2','address:area','CBD'
scan 'student'

2. Eclipse 创建hbase项目

文件-》新建-》项目-》maven project->输入项目名-》完成

3.修改项目下的pom.xml  增加

    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-it</artifactId>
        <version>1.2.0</version>
    </dependency>

保存后等待自动下载相关jar文件

4. 修改 App.java 文件

package com.linbin.hbase;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

public class App 
{
	private static Configuration config = null;
	private static Connection connection = null;
	private static Table table = null;
    public static void main( String[] args ) throws Exception
    {
		config = HBaseConfiguration.create();
		config.set("hbase.zookeeper.quorum", "centos7");    //指定服务器
		connection = ConnectionFactory.createConnection(config);
		table = connection.getTable(TableName.valueOf("student"));  //打开student表
		queryData();
		table.close();
		connection.close();
    }
    
	public static void queryData() throws IOException {
		Get get = new Get(Bytes.toBytes("2"));    //获取表的行key
		Result result = table.get(get);
		System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"))));   //输出 info:name列
		System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("age"))));    //输出  info:age列
	}
}

简单的连接hbase数据库,打开表,查询指定行,打印指定列,关闭表和连接。

5. 测试运行,注意运行时 Run as -> Java application    这个不是web项目,是java应用程序项目

正常执行,显示查询的结果

6. 编程实现hbase表的增删改查java api 参见:

https://blog.youkuaiyun.com/u014695188/article/details/73188668   hbase编程:通过Java api操作hbase

2025-09-19T20:58:53,369 ERROR [RS-EventLoopGroup-1-1] util.NettyFutureUtils: Unexpected error caught when processing netty java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192] at org.apache.hadoop.hbase.io.asyncfs.ProtobufDecoder.<init>(ProtobufDecoder.java:64) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.processWriteBlockResponse(FanOutOneBlockAsyncDFSOutputHelper.java:429) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.access$100(FanOutOneBlockAsyncDFSOutputHelper.java:123) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$5.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:511) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.util.NettyFutureUtils.lambda$addListener$0(NettyFutureUtils.java:56) ~[hbase-common-2.6.3.jar:2.6.3] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:198) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:36) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hadoop.hbase.util.NettyFutureUtils.addListener(NettyFutureUtils.java:52) ~[hbase-common-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.initialize(FanOutOneBlockAsyncDFSOutputHelper.java:505) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.access$300(FanOutOneBlockAsyncDFSOutputHelper.java:123) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$6.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:563) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$6.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:558) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.util.NettyFutureUtils.lambda$addListener$0(NettyFutureUtils.java:56) ~[hbase-common-2.6.3.jar:2.6.3] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:596) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:572) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:118) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.fulfillConnectPromise(AbstractEpollChannel.java:658) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:696) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:567) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:491) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:399) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[hbase-shaded-netty-4.1.11.jar:?] at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_192] 2025-09-19T20:58:53,369 ERROR [RS-EventLoopGroup-1-1] util.NettyFutureUtils: Unexpected error caught when processing netty java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192] at org.apache.hadoop.hbase.io.asyncfs.ProtobufDecoder.<init>(ProtobufDecoder.java:64) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.processWriteBlockResponse(FanOutOneBlockAsyncDFSOutputHelper.java:429) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.access$100(FanOutOneBlockAsyncDFSOutputHelper.java:123) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$5.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:511) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.util.NettyFutureUtils.lambda$addListener$0(NettyFutureUtils.java:56) ~[hbase-common-2.6.3.jar:2.6.3] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:198) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:36) ~[hbase-shaded-netty-4.1.11.jar:?] at org.apache.hadoop.hbase.util.NettyFutureUtils.addListener(NettyFutureUtils.java:52) ~[hbase-common-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.initialize(FanOutOneBlockAsyncDFSOutputHelper.java:505) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper.access$300(FanOutOneBlockAsyncDFSOutputHelper.java:123) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$6.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:563) ~[hbase-asyncfs-2.6.3.jar:2.6.3] at org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper$6.operationComplete(FanOutOneBlockAsyncDFSOutputHelper.java:558) ~[hbase-asyncfs-2.6.3.jar:2.6.3]
最新发布
09-20
<think> 我们正在处理HBase 2.6.3中的错误:java.lang.IllegalArgumentException: object is not an instance of declaring class 这个错误通常发生在通过反射调用方法时,传入的对象实例并非声明该方法的类的实例。在HBase的上下文中,可能涉及到一些API的调用或自定义的Coprocessor等。 根据经验,这个错误可能有以下几个常见原因: 1. 版本不兼容:使用的客户端API版本与HBase服务器版本不匹配,或者依赖的第三方库版本冲突。 2. 自定义Coprocessor中使用了不正确的类加载器或类实例。 3. 在通过反射调用方法时,传入的对象与声明方法的类不匹配。 由于用户提到了HBase 2.6.3,我们将针对该版本进行问题排查。 解决方案步骤: 第一步:检查版本兼容性 确保所有HBase客户端依赖(包括HBase Client、HBase Server、Hadoop等)的版本一致且兼容。特别是,如果使用了HBase的协处理器(Coprocessor),需要确保协处理器中使用的API与HBase 2.6.3兼容。 第二步:检查协处理器(如果有使用) 如果使用了自定义协处理器,检查协处理器中是否有可能出现类加载器隔离问题。在HBase中,协处理器运行在独立的类加载器中,因此需要确保: - 协处理器中使用的类与HBase的类没有冲突。 - 没有在协处理器中直接使用HBase客户端API(因为协处理器运行在服务器端)。 第三步:检查反射调用 如果错误发生在反射调用中,检查调用Method.invoke()时传入的对象实例是否确实是声明该方法的类的实例。例如: ```java Method method = ...; // 声明在类A中 Object instance = ...; // 必须是A的实例或A的子类实例 method.invoke(instance, args); ``` 如果instance不是A的实例(或子类实例),则会抛出此异常。 第四步:检查依赖冲突 使用Maven的依赖树分析工具检查是否有冲突的依赖: ```shell mvn dependency:tree ``` 特别注意HBaseHadoop、ZooKeeper等关键依赖的版本是否一致。 第五步:查看完整堆栈信息 错误日志中的堆栈信息会指明具体是哪一行代码引发的异常。根据堆栈信息定位到具体的类和行号,然后分析该处的反射调用。 针对HBase 2.6.3,有一个已知的类似问题可能与协处理器的加载有关。在HBase的JIRA中,我们找到了HBASE-26125(在2.4.0版本引入,影响后续版本)[^1]。该问题导致在部署协处理器时出现类加载问题,进而引发类似的异常。解决方法是在HBase配置中设置: ```xml <property> <name>hbase.coprocessor.user.classpath.first</name> <value>true</value> </property> ``` 或者升级到包含修复的版本(HBase 2.4.6+、2.5.3+、2.6.4+)。由于用户使用的是2.6.3,可以尝试设置上述配置,或者升级到2.6.4以上版本。 如果上述步骤仍不能解决问题,请提供更详细的错误堆栈信息以便进一步分析。 总结解决方案: 1. 检查并确保依赖版本一致。 2. 检查自定义协处理器代码。 3. 检查反射调用是否正确。 4. 使用依赖树排除冲突。 5. 尝试设置`hbase.coprocessor.user.classpath.first`为`true`。 6. 升级HBase到2.6.4或更高版本。 如果用户提供了具体的堆栈信息,我们可以进一步定位。 相关问题: §§相关问题§§ 1. 如何查看HBase中协处理器的加载状态? 2. HBase版本升级需要注意哪些问题? 3. 如何排查HBase中的依赖冲突? </think> ### HBase 2.6.3中`java.lang.IllegalArgumentException: object is not an instance of declaring class`错误解决方案 此错误通常发生在**反射调用方法**时,传入的对象实例与声明该方法的类不匹配。以下是针对HBase 2.6.3的完整解决方案: #### 1. **检查协处理器(Coprocessor)实现** - **根本原因**:自定义协处理器中通过反射调用HBase内部API时,传入的对象与目标类不兼容 - **解决方案**: 1. 检查协处理器中所有反射调用代码,例如: ```java Method method = TargetClass.class.getDeclaredMethod("methodName"); // 确保传入的obj是TargetClass的实例 method.invoke(obj, args); // 此处obj必须匹配TargetClass ``` 2. 使用`instanceof`验证对象类型: ```java if (obj instanceof TargetClass) { method.invoke(obj, args); } else { throw new ClassCastException(); } ``` 3. 更新HBase客户端和服务端的协处理器JAR包至相同版本 #### 2. **验证依赖版本一致性** - **关键点**:HBase客户端与服务端、Hadoop的版本必须严格匹配 - **操作步骤**: 1. 检查Maven依赖: ```xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.6.3</version> <!-- 必须与服务端一致 --> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>2.6.3</version> </dependency> ``` 2. 执行依赖冲突检查: ```bash mvn dependency:tree -Dverbose | grep hbase ``` 3. 排除冲突依赖(示例): ```xml <exclusions> <exclusion> <groupId>org.apache.hbase</groupId> <artifactId>hbase-annotations</artifactId> </exclusion> </exclusions> ``` #### 3. **配置类加载隔离** - **问题场景**:不同类加载器加载了相同类导致类型不匹配 - **修复方案**: 1. 在`hbase-site.xml`中启用类加载隔离: ```xml <property> <name>hbase.coprocessor.user.classpath.first</name> <value>true</value> <!-- 优先使用用户类加载器 --> </property> ``` 2. 重启RegionServer使配置生效 #### 4. **升级修复补丁** - 此问题在HBase 2.6.4+中已优化,建议升级: ```bash # 下载补丁版本 wget https://archive.apache.org/dist/hbase/2.6.4/hbase-2.6.4-bin.tar.gz ``` 或回退到稳定版本(如2.5.10) #### 5. **调试步骤** 1. 从异常堆栈定位反射调用的代码位置 2. 使用JDI调试获取运行时对象类型: ```java System.out.println("Object class: " + obj.getClass().getName()); System.out.println("Declaring class: " + method.getDeclaringClass().getName()); ``` 3. 启用HBase DEBUG日志: ```bash export HBASE_ROOT_LOGGER=DEBUG,console hbase-daemon.sh restart regionserver ``` > **关键预防措施**:在反射调用前始终验证对象类型,使用HBase官方API而非反射访问内部方法可彻底避免此类问题[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值