Hbase入门笔记----架构以及应用介绍

Hbase全称为Hadoop Database,即Hbase是Hadoop的数据库,是一个分布式的存储系统。Hbase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理Hbase中的海量数据。利用zookeeper作为其协调工具。

本篇文章将重点介绍Hbase三个方面的内容:Hbase体系结构(架构)的介绍、Hbase shell的操作、Hbase的Java api的客户端操作。

(一)Hbase的架构介绍

Hbase的体系结构是一个主从式的结构,主节点Hmaster在整个集群当中只有一个在运行,从节点HRegionServer有很 多个在运行,主节点Hmaster与从节点HRegionServer实际上指的是不同的物理机器,即有一个机器上面跑的进程是Hmaster,很多机器上面跑的进程是HRegionServer,Hmaster没有单点问题,Hbase集群当中可以启动多个Hmaster,但是通过zookeeper的事件处理机制保证整个集群当中只有一个Hmaster在运行。

既然Hbase是数据库,那么数据库从根本上来说就是存储表table的,但是我们在这里必须注意一下,Hbase并非是传统的关系型数据库(例如:Mysql、Oracle),而是非关系型数据库,因为Hbase是一个面向列的分布式存储系统。下面我们有必要介绍一下Hbase中表table的数据模型,先给大家呈现一个hbase数据库的表users:

(注意:我在下面举例子的过程中用的也是这张users表)

上面这个表就是一个典型的hbase table,与传统的关系型数据库具有很大的差别,下面我们详细介绍有关table的相关概念:

RowKey(行健):table的主键,table中的记录默认按照RowKey升序排序。

列族(Column Family):即表中的address、info。table在水平方向上有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column(例如address中的province、city、country、town)组成,即列族支持动态扩展,无需预先定义Column的数量以及类型,所有Column均已二进制格式进行存储,用户需要自行进行类型转换。

TimeStamp(时间戳):每次用户对数据进行操作对应的时间,可以看做是数据的Version number。例如在上面的表中,xiaoming所对应的company有两个数据信息(alibaba、baidu),而这两个单元格信息实际上是对应操作时间的,如下图所示:

既然Hbase可以将表中的数据进行分布式存储,那么它到底是以怎样的形式进行分布式存储的呢?我们自然而然想到了HDFS这个分布式文件管理系统是将海量数据切分成若干个block块进行存储的,同理Hbase也采取了类似的存储机制, 将一个table切分成若干个region进行存储,下面我们就介绍Region的相关概念:

当Table随着记录数不断增加而变大后,Table在行的方向上会被切分成多个Region,一个Region由[startkey,endkey) 表示,每个Region会被Master分散到不同的HRegionServer上面进行存储,类似于我的block块会被分散到不同的DataNode节点上面进行存储。下面是Hbase表中的数据与HRegionServer的分布关系,如图所示:

接下来介绍在Hbase的体系结构中,Hmaster、HRegionServer、Zookeeper集群这三个角色的作用:

Hmaster节点的作用:

①不负责存储表数据,负责管理RegionServer的负载均衡(即防止某些RegionServer存储数据量大,有些

RegionServer存储数据量小),调整RegionServer上面Region的分布

②管理RegionServer的状态,例如在HRegionServer宕机后,负责失效HRegionServer上Regions的迁移

③在Region Split后,负责新Region的分配

HRegionServer节点的作用:

HRegionServer主要负责响应用户的I/O请求,即负责响应用户向表中的读写操作,是Hbase体系结构中最核心的模块。HRegionServer内部存储了很多的HRegion,就像DataNode节点中存储了很多的Block块一样,从上图Hbase完整的体系结构中我们可以看到,HRegion实际上是由很多个HStore组成的,所谓HStore就是表中的一个Column Family,可以看出每个Column Family其实就是一个集中的存储单元,这恰恰也帮助我们理解了为什么Hbase是NoSql系列的数据库,为什么是面向列的数据库,在Hbase的表设计中,我们最好将具备共同I/O特性的Column放在同一个列族中,这样读写才最高效,为了让大家更好的理解HRegionServer、HRegion、HStore、ColumnFamily四者之间的关系,我结合之前提到的users表画了一个四者关系的示意图:

简单来说:就是HRegionServer服务器中存储了很多的HRegion,每个HRegion是由很过个HStore组成的,每个ColumnFamily就是一个HSore。

