前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何使用Java访问非Kerberos环境的HBase

如何使用Java访问非Kerberos环境的HBase

作者头像
Fayson
发布于 2018-11-19 02:18:43
发布于 2018-11-19 02:18:43
1.6K00
代码可运行
举报
文章被收录于专栏:Hadoop实操Hadoop实操
运行总次数:0
代码可运行

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

在前面的文章Fayson介绍了《如何使用Java连接Kerberos的HBase》,虽然非Kerberos环境下访问HBase比较简单,本篇文章Fayson还是主要介绍使用Java访问非Kerberos环境的HBase。

  • 测试环境

1.CDH版本为5.13.1

2.OS为Redhat7.2

2

环境准备

1.从CDH集群下载HBase客户端配置

2.在开发环境下为本机配置集群hosts信息,因为下载的HBase客户端配置使用的为hostname

3.在工程的pom.xml文件中增加如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.6.5</version>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.6.5</version>
</dependency>
<dependency>
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase-client</artifactId>
  <version>1.2.0</version>
</dependency>

(可左右滑动)

4.在创建的java工程中,将hbase-conf目录及配置文件拷贝至工程resources目录下

3

客户端访问HBase工具类

1.ClientUtils类主要提供客户端初始化方法,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cloudera.hbase.utils;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;

/**
 * package: com.cloudera.hbase.utils
 * describe: 访问HBase客户端工具类
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2018/11/17
 * creat_time: 下午4:55
 * 公众号:Hadoop实操
 */
public class ClientUtils {

    /**
     * 初始化访问HBase访问
     */
    public static Configuration initHBaseENV() {
        try {
            Configuration configuration = HBaseConfiguration.create();
            configuration.addResource(ClientUtils.class.getClass().getResourceAsStream("/hbase-conf/core-site.xml"));
            configuration.addResource(ClientUtils.class.getClass().getResourceAsStream("/hbase-conf/hdfs-site.xml"));
            configuration.addResource(ClientUtils.class.getClass().getResourceAsStream("/hbase-conf/hbase-site.xml"));

            return  configuration;
        } catch(Exception e) {
            e.printStackTrace();
        }

        return  null;
    }
}

(可左右滑动)

2.HBaseUtils用于操作Kudu的工具类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cloudera.hbase.utils;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * package: com.cloudera.hbase.utils
 * describe: 操作HBase工具类
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2018/11/17
 * creat_time: 下午5:08
 * 公众号:Hadoop实操
 */
public class HBaseUtils {


