HBase原理

1. 简介

  1. HBase是大数据NoSQL领域里非常重要的分布式KV数据库,是一个实时、高可靠、高性能、高伸缩的分布式存储系统,运行依赖于Hadoop HDFS、zk

2. 逻辑结构

  1. 因为是key-value结构的数据库,所以curd操作都是通过key去操作value。与redis不同的是HBase的key有点复杂。
  2. Key则是由Rowkey、Column Family : Column Qualifier、Timestamp、Type等几个维度组成。rowkey是HBase的行键;column family(列族)与qualifier(列限定符即列名)共同组成了HBase的列;timestamp表示的就是数据写入时的时间戳,主要用于标识HBase数据的版本号;type代表Put/Delete的操作类型

3. 原理

  1. 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop
  2. 查数据时,携带key值,先连接集群的zk,然后访问zk的元数据信息找到对应的hbase,hbase集群通过机制查找到key对应的value。
  3. 更多原理 点此处

4. 优缺点

1. 优点

  • 容量大:HBase单表可以很庞大,加上其分布式、高伸缩性的特点,使得HBase特别适合海量数据的永久性存储。

  • 高性能:HBase具有非常高的读写性能,基于LSM-Tree的数据结构使得HBase写入数据性能强劲,另外得益于HBase读路径上的各种设计及优化,HBase读数据的性能也可以保持在毫秒级。

  • 高可靠:因为数据写路径上是先写WAL日志,防止缓存数据的丢失,加上HBase底层数据的多副本机制,保证了数据的可靠性。

  • 原始支持Hadoop:HBase底层存储基于HDFS,也原生集成了MapReduce做离线计算。HBase这种架构体系也使得HBase非常易于扩展。

  • 无模式:HBase的表是schema-free的,无需提前定义schema,只会在数据写入时才会增加列。

  • 稀疏性:HBase是表具有稀疏性,null值的列并不占用任何存储空,这一点和关系库不同,大大节省了存储空间。因为hbase是列式存储

  • 多版本:HBase支持多版本,每一个单元格包含timestamp时间戳,标识着数据的版本号。

2. 缺点

  • 数据分析能力弱:数据分析是HBase的弱项,比如聚合运算、多维度复杂查询、多表关联查询等。所以,我们一般在HBase之上架设Phoenix或Spark等组件,增强HBase数据分析处理的能力。

  • 原生不支持二级索引:默认HBase只对rowkey做了单列索引,因此正常情况下对非rowkey列做查询比较慢。所以,我们一般会选择一个HBase二级索引解决方案,目前比较成熟的解决方案是Phoenix,此外还可以选择Elasticsearch/Solr等搜索引擎自己设计实现。

  • 原生不支持SQL:SQL查询也是HBase的一个弱项,好在这块可以通过引入Phoenix解决,Phoenix是专为HBase设计的SQL层。

5. 最重要的java api

  1. 引入hbase的client依赖包

       <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.0.1</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>
  2. 配置hbase集群信息