在此还要简单介绍一下HLog与MemStore这两个角色的作用:

Hlog:Hlog中存储了用户对表数据的最新的一些操作日志记录。

MemSore:HRegion会将大量的热数据、访问频次最高的数据存储到MemStore中,这样用户在读写数据的时候不需要从磁盘中进行操作,直接在内存中既可以读取到数据,正因为MemStore这个重要角色的存在,Hbase才能支持随机,高速读取的功能。

Zookeeper集群的作用:

①通过zk集群的事件处理机制,可以保证集群中只有一个运行的Hmater

②Zookeeper集群中记录了-ROOT-表的位置

在这里顺便介绍一下Hbase中两张特殊的表:-ROOT-表与.META.表

-ROOT-表:记录了所有.META.表的元数据信息,-ROOT-表只有一个Region

.META.表:记录了Hbase中所有用户表的HRegion的元数据信息,.META.表可以有多个Region

③Zookeeper集群实时监控着HRegionServer这些服务器的状态,将HRegionServer的上线和下线信息实时通知给Hmaster节点,使得Hmaster节点可以随时感知各个HRegionServer的健康状态。

在上面我们依次介绍了HMaster、HRegionServer、zookeeper集群的作用,Client使用Hbase的RPC机制与Hmaster与HRegionServer进行通信,对于管理类操作,Client与Hmaster进行RPC进行通信,对于数据(表)的读写类操作,Client与HRegionServer进行通信。注意:在用户对数据表的读写过程中,与Hmaster是没有任何关系的,Hmaster在这一点上不同于我们的NameNode节点,可以看出由于zookeeper集群的存在,Hmaster节点的作用被大大弱化了。

在Hbase的架构介绍中在介绍最后一点:Hbase的寻址机制,即Hbase在海量的表数据中,是如何找到用户所需要的表数据的呢?——Hbase是通过索引的机制解决了这个问题。

Client访问用户数据之前需要首先访问zookeeper集群,通过zookeeper集群首先确定-ROOT-表在的位置,然后在通过访问-ROOT- 表确定相应.META.表的位置,最后根据.META.中存储的相应元数据信息找到用户数据的位置去访问。通过 这种索引机制解决了复杂了寻址问题。

(二)Hbase中shell的相关操作

前面讲的都是Hbase的理论知识,对于Hbase的操作分为两种方式:shell与Java api的方式,既然是对数据库的操作,无非就是增删改查四中操作,下面我列出里几个常用的Hbase Shell操作,如下:

以之前的users表为例,我现在用shell命令进行相应操作:

①创建users表

create ‘users’, ‘address’,’info’

②向表中用put进行插入操作

put ‘users’,’xiaoming’,’address:province’,’zhejiang’

put ‘users’,’xiaoming’,’address:city’,’hangzhou’

put ‘users’,’xiaoming’,’address:country’,’china’

put ‘users’,’xiaoming’,’info:age’,’24’

put ‘users’,’xiaoming’,’info:age’,’25’

put ‘users’,’xiaoming’,’info:birthday’,’1987/06/17’

put ‘users’,’xiaoming’,’info:company’,’alibaba’

put ‘users’,’xiaoming’,’info:company’,’baidu’

………………

③通过get命令获取表中的信息,例如:

1、获取xiaoming的country单元格信息

get ‘users’,’xiaoming’,’address:country’

2、获取小明两个版本的年龄信息

get ‘users’,’xiaoming’,{COLUMN=>’info:age’,VERSIONS=>2}

3、获取zhangyifei全部的信息

get ‘users’,’zhangyifei’

4、获取zhangyifei的address列族的全部信息

get ‘users’,’zhangyifei’,’address’

5、遍历表中的全部信息

scan ‘users’

④用shell命令删除users表

disable ‘users’

drop ‘users’

综上:Hbase的shell命令操作整体来说还是非常简单的,获取信息的方法主要是按照下面的主线进行:

tablename———》rowkey———》Column Family:Colum———->Version信息——》获取信息!

(三)Hbase中Java api的相关操作

Hbase中,可以通过shell命令进行增删改查四种操作,但是shell命令用起来比较麻烦,比如说用put一次只能查询一个单元格的信息等等。因此我们在日常工作中总是用Java api的方式对Hbase进行相应操作,在这里还是以上面的users举例,下面是完整的代码操作:

