Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你知道吗,优秀的代码都是这样分层的
原文 | juejin.im/post/5b44e62e6fb9a04fc030f216
南风
2019/09/17
5050
你知道吗,优秀的代码都是这样分层的
优秀的 Java 项目代码都是如何分层的?
说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。
芋道源码
2019/08/14
3.5K0
优秀的 Java 项目代码都是如何分层的?
你的项目应该如何正确分层?
说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。
芋道源码
2018/12/11
9850
你的项目应该如何正确分层?
前后端分离及后端分层
原文链接:https://mp.weixin.qq.com/s/5SwQMIJ6Amv4m_8cIOaw3Q
chenchenchen
2019/09/02
2.1K0
前后端分离及后端分层
优秀的代码都是如何分层的?
说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。
程序员小明
2019/10/10
3.8K0
优秀的代码都是如何分层的?
Java分层领域模型使用解读
学习和工作经常会接触到分层领域模型,如 DO、BO、DTO、VO 等。其中 DO、BO、DTO、AO、Query 在《手册》给出了一些解释,这里给出一些补充。
小熊学Java
2023/07/16
6880
Java分层领域模型使用解读
架构师技能1:Java工程规范、浅析领域模型VO、DTO、DO、PO、优秀命名
编程规约或者编码规范的的本质是提高了代码的可读性,最终目的是提高团队协作效率,降低工程维护成本。
黄规速
2022/04/14
4.1K0
架构师技能1:Java工程规范、浅析领域模型VO、DTO、DO、PO、优秀命名
软件架构分层方法论
一般初创软件,为快速上线,几乎不考虑分层。但随业务越发复杂,就会导致逻辑复杂、模块相互依赖、代码扩展性差等各种问题。
JavaEdge
2020/09/25
8680
软件架构分层方法论
Java 理论概念·Java 服务端分层模型
复杂的软件系统都会采用分层的架构设计,分层之后,每一层职责鲜明,整体上降低了系统的耦合性,提高了健壮性。
数媒派
2022/12/01
8650
Java开发手册之应用分层「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106512.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/04
5180
Java开发手册之应用分层「建议收藏」
PO、VO、DAO、BO、DTO、POJO能分清吗?
可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。
码农架构
2021/03/21
1.1K0
PO、VO、DAO、BO、DTO、POJO能分清吗?
软件架构分层,你的项目处于什么阶段?
只要从事软件开发的工作,系统架构是必备知识。有朋友说可能会说,我只是一个搬砖的,怎么会接触到架构知识呢?其实,除了架构的设计者(也就是架构师),作为普通的开发者也是在时刻践行着系统架构的理论。毕竟,再好的架构,都需要码农去实施。只不过当你没有系统了解软件架构时,可能感知不到而已。
程序新视界
2021/12/07
3.8K0
软件架构分层,你的项目处于什么阶段?
2019-04-01 POJO PO BO DO DTO VO的区别分别代表什么含义
POJO PO BO DO DTO VO 概述 缩写 全称 中文 功能 说明 POJO plain ordinary java object 无规则简单java对象 中间对象,与其他对象转换 PO persistent object 持久对象 数据对象对应数据库中的entity BO business object 业务对象 封装业务逻辑对象 VO value object / view object 表现层对象 封装视图层对象 DTO data transfer object 数据传输对象 跨进程或远程传输 DO domain object 领域对象 从现实世界中抽象出来的有形或无形的业务实体 DAO data access object 数据访问对象 封装对数据库访问对象 问题 为什么项目中要存在多种对象,多种对象直接需要相互转换,是否无用? 举例:数据插入操作 HTTP: (Controller 层 )VO 对象 --> (Service 层) BO 对象 --> (DAO 层) PO 对象 --> DAO 对象 RPC : (RPC 接口)DTO 对象 --> --> (Service 层) BO 对象 --> (DAO 层) PO 对象 --> DAO 对象 回答: 世界上有大狗(可以看家护院)的存在也有小狗存在的必要,没有一种事务的存在是没有理由的 代码中不同的层次需要使用不同的对象,使用不同的对象是为了更好的理解业务及解决问题 举例: PO / DO 对象通常对应数据表实体映射对象;如果没有BO对象,此时业务需求需要将时间格式化后展示,需要在PO类中增加属性,但增加的属性却不是表中应有的字段,使PO类的含义发生了变化 如设计活动,活动实体是一张表,活动页面样式、活动优惠等等又是一张表,在将数据返给前端时,前端不需要知道后端是几张表的实现,只需要知道解析这个对象中的相关属性即可;此时需要BO对象来中转,BO对象对应多个PO对象 有这种疑问通常是BO与PO对象的属性完全没有区别,此时需要考虑程序业务逻辑,是否需要将查询结果全部返回给调用方 参考资料 PO/POJO/BO/DTO/VO的区别 Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转) Java中DO/BO/DTO/VO/AO/PO
Albert陈凯
2019/04/09
2.3K0
分层架构
最近连续做了两个新项目,借着新项目的机会,重新审视一下之前一些实践方法,进而寻求一下背后的理论支撑
码农戏码
2021/03/23
6570
DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势
DO、DTO、BO、AO、VO、POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。
明明如月学长
2021/08/31
4.2K0
谈谈架构分层
在系统从0到1的阶段,为了让系统快速上线,我们通常是不考虑分层的。但是随着业务越来越复杂,大量的代码纠缠在一起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。
架构狂人
2023/08/16
3060
谈谈架构分层
程序员进阶之路-架构的哲学
工作时间久了以后,发现对框架(Spring)的了解还停留在一个基本会使用的阶段,对它的一些设计演进并没有一个全面的认识,在笔者经历过的团队中其实还存在一大部分程序员对分层的思想还是不甚了解,更别谈对项目的架构设计分层设计理念了,其实一个架构师尤其是一个有理想有追求的架构师一定是追求其框架设计演进过程和思想,然后转变成自己的设计和架构功底,这才是我们真正能够借鉴内化的。所以说,学会项目的架构分层是一个区别一个程序员是否合格的分水岭,更是一个架构师必须要掌握的基本功。
杨源鑫
2024/07/18
2330
程序员进阶之路-架构的哲学
PO,VO,DAO,BO,POJO一脸懵?一张图给你解释清楚
用于表示前端的展示对象;相比与PO(数据库映射对象),VO对象与前端交互的数据可能需要经过过滤、拆分、聚合等操作;比方说部分不需要展示的数据,VO层将其踢出后返回;如果数据来源于多个地方,也将会在VO对象进行聚合再返回等操作;
一行Java
2022/04/07
2.4K0
PO,VO,DAO,BO,POJO一脸懵?一张图给你解释清楚
DDD领域驱动设计实战-分层架构及代码目录结构
DDD并没有给出标准的代码模型,不同的人可能会有不同理解。 按DDD分层架构的分层职责定义,在代码模型里分别为用户接口层、应用层、领域层和基础层,建立了 interfaces、application、domain 和 infrastructure 四个一级目录。
JavaEdge
2022/11/30
8.7K0
DDD领域驱动设计实战-分层架构及代码目录结构
DDD 领域驱动模型设计中的分层架构
在分解复杂的软件系统时,分层是我们最常用的手段之一。然而,在领域驱动设计中,层次和包的划分看起来与我们的结构又有一定区别,本文主要讨论DDD中的分层架构及每层的意义,以及与传统的三层架构的区别。
一个会写诗的程序员
2019/12/11
6.6K0
推荐阅读
相关推荐
你知道吗,优秀的代码都是这样分层的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验