HBase_总结

1、HBase的核心概念

​ HBase是构建在 HDFS上的分布式NoSql数据库,主要用于大数据领域,支持高并发读写与节点扩容,适合列式存储稀疏数据,一般都可以通过JavaAPI来进行各种数据的操作。

2、HBase的特点

  • (1)海量存储:可以存储大批量的数据,
  • (2)列式存储:数据是基于列族进行存储,数据以字节数组进行存储,可以有多个版本值
  • (3)极易扩展:可以通过增加服务器(底层HDFS)对集群的存储进行扩容
  • (4)高并发读写:支持高并发的读写请求
  • (5)不支持小文件,不支持并发写,不支持文件随机修改,查询效率也低
  • 启动时,需要提前启动 HDFS 及 ZooKeeper集群

3、HBase的架构

HMaster- HRegionServer- Region

  • Region:是HBase集群中分布式存储的最小单元一个Region对应一个Table表的部分数据
  • HBase集群只有一张meta表,此表只有一个region,该region数据保存在一个HRegionServer上
  • meta表中存储了所有用户表的region信息,我们可以通过scan 'hbase:meta'来查看meta表信息

4、HBase存储数据结构

rowkey行键 – Column-Family列族 – Column列 – cell单元格 – Timestamp时间戳

  • 一个HRegionServer管理多个region ,一个region包含很多个store,一个列族就划分成一个store,一个store里面有一个memstore和多个StoreFile, 最后数据是以很多个HFile这种数据结构的文件保存在HDFS上。

  • cell中的数据是没有类型的,全部是以字节数组进行存储;可以对表中的Cell多次赋值,每次赋值操作时的时间戳,可看成Cell值的版本号,

  • HBase上Regionserver的内存分为两个部分

    • 一部分作为Memstore,主要用来写;
    • 另外一部分作为BlockCache,主要用于读数据;

5、HBase的安装部署

需要提前启动HDFS及ZooKeeper集群

start-hbase.sh

WEbUI:http://node01:60010

stop-hbase.sh

6、HBase shell命令基本操作


list
--创建
create 'user', 'info', 'data'
create 'user', {NAME => 'info', VERSIONS => '3'},{NAME => 'data'}
--赋值
put 'user', 'rk0001', 'info:name', 'zhangsan'
--查询--get
get 'user', 'rk0001'
get 'user', 'rk0001', 'info:name', 'info:age'
--查询-过滤器
 get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"} 
get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

--查询--scan
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

scan 'user',{FILTER=>"PrefixFilter('rk')"}--模糊查询
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}--范围查询

--更新--alter
alter 'user', NAME => 'info', VERSIONS => 5
delete 'user', 'rk0001', 'info:name'

count 'user'

disable 'user'
enable 'user'

7、HBase的 Java API 操作