package IT01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;

public class HbaseJavaapi
{
       public static String tablename = "users";
       public static void main(String[]  args) throws Exception
       {
             Configuration conf = HBaseConfiguration.create();
             /**下面这行代码必须有,指定Hbase所用的zookeeper集群信息****/
             conf.set("hbase.zookeeper.quorum","hadoop80");

             /*创建表-----用的Java api是HbaseAdmin**/
            @SuppressWarnings("resource")
            HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
            if(hBaseAdmin.tableExists(tablename))
            {
                hBaseAdmin.disableTable(tablename);
                hBaseAdmin.deleteTable(tablename);
            }
            HTableDescriptor desc = new HTableDescriptor(tablename);//指定创建表的名字users
            HColumnDescriptor family1 = new HColumnDescriptor("address");
            desc.addFamily(family1 );
            HColumnDescriptor family2 = new HColumnDescriptor("info");//指定列族的名称
            desc.addFamily(family2 );
            hBaseAdmin.createTable(desc);

            /*****插入记录------用的Java api是HTable****/
            @SuppressWarnings("resource")
            HTable hTable = new HTable(conf,tablename);
            Put put1 = new Put("xiaoming".getBytes());//插入记录时要指定行健
            put1.add("address".getBytes(), "province".getBytes(), "zhejiang".getBytes());
            put1.add("address".getBytes(), "city".getBytes(), "hangzhou".getBytes());
            put1.add("address".getBytes(), "country".getBytes(), "china".getBytes());
            put1.add("info".getBytes(),"age".getBytes(),"24".getBytes());
            put1.add("info".getBytes(),"age".getBytes(),"25".getBytes());
            put1.add("info".getBytes(),"birthday".getBytes(),"1987/06/17".getBytes());
            put1.add("info".getBytes(),"company".getBytes(),"baidu".getBytes());
            put1.add("info".getBytes(),"company".getBytes(),"alibaba".getBytes());
            hTable.put(put1 );
            Put put2 = new Put("zhangyifei".getBytes());//插入记录时要指定行健
            put2.add("address".getBytes(), "province".getBytes(), "guangdong".getBytes());
            put2.add("address".getBytes(), "city".getBytes(), "shenzhen".getBytes());
            put2.add("address".getBytes(), "city".getBytes(), "nansha".getBytes());
            put2.add("address".getBytes(), "country".getBytes(), "china".getBytes());
            put2.add("address".getBytes(), "town".getBytes(), "xianqiao".getBytes());
            put2.add("info".getBytes(),"age".getBytes(),"45".getBytes());
            put2.add("info".getBytes(),"birthday".getBytes(),"1987/02/12".getBytes());
            put2.add("info".getBytes(),"company".getBytes(),"tengxun".getBytes());
            put2.add("address".getBytes(), "favorite".getBytes(), "movie".getBytes());
            hTable.put(put2 );

            /****查询记录--------------用的Java api是Htable***/
            /**1------>获取小明的country单元格信息****/
            Get get = new Get("xiaoming".getBytes());
            Result result = hTable.get(get);
            byte[] value = result.getValue("address".getBytes(), "country".getBytes());
            System.out.println(new String(value));

            System.out.println("**************************");

            /**2------>获取zhangyifei的一行的记录****/
            Get get2 = new Get("zhangyifei".getBytes());
            Result result2 = hTable.get(get2);
            for(KeyValue key  : result2.list())//一行的记录当中包含很多的键值对信息,依次遍历即可
            {
                 System.out.println(key.toString());
                 System.out.println(new String(key.getValue()));
            }

            System.out.println("**************************");

            /**3------>遍历所有的记录****/
            Scan scan = new Scan();
            ResultScanner scanner = hTable.getScanner(scan);//scanner中包含很多条行记录
            for (Result result3 : scanner)
            {
                for(KeyValue key  : result3.list())//一行的记录当中包含很多的键值对信息,依次遍历即可
                {
                     System.out.println(key.toString());
                     System.out.println(new String(key.getValue()));
                }
            }

            System.out.println("**************************");

            /**4------>仅仅获取每行的city信息****/
            Scan scan1 =new Scan();
            ResultScanner scanner1 = hTable.getScanner(scan1 );
            for (Result result4 : scanner1)
            {
                  System.out.println(new String(result4.getRow()));
                  System.out.println(new String(result4.getValue("address".getBytes(), "city".getBytes())));
            }
       }
}

