首页 > 编程语言 >再学HBase,关于HBase的一些基础知识 | 如何集成在java中

再学HBase,关于HBase的一些基础知识 | 如何集成在java中

时间:2024-10-26 22:59:45浏览次数:1  
标签:再学 java String tableName new rowKey table HBase hbase

HBase简介

  • 在使用方面:HBase是一种数据仓库,是基于hdfs的nosql数据源,数据都是存放在hdfs上的,不需要像hive一样再去运行MapReduce进行长时间运算。

特点:

  • 在phonenix/hive的集成下才可以支持sql,本身是有自己的dql语言的。
  • 具有一级索引rowKey,基于一级索引查询
  • hbase的表都是物理表,有独立的物理数据结构,查询时把数据加载到内存,提高查询效率

缺点

  • hbase是依赖于zk和hdfs的,需要zk协调服务,配置管理,维护元数据命名空间等问题;需要hdfs来存储hbase的数据

关于CRUD:

查:HBase是如何锁定数据的:通过rowKey、列族、列名、时间戳(这个一般不需要手动写)来找到准确的cell

改:注意HBase是基于hdfs的,所以他是不能修改数据的。因此修改数据的时候我们会通过时间戳版本来标记新数据。

关于分片:

HBase具有强大的分布式功能,可以通过rowKey分片,也可以通过column family分片。如图例,通过这种灵活的分片方式可以把他分成六个分片

关于要求:hbase的数据库被称为namespace;在创建时仅需要声明column family即可;rowKey的排序是按字典顺序存储

 

关于java集成hbase

<dependency>
     <groupId>org.apache.hbase</groupId>
     <artifactId>hbase-client</artifactId>
     <version>2.2.7</version>
</dependency>

链接hbase

private static Connection getConn(){
        //获取hbase链接
        Configuration conf = new Configuration();
        //指定hbase使用的zk地址
        //注意:需要在执行hbase hava代码的机器上配置zk和hbase集群的主机名和ip的映射关系
        conf.set("hbase.zookeeper.quorum","192.168.88.95:2181");
        //指定hbase在hdfs上的根目录
        conf.set("hbase.rootdir","hdfs://192.168.88.95:9000/hbase");
        //创建HBase数据库链接
        Connection co = null;
        try{
            co = ConnectionFactory.createConnection(conf);
        }catch (IOException e){
            System.out.println("获取链接失败:"+e.getMessage());
        }
        return co;
    }

创建表,只需要提供表名namespace和列簇column family

public static void createTable(String tableName,String... cfs) throws Exception {
        Admin admin = conn.getAdmin();
        ArrayList<ColumnFamilyDescriptor> cfArr = new ArrayList<ColumnFamilyDescriptor>();
        for (String cf : cfs) {
            ColumnFamilyDescriptor cfDesc = ColumnFamilyDescriptorBuilder
                    .newBuilder(Bytes.toBytes(cf))
                    .build();
            cfArr.add(cfDesc);
        }
        TableDescriptor tableDesc = TableDescriptorBuilder
                .newBuilder(TableName.valueOf(tableName))
                .setColumnFamilies(cfArr)
                .build();
        admin.createTable(tableDesc);
        admin.close();
    }

添加单元格数据,需指明4个元素:namespace,column family,column,value。这里timestamp是默认本机时间

    public static void put2HBaseCell(String tableName,String rowKey,String columnFamily,String column,String value)throws Exception{
        Table table = conn.getTable(TableName.valueOf(tableName));
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));
        table.put(put);
        table.close();
    }

批量添加数据,这里的put和上述添加单元格数据的put一致,主要是减少IO来增快插入速度

    public static void put2HBaseList(String tableName, List<Put> list)throws Exception{
        Table table = conn.getTable(TableName.valueOf(tableName));
        table.put(list);
        table.close();
    }

根据rowKey获取具体的KV数据对

    public static Map<String,String> getFromHBase(String tableName,String rowKey)throws IOException{
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowKey));
        Result result = table.get(get);
        List<Cell> cells = result.listCells();
        HashMap<String, String> resMap = new HashMap<String, String>();
        for (Cell cell: cells) {
            //列
            byte[] column_bytes = CellUtil.cloneQualifier(cell);
            //值
            byte[] value_bytes = CellUtil.cloneValue(cell);
            resMap.put(new String(column_bytes),new String(value_bytes));
        }
        return resMap;
    }

 

 总结:单例模式创建的HBase工具类

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;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * HBase工具类
 * Created by LJK
 */
public class HBaseUtil {
    private HBaseUtil(){}

    private static Connection conn = getConn();

    private static Connection getConn(){
        //获取hbase链接
        Configuration conf = new Configuration();
        //指定hbase使用的zk地址
        //注意:需要在执行hbase hava代码的机器上配置zk和hbase集群的主机名和ip的映射关系
        conf.set("hbase.zookeeper.quorum","192.168.88.95:2181");
        //指定hbase在hdfs上的根目录
        conf.set("hbase.rootdir","hdfs://192.168.88.95:9000/hbase");
        //创建HBase数据库链接
        Connection co = null;
        try{
            co = ConnectionFactory.createConnection(conf);
        }catch (IOException e){
            System.out.println("获取链接失败:"+e.getMessage());
        }
        return co;
    }

    /**
     * 对外提供的方法
     * @return
     */
    public static Connection getInstance(){
        return conn;
    }