#配置集群的ip地址
hbase.zookeeper.quorum= 192.168.130.115,192.168.130.116
#zk的端口号 连接hbase实际上是通过zk连接的
hbase.zookeeper.property.clientPort= 2181 
  1. 添加配置类并创建Hbase连接实例

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;import java.io.IOException;@org.springframework.context.annotation.Configuration
public class ServiceHBase {@Value("${hbase.zookeeper.quorum}")private String zookeeperQuorum;@Value("${hbase.zookeeper.property.clientPort}")private String clientPort;@Bean("myConnection")public Connection getCon(){Configuration entries = HBaseConfiguration.create();entries.set("hbase.zookeeper.quorum",zookeeperQuorum);entries.set("hbase.zookeeper.property.clientPort",clientPort);try {return ConnectionFactory.createConnection(entries);} catch (IOException e) {e.printStackTrace();}return null;}
}
  1. 增删改查

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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;import java.io.IOException;@Service("myHbaseService")
public class SerDemo {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowired@Qualifier("myConnection")private Connection hbaseConnection;String tableName = "hello_ssx_tab";String familyName = "family1";/*** 在hbase创建一张表,只指定表名、列族名。其他配置均默认* 表名是tableName = "hello_ssx_tab";* 列族名字是familyName = "family1";* @return*/public boolean addTab(){try {// logger.info("获取hbaseAdmin对象用于操作表");Admin hbaseConnectionAdmin = hbaseConnection.getAdmin();//判断表是否存在TableName tableName1 = TableName.valueOf(this.tableName);boolean tableExists = hbaseConnectionAdmin.tableExists(tableName1);logger.info("表是否存在"+tableName+":"+tableExists);//如果表不存在就新建if (!tableExists){//表不存在//表 描述建造者TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName1);//列族 描述建造者ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(familyName));//设置最大版本号 其实就是记录的轨迹信息,设置为3可以查询追溯到前1个版本前2个版本前三个版本,此功能相当于数据库的flashback闪回。默认1cfdb.setMaxVersions(3);//创建列族 描述ColumnFamilyDescriptor familyDescriptor = cfdb.build();//将列族加入到表描述中builder.setColumnFamily(familyDescriptor);//创建表 描述TableDescriptor tableDescriptor = builder.build();//创建表hbaseConnectionAdmin.createTable(tableDescriptor);logger.info("表创建成功"+tableName);}else {logger.warn("表已经存在:"+tableName);}return hbaseConnectionAdmin.tableExists(tableName1);} catch (Exception e) {e.printStackTrace();}return false;}/*** 向表"hello_ssx_tab";中的列族"family1";添加一条记录*             String colName = "col_a";*             String rowKey = "row_001";* @param value* @return*/public boolean setValue(String value,String colName,String rowKey){//指定表名TableName tableName1 = TableName.valueOf(this.tableName);try {//获取表对象Table table = hbaseConnection.getTable(tableName1);//设置行键值Put row001 = new Put(Bytes.toBytes(rowKey));//设置列族,列,值row001.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(colName),Bytes.toBytes(value));//添加记录table.put(row001);// logger.info("成功hbase添加数据信息:目标表:"+tableName+",目标行键:"+rowKey+",目标列族:"+familyName+",目标列:"+ colName +",目标值:"+value);return true;} catch (IOException e) {e.printStackTrace();}return false;}/*** 查询表中的记录 指定rowkey* String rowKey = "row_001";* @param rowKey* @return*/public String getValue(String rowKey){//指定表名TableName tableName1 = TableName.valueOf(this.tableName);try {//设置表Table table = hbaseConnection.getTable(tableName1);//指定要查询的行键Get get = new Get(Bytes.toBytes(rowKey));//查询返回结果Result result = table.get(get);//获取结果集合Cell[] cells = result.rawCells();//遍历结果集StringBuilder returnData = new StringBuilder();for (Cell cell:cells){byte[] bytes = CellUtil.cloneRow(cell);String s = Bytes.toString(bytes);logger.info("查询hbase数据信息:目标表:"+tableName+",目标行键:"+rowKey+",查询出的信息: 行键:"+s);returnData.append(s).append('\n');String s1 = Bytes.toString(CellUtil.cloneFamily(cell));logger.info("查询hbase数据信息:目标表:"+tableName+",目标行键:"+rowKey+",查询出的信息: 列族:"+s1);returnData.append(s1).append('\n');String s2 = Bytes.toString(CellUtil.cloneQualifier(cell));logger.info("查询hbase数据信息:目标表:"+tableName+",目标行键:"+rowKey+",查询出的信息: 列名:"+s2);returnData.append(s2).append('\n');String s3 = Bytes.toString(CellUtil.cloneValue(cell));logger.info("查询hbase数据信息:目标表:"+tableName+",目标行键:"+rowKey+",查询出的信息: 值:"+s3);returnData.append(s3).append('\n');}return returnData.toString();} catch (IOException e) {e.printStackTrace();}return "查询失败";}}
  1. 如果启动报错 UnknownHostException 的话 就在"C:\Windows\System32\drivers\etc\hosts"配置下 设置域名/host和IP的关系
  2. 以上就是简单的实例了,如果报错请 百度一下
  3. 本项目Gitee源码

6. HBase开发环境搭建(springboot2集成Hbase2)

  1. 如果是在windows系统开发环境搭建的话,windows本地电脑需要安装hadoop软件,并且配置环境变量,还要安装一个winutils-master软件。不然项目启动会报错找不到hadoop——home环境变量。

    • 下载hadoop2压缩包,解压,然后配置window系统环境变量HADOOP_HOME和Path
    • 下载winutils的windows版本,解压,选择一个和hadoop软件相近的版本,打开winutils的bin文件整体粘贴到hadoop软件下。
    • hadoop文件bin文件夹下的hadoop.dll拷贝到C:\Windows\System32目录下
  2. 可能需要重启IDEA或者电脑,完成
  3. 参考文章:https://www.jianshu.com/p/a65a95108620

springboot2集成hbase2环境搭建相关推荐

  1. Visual Studio集成Qt环境搭建_详解与测试