    /**
     * 获取HBase Connection
     * @param configuration
     * @return
     */
    public static Connection initConn(Configuration configuration) {
        Connection connection = null;

        try {
            connection = ConnectionFactory.createConnection(configuration);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return connection;
    }

    /**
     * 获取库中所有的表
     * @param connection
     */
    public static void listTables(Connection connection){
        try {
            //获取所有的表名
            TableName[] tbs = connection.getAdmin().listTableNames();
            for (TableName tableName : tbs){
                System.out.println(tableName.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取HBase表中的数据
     * @param tname
     * @param connection
     */
    public static void readTable(String tname, Connection connection){
        try {
            TableName tableName = TableName.valueOf(tname);
            Admin admin = connection.getAdmin();
            //判断tname是否存在,存在就返回true,否则返回false
            Boolean flag = admin.tableExists(tableName);
            if(!flag) {
                System.out.println("表不存在");
                return;
            }
            //判断当前的表是否被禁用了,是就开启
            if (admin.isTableDisabled(tableName)){
                admin.enableTable(tableName);
            }

            Table table = connection.getTable(tableName);
            ResultScanner resultScanner = table.getScanner(new Scan());

            for (Result result:resultScanner){
                for (Cell cell:result.listCells()){
                    //取行健
                    String rowKey=Bytes.toString(CellUtil.cloneRow(cell));
                    //取到时间戳
                    long timestamp = cell.getTimestamp();
                    //取到族列
                    String family = Bytes.toString(CellUtil.cloneFamily(cell));
                    //取到修饰名
                    String qualifier  = Bytes.toString(CellUtil.cloneQualifier(cell));
                    //取到值
                    String value = Bytes.toString(CellUtil.cloneValue(cell));

                    System.out.println("RowKey : " + rowKey + ",  Timestamp : " + timestamp + ", ColumnFamily : " + family + ", Key : " + qualifier + ", Value : " + value);
                }
            }
            resultScanner.close();
            table.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

(可左右滑动)

4

HBase访问示例代码及运行

1.HBaseSample.java类调用API接口访问HBase示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cloudera.hbase;

import com.cloudera.hbase.utils.ClientUtils;
import com.cloudera.hbase.utils.HBaseUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.*;

/**
 * package: com.cloudera.hbase
 * describe: 访问非Kerberos环境下的HBase
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2018/11/17
 * creat_time: 下午4:55
 * 公众号:Hadoop实操
 */
public class HBaseSample {

    public static void main(String[] args) {
        try {
            Configuration configuration = ClientUtils.initHBaseENV();
            Connection connection = HBaseUtils.initConn(configuration);
            if(connection == null) {
                System.exit(1);
            }
            //获取HBase库中所有的表
            HBaseUtils.listTables(connection);

            HBaseUtils.readTable("picHbase", connection);

            //释放连接
            connection.close();

        } catch (Exception e) {

        }
    }
}

(可左右滑动)

2.示例代码运行

5

总结

1.Java开发访问HBase时,注意Connection对象不要重复创建,在使用完成后记得进行close操作,以避免频繁操作时将Zookeeper的连接数占满。

GitHub源码地址:

https://github.com/fayson/cdhproject/blob/master/hbasedemo/src/main/java/com/cloudera/hbase/HBaseSample.java

https://github.com/fayson/cdhproject/blob/master/hbasedemo/src/main/java/com/cloudera/hbase/utils/ClientUtils.java

https://github.com/fayson/cdhproject/blob/master/hbasedemo/src/main/java/com/cloudera/hbase/utils/HBaseUtils.java

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Envoy:event相关代码阅读(一)
本篇文章会从下面两部分来进行讲解,libevent的基础知识介绍,envoy中event的类的实现和event在envoy中的调度逻辑。
灰子学技术
2023/10/30
2380
Envoy:event相关代码阅读(一)
libevent源码深度剖析(五) libevent的核心:事件event
(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使用场景和事件流程 (4)libevent源码深度剖析四 libevent源代码文件组织 (5)libevent源码深度剖析五 libevent的核心:事件event (6)libevent源码深度剖析六 初见事件处理框架 (7)libevent源码深度剖析七 事件主循环 (8)libevent源码深度剖析八 集成信号处理 (9)libevent源码深度剖析九 集成定时器事件 (10)libevent源码深度剖析十 支持I/O多路复用技术 (11)libevent源码深度剖析十一 时间管理 (12)libevent源码深度剖析十二 让libevent支持多线程 (13)libevent源码深度剖析十三 libevent信号处理注意点
范蠡
2018/07/25
1.2K0
libevent源码深度剖析(五) libevent的核心:事件event
linux下libevent的安装和使用例子:数据回显
http://blog.csdn.net/fall221/article/details/9045353 (安装)
bear_fish
2018/09/20
3.5K0
linux下libevent的安装和使用例子:数据回显
libevent介绍
libevent是一款事件驱动的网络开发包 由于采用 c 语言开发 体积小巧,跨平台,速度极快。
Java架构师必看
2021/03/22
2K0
深入理解libevent事件库的原理与实践技巧
libevent是一个事件通知库;封装了reactor。 libevent API 提供了一种机制,用于在文件描述符上发生特定事件或达到超时后执行回调函数。此外,libevent还支持由于信号或常规超时而导致的回调。 libevent 旨在替换在事件驱动的网络服务器中找到的事件循环。应用程序只需要调用event_dispatch(),然后动态添加或删除事件,而无需更改事件循环。
Lion 莱恩呀
2024/10/20
4680
深入理解libevent事件库的原理与实践技巧
几种服务器端IO模型的简单介绍及实现(下)
5、使用事件驱动库libevent的服务器模型 Libevent 是一种高性能事件循环/事件驱动库。 为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层IO复杂性。这是 libevent 系统的核心。 创建 libevent 服务器的基本方法是,注册当发生某一操作(比如接受来自客户端的连接)时应该执行的函数,然后调用主事件循环 event_dispatch()。执行过程的控制现在由 libevent 系统处理。注册
李海彬
2018/03/23
7170
几种服务器端IO模型的简单介绍及实现(下)
memcached源码阅读----使用libevent和多线程模型
本篇文章主要是我今天阅读memcached源码关于进程启动,在网络这块做了哪些事情。
ctree
2019/02/24
1.4K0
使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
http://blog.csdn.net/hguisu/article/details/38638183(牛逼100多名)
bear_fish
2018/09/20
2.1K0
使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
libevent源码深度剖析三 libevent基本使用场景和事件流程
(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使用场景和事件流程 (4)libevent源码深度剖析四 libevent源代码文件组织 (5)libevent源码深度剖析五 libevent的核心:事件event (6)libevent源码深度剖析六 初见事件处理框架 (7)libevent源码深度剖析七 事件主循环 (8)libevent源码深度剖析八 集成信号处理 (9)libevent源码深度剖析九 集成定时器事件 (10)libevent源码深度剖析十 支持I/O多路复用技术 (11)libevent源码深度剖析十一 时间管理 (12)libevent源码深度剖析十二 让libevent支持多线程 (13)libevent源码深度剖析十三 libevent信号处理注意点
范蠡
2018/07/25
2.1K1
libevent源码深度剖析三 libevent基本使用场景和事件流程
Redis事务的灵活应用与异步连接的优化策略
事务是指用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
Lion 莱恩呀
2024/11/07
1240
Redis事务的灵活应用与异步连接的优化策略
Envoy源码分析之Dispatcher
在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一个Dispatcher就是一个EventLoop,其承担了任务队列、网络事件处理、定时器、信号处理等核心功能。在Envoy threading model这篇文章所提到的EventLoop(Each worker thread runs a “non-blocking” event loop)指的就是这个Dispatcher对象。这个部分的代码相对较独立,和其他模块耦合也比较少,但重要性却不言而喻。下面是与Dispatcher相关的类图,在接下来会对其中的关键概念进行介绍。
黑光技术
2019/03/06
1.7K0
Envoy源码分析之Dispatcher
PHP网络编程之Libevent-EventBuffer(十七节)
其实今天是接着上一篇文章尾巴的两个问题的延续,一个是多进程(线程)中使用Libevent,另一个是关于触发可写在时候那个需要自己维护的发送数据缓冲区。
老李秀
2020/02/26
1.2K3
【C++】开源:事件驱动库libevent配置使用
项目Github地址:https://github.com/libevent/libevent
DevFrank
2024/07/24
6880
Memcached的网络模型
Memcached依赖于libevent,网络模型是典型的reactor模式,主线程通过自己的event_base绑定端口监听网络中的连接。每个worker线程的初始任务就是轮询管道上的notify_receive_fd的读事件,如果有连接,主线程往相应的worker线程的管道的输入端notify_send_fd写入关键字‘c’,代表着网络上有新的连接要派发给worker线程,这样worker进程直接accept就能得到连接的fd了,同时把这个fd的读事件放到每个worker进程的event_base中,如
李海彬
2018/03/23
8090
Memcached的网络模型
linux网络编程中的errno处理
在Linux网络编程中,errno是一个非常重要的变量。它记录了最近发生的系统调用错误代码。在编写网络应用程序时,合理处理errno可以帮助我们更好地了解程序出现的问题并进行调试。
聆湖听风
2023/03/13
5.7K0
linux网络编程中的errno处理
libevent源码深度剖析(六) 初见事件处理框架
(1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使用场景和事件流程 (4)libevent源码深度剖析四 libevent源代码文件组织 (5)libevent源码深度剖析五 libevent的核心:事件event (6)libevent源码深度剖析六 初见事件处理框架 (7)libevent源码深度剖析七 事件主循环 (8)libevent源码深度剖析八 集成信号处理 (9)libevent源码深度剖析九 集成定时器事件 (10)libevent源码深度剖析十 支持I/O多路复用技术 (11)libevent源码深度剖析十一 时间管理 (12)libevent源码深度剖析十二 让libevent支持多线程 (13)libevent源码深度剖析十三 libevent信号处理注意点
范蠡
2018/07/25
1.2K0
高性能网络编程 - select、 poll 、epoll 、libevent
总之,这些是用于编程的工具和库,用于高效地处理多个 I/O 操作,特别是在网络通信的背景下。Select 和 poll 是较旧、性能较低的选项,而 epoll 是一种高性能的替代方案。Libevent 是一个库,简化了使用这些机制的工作,同时提供了跨不同平台的可移植性。
小小工匠
2023/11/09
6790
PHP网络编程之抽象一个event-loop(十八节)
みなさんこんにちは「老李」,既知の「谢顶道人」。 事情是这样的,做为一个跟我旗鼓相当的「谢顶法师」--- 老赵跟我说: 一部分格局比较大的泥腿子估计内心早就已经预见到了这种「风口」,虽然可能没有做好
老李秀
2020/03/11
1.2K0
在 libevent 中使用 MariaDB(MySQL)
在之前我翻译的官方文档中提到了 MariaDB 提供了对异步 I/O 的支持。那篇文章是一个比较简要的介绍。不过实际适配中,官方也提供了一个完整适配 libevent 的示例代码。本文算是对我上述示例代码的阅读笔记吧。
amc
2018/09/26
2.6K0
在 libevent 中使用 MariaDB(MySQL)
libevent事件库实践:构建高性能应用
产生原因: libevent动态库在默认安装时,存放的路径在/usr/local/lib下,不在系统的默认查找路径内。 解决办法有两个: (1)将该路径放在系统查找路径内。
Lion 莱恩呀
2024/10/21
1810
libevent事件库实践:构建高性能应用
推荐阅读
相关推荐
Envoy:event相关代码阅读(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验