代码的运行结果如下:

对于Hbase的Java api操作就简单的介绍到这里!

另外对于上面Hbase的介绍,也就介绍到这里,如有问题,欢迎指正!

时间: 2024-10-12 03:20:41

Hbase入门笔记----架构以及应用介绍的相关文章

Hive入门笔记-----架构以及应用介绍

Hive这个框架在Hadoop的生态体系结构中占有及其重要的地位,在实际的业务当中用的也非常多,可以说Hadoop之所以这么流行在很大程度上是因为Hive的存在.那么Hive究竟是什么,为什么在Hadoop家族中占有这么重要的地位,本篇文章将围绕Hive的体系结构(架构).Hive的操作.Hive与Hbase的区别等对Hive进行全方面的阐述. 在此之前,先给大家介绍一个业务场景,让大家感受一下为什么Hive如此的受欢迎: 业务描述:统计业务表consumer.txt中北京的客户有多少位?下面是

Flume入门笔记------架构以及应用介绍

在具体介绍本文内容之前,先给大家看一下Hadoop业务的整体开发流程: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出我们本文的主角-Flume.本文将围绕Flume的架构.Flume的应用(日志采集)进行详细的介绍. (一)Flume架构介绍 1.Flume的概念 flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来说flume就是收集日志的. 2.

Sqoop入门笔记-----架构以及应用介绍

本篇文章在具体介绍Sqoop之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Sqoop在业务当中的实际地位. 如上图所示:在实际的业务当中,我们首先对原始数据集通过MapReduce进行数据清洗,然后将清洗后的数据存入到Hbase数据库中,而后通过数据仓库Hive对Hbase中的数据进行统计与分析,分析之后将分析结果存入到Hive表中,然后通过Sqoop这个工具将我们的数据挖掘结果导入到MySql数据库中,最后通过Web将结果展示给客户. 向大家展示完Hadoop业务开发流程之后,将

HBase入门笔记--读性能优化

一.前言 在生产环境使用HBase过程中,随着数据量的不断增加,查询HBase数据变得越来越慢,对于业务来说是不可用的,需要对读性能进行优化 二.问题定位 从hbase监控指标来看,发现FullGC次数频繁,大家都知道FullGC对系统的影响很大,会使系统资源都耗在GC上,其它性能就会影响,另一个异常是Compact队列一直在阻塞,需要compact的文件过多又不无法及时得到compact,这个就导致小文件越来越多得不到合并影响读性能. 三.问题解决 初步定位到原因之后,考虑从以下几个方面进行优

一条数据的HBase之旅,简明HBase入门教程-Write全流程

如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发,以及RegionServer侧将数据写入到Region中的全部流程. NoSQL漫谈 本文整体思路 前文内容回顾 示例数据 HBase可选接口介绍 表服务接口介绍 介绍几种写数据的模式 如何构建Put对象(包含RowKey定义以及列定义) 数据路由 Client侧的分组打包 Client发RPC请求到Regi

redis入门笔记(2)

redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,这是相对memcache来说的一个大的优势.redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式. Snapshotting        快

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

二、OpenStack入门 之 架构分析

OpenStack入门 之 架构分析 写在前面 学习目标: 了解 OpenStack 各组件的逻辑关系: 了解 OpenStack 的各组件的通信和部署关系: 了解 OpenStack 的工作流程: 接下来我会掌握: OpenStack 组件间的逻辑关系: OpenStack 的API: OpenStack 组件间的通信关系: OpenStack 中几种不同的存储: OpenStack 工作流程: OpenStack 的部署架构: OpenStack 各组件之间的关系有:逻辑关系,通信关系,部署

Hbase 技术细节笔记(上)

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张秀云 前言 最近在跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行了Hbase相关技术的分享,由于Hbase涵盖的内容比较多,因此计划分享2期,下面就是针对第一期Hbase技术分享整体而成,第一期的主要内容如下: 一.Hbase介绍二.Hbase的Region介绍三.Hbase的写逻辑介绍四.Hbase的故障恢复五.Hbas