    1.利器≠戾气 接了两个项目,而这两个项目说起来也很有意思. 一个是监护仪软件开发,要求利用MFC进行开发,因为在此之前接近两年时间一直进行MFC开发:来到清华后,碰到了好多的计算机编程大牛,就GUI ...

  2. 【安卓开发系列 -- 开发环境】Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具)

    [安卓开发系列 -- 开发环境]Unbuntu 下 Android 持续集成打包环境搭建 -- Jenkins 构建工具安装(gradle + git + android 工具) [1]Unbuntu ...

  3. VS集成Qt环境搭建

    原文地址:VS集成Qt环境搭建作者:一去二三里 用了这么久的Qt,IDE一直都是VS与Creator并用(实际开发以VS为主),至于哪个更好这里不发表看法,各有所长,而且也因人而异,萝卜青菜,各有所爱 ...

  4. 【软件使用】Windows下的Objective-C集成开发环境搭建(IDE)

    Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1)   使用苹果的平台,集成开发环境使用X ...

  5. mac php开发套件_mac php集成开发环境搭建软件推荐(附教程)

    用惯了在Windows上配置php开发环境,要在MAC上捣腾一个PHP开发环境还不大习惯,那mac上php开发环境怎么搭建配置呢?有哪些集成软件呢? 本文为你推荐几款常用的mac php环境软件,并介 ...

  6. python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...

    Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细) 前沿 ​ Hello,各位看官,您是不是决定要学习Python数据分析,您是不是现在正在"学" ...

  7. git+gerrit+jenkins+sonar 持续集成开发环境搭建

    1:安装git yum -y install git 安装成功之后:git version 1.8.3.1 2:安装apache yum install httpd –y service httpd ...

  8. [Keil] MDK5 集成开发环境搭建与注册破解

    PC :Win10 Keil:MDK5.23 一.软件包 1. 1 下载 MDK-ARM 1.1.1 打开Keil 官网(http://www.keil.com),进入导航栏[Download],选择 ...

  9. ROS集成开发环境搭建

    文章目录 1. 安装终端 1.1 安装Terminator 1.2 添加到收藏夹 2. 安装VSCode 2.1 下载vscode 2.2 安装和卸载vscode 3. vscode集成ROS插件 4 ...

  10. Spring boot集成spring-boot-starter-data-jpa环境搭建

    1.创建Spring boot项目 2.保存等待构建完成 3.增加spring-boot-starter-data-jpa.内存数据库依赖包hsqldb <!-- 添加data jpa依赖 -- ...

最新文章

  1. 如何用python完成评分功能呢_从文件python进行单词分析和评分
  2. from import 导入时找不到module的解决办法(Python模块包中_init_.py文件的作用)
  3. 本人服务器遭受黑客长期攻击,特把这几天做的一些有用的安全方面总结出来,以方便以后查阅
  4. Bootstrap-组件-1
  5. 论文阅读之ALBERT
  6. html5数组删除相同数据,js数组相减简单示例【删除a数组所有与b数组相同元素】...
  7. ginx+Tomcat负载均衡配置
  8. 继承ActionSupport例子展示
  9. 三角函数 公式【和差化积、积化和差】最简记忆口诀
  10. python调用按键精灵插件_Textobot-用交互式TB插件在iPhone上砸壳更美滋滋
  11. STC单片机 闪烁灯,LED流水灯 程序讲解
  12. 用c语言switch写运费的,超级新手,用switch写了个计算器程序,求指导
  13. 记录一下家里双路由实现wifi漫游功能
  14. 反相放大电路反馈电阻上并联电容的作用 [转载]
  15. 用Chrome浏览器模拟手机,android,iphone,ipad访问网站
  16. 根据药物名找华法林的代谢通路并可视化KGML文件
  17. 【Linux】linux 查看服务器配置:核数和内存
  18. 解决微信小程序自定义tabbar跳转页面图标闪动问题
  19. 关联规则—Apriori算法—FPTree
  20. 趁“未老”,再认真一次,我觉得你能更好!

热门文章

  1. HDU 5586 Sum
  2. oracle学习的一些网站收藏
  3. 21.go tool pprof
  4. 12.TCP/IP 详解卷1 --- 广播和多播
  5. 6. PHP 正则表达式
  6. 37. Element appendChild() 方法
  7. java下载ftp_Java FTP下载文件
  8. smarty中的在模板页中应用js css img等文件时,地址是相对与模板页对应的php文件
  9. 记录学习antd design pro dva的过程,主要记错, 多图预警,如有理解偏差,忘指出,多谢!...
  10. Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)