    /**
     * 创建表
     * @param tableName
     * @param cfs
     */
    public static void createTable(String tableName,String... cfs) throws Exception {
        Admin admin = conn.getAdmin();
        ArrayList<ColumnFamilyDescriptor> cfArr = new ArrayList<ColumnFamilyDescriptor>();
        for (String cf : cfs) {
            ColumnFamilyDescriptor cfDesc = ColumnFamilyDescriptorBuilder
                    .newBuilder(Bytes.toBytes(cf))
                    .build();
            cfArr.add(cfDesc);
        }
        TableDescriptor tableDesc = TableDescriptorBuilder
                .newBuilder(TableName.valueOf(tableName))
                .setColumnFamilies(cfArr)
                .build();
        admin.createTable(tableDesc);
        admin.close();
    }

    /**
     * 添加一个单元格(列)的数据
     * @param tableName
     * @param rowKey
     * @param columnFamily
     * @param column
     * @param value
     * @throws Exception
     */
    public static void put2HBaseCell(String tableName,String rowKey,String columnFamily,String column,String value)throws Exception{
        Table table = conn.getTable(TableName.valueOf(tableName));
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));
        table.put(put);
        table.close();
    }

    /**
     * 向hbase中添加一批数据
     * @param tableName
     * @param list
     * @throws Exception
     */
    public static void put2HBaseList(String tableName, List<Put> list)throws Exception{
        Table table = conn.getTable(TableName.valueOf(tableName));
        table.put(list);
        table.close();
    }

    /**
     * 根据Rowkey获取数据
     * @param tableName
     * @param rowKey
     * @return
     * @throws IOException
     */
    public static Map<String,String> getFromHBase(String tableName,String rowKey)throws IOException{
        Table table = conn.getTable(TableName.valueOf(tableName));
        Get get = new Get(Bytes.toBytes(rowKey));
        Result result = table.get(get);
        List<Cell> cells = result.listCells();
        HashMap<String, String> resMap = new HashMap<String, String>();
        for (Cell cell: cells) {
            //列
            byte[] column_bytes = CellUtil.cloneQualifier(cell);
            //值
            byte[] value_bytes = CellUtil.cloneValue(cell);
            resMap.put(new String(column_bytes),new String(value_bytes));
        }
        return resMap;
    }
}

 

标签:再学,java,String,tableName,new,rowKey,table,HBase,hbase
From: https://www.cnblogs.com/kun1790051360/p/18505263

相关文章

  • Java实现答题判题程序
    一、前言本文介绍了如何使用Java设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。本次编程任务通过三次作业实现了从基本的题目管理到完整的测试系统的设计。第一次作业主要实现了题目信息、试卷信息和答卷信息的基......
  • 【Java】初识Java
    初识Java1.Java语言概述1.1Java是什么1.2Java语言重要性1.3Java语言发展简史1.4Java语言特性2.初识Java程序入口之main方法2.1main方法示例2.2运行Java程序3.注释、标识符、关键字3.1基本规则3.2注释规范4.标识符5.关键字1.Java语言概述1.1Java是什么......
  • 【Java】数据类型与变量
    数据类型与变量1.字面常量2.数据类型3.变量3.1变量概念3.2语法格式3.3整型变量3.3.1整型变量3.3.2长整型变量3.3.3短整型变量3.3.4字节型变量3.4浮点型变量3.4.1双精度浮点型3.4.2单精度浮点型3.5字符型变量3.6布尔型变量3.7类型转换3.7.1自动类型转......
  • 挑战Java面试题复习第1天,坚持就是胜利
    面向对象和面向过程的区别面向过程:步骤分析:将问题分解为一系列步骤。函数实现:用函数逐步实现这些步骤。调用执行:在需要时调用这些函数。高性能:适合对性能要求高的场合,如单片机和嵌入式开发。面向对象:对象分解:将问题分解为多个对象。行为描述:对象描述事物在问题解决过程中的行为......
  • 10.26如何进行简单的java连接数据库
    1建表1.win+R输入cmd输入mysql-uroot-p输入密码2.查看数据库原本的成员showdatabases3.创建一个新表,如studentcreatedatabasestudent;4.使用usestudent;createtablestudent(idint,namevarchar(10));5.插入insertintostudentvalue(1,'张三');in......
  • java-BLOG-1
    1.前言第一二个题目集除了最后一个题目以及第三个题目集的第一个题目都比较简单,只要按照题目要求,创建相应的类,题目比较简单一般只需要创建一个类和相应的一些属性、方法,按照输入输出的要求进行创建就行。前两个题目集只需要做对相应的输出就能做对,而第三个题目集重点增加了对输入......
  • jsp ssm 校园新闻管理系统 新闻发布系统 news 项目源码 web java
    一、项目简介本项目是一套基于SSM的校园新闻管理系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、CSS、Ja......
  • jsp ssm 智能图书馆图书推荐系统 图书管理 项目源码 web java
    一、项目简介本项目是一套基于SSM的智能图书馆图书推荐系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、C......
  • 南昌航空大学-软件学院-22207112-卢翔-JAVAPTA(1-3)博客
    目录前言PTA第一次作业(7-5答题判题程序-1)设计与分析题目分析知识点解析调试过程时序图,耦合度改进建议PTA第二次作业设计与分析题目分析知识点解析(不重复)调试过程类图,耦合度改进建议PTA第三次作业设计与分析题目分析知识点解析调试过程类图,耦合度改进建议踩坑心得总结前言本次的......
  • Java面向对象
    **Java面向对象学习心得**在学习Java的过程中,面向对象编程(OOP)无疑是最重要的概念之一。Java是一门纯面向对象的编程语言,它通过类和对象的概念使得程序设计更为清晰、模块化,并且便于维护和扩展。以下是我在学习Java面向对象编程过程中的一些心得体会。一、理解面向对象的......