创建maven工程,pom.xml的repositories的内容,自动导包(需要从cloudera仓库下载,耗时较长,耐心等待

操作数据库 :获取连接 ---- 获取客户端对象 — 操作数据库 — 关闭

 	private Connection connection ;
    private final String TABLE_NAME = "myuser";
    private Table table ;

    @BeforeTest
    public void initTable () throws IOException {
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("HBase.zookeeper.quorum","node01:2181,node02:2181");
        connection= ConnectionFactory.createConnection(configuration);
        table = connection.getTable(TableName.valueOf(TABLE_NAME));
    }

   @Test
 public void createData() throws IOException {
        Admin admin = connection.getAdmin();//获取管理员对象,来对手数据库进行DDL的操作  
        TableName myuser = TableName.valueOf("myuser");   //指定我们的表名
        HTableDescriptor hTableDescriptor = new HTableDescriptor(myuser);
        //指定两个列族
        HColumnDescriptor f1 = new HColumnDescriptor("f1");
        HColumnDescriptor f2 = new HColumnDescriptor("f2");
        hTableDescriptor.addFamily(f1);
        hTableDescriptor.addFamily(f2);
        admin.createTable(hTableDescriptor);
        admin.close();
 }

    public void addData() throws IOException {
        //获取表
        Table table = connection.getTable(TableName.valueOf(TABLE_NAME));
        Put put = new Put("0001".getBytes());//创建put对象,并指定rowkey值
        put.addColumn("f1".getBytes(),"name".getBytes(),"zhangsan".getBytes());
     
        table.put(put);} 

    @AfterTest
    public void close() throws IOException {
        table.close();
        connection.close();
    }

8、HBase过滤器查询

过滤器的作用是,在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端

过滤器的类型很多,但是可以分为:比较过滤器专用过滤器

  1. 比较过滤器:行键过滤器RowFilter、列族过滤器FamilyFilter、列过滤器QualifierFilter、列值过滤器ValueFilter
//查询哪些字段值  包含数字8
    @Test
    public void contains8() throws IOException {
        Scan scan = new Scan();
        SubstringComparator substringComparator = new SubstringComparator("8");
        //列值过滤器,过滤列值当中包含数字8的所有的列
        ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
        scan.setFilter(valueFilter);
        ResultScanner scanner = table.getScanner(scan);
        printlReult(scanner);
    }
  1. 专用过滤器使用

1、单列值 过滤器 SingleColumnValueFilter,返回满足条件的整列值的所有字段

2、列值排除过滤器SingleColumnValueExcludeFilter:会排除掉指定的列,其他的列全部返回

3、rowkey前缀过滤器PrefixFilter:查询以XX开头的所有前缀的rowkey

4、分页过滤器PageFilter

3)多过滤器综合查询FilterList

  • 需求:查询f1列族,name为刘备的数据,并且同时满足rowkey的前缀以00开头的数据(PrefixFilter)

    @Test
    public  void filterList() throws IOException {
        Scan scan = new Scan();
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("f1".getBytes(), "name".getBytes(), CompareFilter.CompareOp.EQUAL, "刘备".getBytes());
        PrefixFilter prefixFilter = new PrefixFilter("00".getBytes());
        
        FilterList filterList = new FilterList();
        filterList.addFilter(singleColumnValueFilter);
        filterList.addFilter(prefixFilter);
        
        scan.setFilter(filterList);
        ResultScanner scanner = table.getScanner(scan);
        printlReult(scanner);
    }

9、Hbase在实际场景中的应用

1 交通方面:船舶GPS信息,全长江的船舶GPS信息,每天有1千万左右的数据存储。

2 金融方面:消费信息、贷款信息、信用卡还款信息等

3 电商方面:电商网站的交易信息、物流信息、游览信息等

4 电信方面:通话信息、语音详单等

总结:海量明细数据的存储,并且后期需要有很好的查询性能

10、Hbase读数据

  • 1、客户端首先与zk进行连接,从zk找到包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;
  • 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求
  • 3、查找并定位到对应的region,
  • 4、先从memstore查找数据—如果没有从BlockCache上读取----如果也没有再到StoreFile上进行读取。
  • 5、从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端。

11、Hbase写数据

  • 1、客户端首先与zk进行连接,从zk找到zk找到meta表的region位置,即包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;

  • 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求

  • 3、查找并定位到对应的region,

  • 4、写数据时,把数据分别写到HLog 和memstore各一份进行缓冲,

  • 5、flush:memstore达到阈值后,把数据刷到磁盘生成多个storeFile文件。

    • Region中任意一个memstore达到128MB
    • Region中所有Memstore的大小总和达到block.multiplier * flush.size
    • Region Server中HLog数量达到上限
  • 6、compact

    • 小合并:小的store file合并成相对较大的store file,
    • 大合并:合并Store中所有的HFile为一个HFile

12、region 拆分机制

region中存储大量的rowkey数据 ,当region中的数据条数过多,将影响查询效率。因此,当region过大的时候,hbase会拆分region 。

HBase的region split策略一共有:固定region大小拆分(10G,0.94版本前默认)、递增上限拆分(拆分次数^3 * 256,0.94~2.0版本默认)、分步拆分(2.0版本默认)

13、region预分区

每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。

增加数据读写效率,负载均衡防止数据倾斜,优化Map数量

手动指定预分区

HexStringSplit 算法

create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']

create 'mytable', 'base_info',' extra_info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

14、region 合并

出于维护的目的 。如大量删除数据后 ,Region都变得很小 ,Region就浪费了 。

通过Merge类冷合并Region、通过online_merge热合并Region

15、HBase集成MapReduce

HBase表中的数据最终都是存储在HDFS上,HBase天生的支持MR的操作

我们可以通过MR,直接处理HBase表中的数据,并且MR可以将处理后的结果直接存储到HBase表中。

16、HBase集成Hive

Hive提供了与HBase的集成,使得能够在HBase表上使用hive sql 语句进行查询、插入操作以及进行Join和Union等复杂查询,同时也可以将hive表中的数据映射到Hbase

Hive HBase
数据仓库 列存储的非关系型数据库
离线的数据分析和清洗,延迟较高 延迟较低,接入在线业务使用
基于HDFS、MapReduce 基于HDFS
一种类SQL的引擎,并且运行MapReduce任务 一种在Hadoop之上的NoSQL 的Key/vale数据库

将我们HBase的五个jar包拷贝到hive的lib目录下

17、HBase协处理器

HBase 在 0.92 之后,引入了协处理器(coprocessors),能够轻易建立二次索引、复杂过滤器(谓词下推) 以及 访问控制等。

协处理器有两种:Observer协处理器 endpoint协处理器

Observer协处理器:

  • 类似于 传统数据库中的 触发器,主要在服务端工作
  • 允许集群在正常的客户端操作过程中,可以有不同的行为表现
  • 可以实现权限管理、优先级设置、监控、 ddl 控制、 二级索引等功能

endpoint协处理器

  • 类似于 传统数据库中的存储过程,主要在 client 端工作
  • 允许扩展集群的能力,对客户端应用开放新的运算命令
  • 可以实现 min、 max、 avg、 sum、 distinct、 group by 等功能

协处理器的加载方式有两种

  • 静态加载 修改 hbase-site.xml
  • 动态加载 启用表aggregation,只对特定的表生效。

18、HBase表的rowkey设计 (三原则)

长度原则、散列原则、唯一原则

1)rowkey长度原则,建议尽可能短,但是也不能太短

2)rowkey散列原则,将rowkey的高位作为散列字段,
3) rowkey唯一原则,rowkey是按照字典顺序排序存储的

19、热点

检索habse的记录,首先要通过row key来定位数据行。
当大量的client访问hbase集群的一个或少数几个节点,造成少数region server的负载过大,而其他region server负载却很小,就造成了“热点”现象。

热点的解决方案(预分区 、加盐 、 哈希、 反转)

1)预分区:让表的数据可以均衡的分散在集群中,
2)rowkey加盐:在rowkey的前面增加随机数
3)哈希:使同一行永远用同一个前缀加盐。
4)反转:反转固定长度或者数字格式的rowkey,使得rowkey中经常改变的部分(最没有意义的部分)放在前面。

20、HBase的数据备份

1)基于HBase提供的类,把HBase中某张表的数据,导出到HDFS

2)基于snapshot快照的方式,实现HBase数据的迁移和拷贝。

创建表的snapshot
snapshot 'tableName', 'snapshotName'

恢复snapshot
disable 'tableName'
restore_snapshot 'snapshotName'
enable 'tableName'

21、HBase二级索引

rowkey就相当于hbase表的一级索引

hbase的二级索引,就是建立HBase表中列与行键之间的映射关系

构建hbase二级索引方案

  • (1) MapReduce方案
  • (2) Hbase Coprocessor(协处理器)方案
  • (3) Solr+hbase方案
  • (4) ES+hbase方案
  • (5) Phoenix+hbase方案

phoenix构建二级索引

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。Phoenix已经提供了对HBase二级索引的支持。

如果要启用phoenix的二级索引功能,需要修改配置文件hbase-site.xml

  • Global indexing,全局索引,适用于读多写少的业务场景。
  • Local indexing,本地索引,适用于写操作频繁以及空间受限制的场景。
--给表USER创建基于Global Indexing的二级索引
create index USER_COOKIE_ID_INDEX on USER ("f"."cookie_id"); 

--给表USER创建基于Local Indexing的二级索引
create local index USER_USER_ID_INDEX on USER ("f"."user_id");
发布了77 篇原创文章 · 获赞 25 · 访问量 9198

猜你喜欢

转载自blog.csdn.net/TU_JCN/article/details/105340806