个人大数据总结之Hbase(一)-----安装及逻结构

前言:

在大数据领域有一个非常著名的产品-hbase,其有别于传统的rdbms,被称之为列式数据库。那么什么是列式数据库呢?既然有列,那是不是也有行式数据库呢?

行式数据库:可以简单的理解为是传统的rdbms这些数据库,存放的是结构化的数据,非常有利于全表数据的扫描,但是相对来说,对于个别字段的扫描,就不那么方便了。

列式数据库:列式数据库是对行式数据库的一个改进,将部分列(或者说有关联的一些列)存放到单独的一个文件中,其他列存在其他多个文件中,我们在进行 查询的时候,只需要读取这些常用的列即可完成工作,这样减少了文件IO的读写,提高读写的效率(不用再像行式数据库那样进行全表的扫描,然后过滤相关字段)。

一、hbase简介

1.是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,

2.HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,(利用zookeeper作为协调工具)。

3.特点

(1)hbase自身的特点

   ①高可靠性

   ②高性能

   ③面向列

   ④可伸缩

(2)hbase中表的特点

  ①可以纵向扩展

  ②可以横向扩展

二、hbase体系结构

1.逻辑结构(重点)

 ①表(table)

  划分数据集合的概念,和传统的db中的表的概念是一样的。

 ②行键(rowkey)

  一行数据的唯一标识,若想要操作hbase表中的一条数据,必须通过行键来定位,行键在hbase底层是使用字节数组进行存放的,所以方便我们使用rowkey来进行排序。

 一行数据的唯一标示,要想操作(read/write)一条数据,必须通过行健,其在hbase底层都是使用字节数组进行存放,所以方便我们使用rk进行排序,
        ③列族(columnFamily)

简单的认为是一系列“列”的集合,列族是以单独的文件来进行存储的。

④列限定符(column Qualifier)

 通常称之为列。列里边的数据定位通过列限定符,每个列族可以有一个或多个列成员(ColumnQualifier)。列成员不需要再定义表时规定,后期新加就可以了,可以动态注入。每个新加的列都会附带一个时间戳。在单元格中可以存放多个版本的数据。

 ⑤单元格(cell)

  cell由行键,列族:限定度,时间戳唯一决定的,cell中的数据时没有类型的,全部以字节码形式存储,在使用java api去请求hbase数据时,所得的数据基本都存储在cell中。


 2.物理结构(重点)

①HMaster  --- 类似于hadoop的NameNode

  作用:管理节点,用于管理hbase中的Table和Region的结构操作,比如用户增、删、修改表的操作。

在hbase集群中,可以启动多个HMaster,但是只能有一个HMaster属于Active的状态,通过zookeeper和其他standby状态的HMaster进程完成状态的切换或者选举。

我们可以使用HMaster的shutdown来关闭整个集群,在关闭整个集群的时候,需要通知HRegionServer进行关闭,并反馈给HMaster,HMaster才自行关闭。

②HRegionServer   --- 类似于hadoop中的DataNode

 存放Region的服务器,需要再HMaster进行注册,只有注册成功后,HMaster才可以对其进行管理,在HBase集群中,可以部署多个HregionServer。HRegionServer是hbase中最核心的模块,直接负责对用户I/O的相应,直接向hdfs读写数据,一个HRegionServer中拥有一个HLog和多个HRegion。

按这样来说,一个HRegionServer中的多个HRegion共享一个HLog,也就是说多张表共享一个HLog,HLog接受用户的操作数据,当然HRegion也会写数据,当HRegion数据写入成功之后,会发送一条删除数据的指令(数据写入成功的指令),Hlog的相关数据会首次被标记删除,等到一个阈值后,Hlog会执行一次文件的大合并(major Compact)。

③HRegion

其是真正用来存储数据的,而且它可以简单的理解为表的一个分区,存放一张表中的一部分数据,当该region中的数据超过一定数量的时候,会自动分裂成两个region(一分为二),从这个角度上而言,Region是对hbase中表横向的划分。

每一个HRegion有多个HStore组成,每一个HRegion是一张表中所有的列组成的(列是所有的列,但不一定是所有的行),每一个region都有一个startkey和endkey。

假设,我一张表里面有100条记录,我要把它分别存放到10个region里面,又因为存放在hbase里面的数据都是有序的,是能够进行一个高速随机读写的

也就是说有序能够保证我的快读,就需要能够通过rowkey,快速的定位到当前记录在哪一个region里面,然后当定位到region之后,再去扫描当前region,获取数据

为了满足于此,我们就对这些region进行划分,编号,也是为了方便管理。这里每一个region的范围:
        [startKey, endKey),需要注意一定最后一个region的endkey是需要被包含进去的。
        region 0     [null, 10)
        region 1     [10, 20)
        region 2     [20, 30)
        region ...     ...
        region 9     [90, null]④HStore

  ④ HStore

每一个HRegion由多个HStore来组成,一个HStore对应HRegion中的一个列族,一个HStore有一个MemStore和一系列的StoreFiles组成。    

HStore级别不会持有锁以及事务,锁和事务是在高一级别的HRegion持有的,HStore最核心的一个service就是合并memstore刷新到磁盘里边的storefiles,然后把多个storefiles合并成为一个storefile,写到hdfs里边,当storefile写到hdfs后就会被称为hfile。

在写的过程中,唯一涉及到hlog的部分就是关于hlog日志的重建过程,当hstore将用户提交的数据最终写到hdfs之后,会反馈给hlog,并将其里边冗余的数据删除掉。

 

 可以在配置文件中指定hstore数量为多少时开启hstore的合并工作。
 hbase.hstore.compactionThreshold=3,  --代表党hstore数量为3时,开始store的合并工作。
拓展:

 ①Compaction:

      minjor compaction(小合并):

            就是将多个HFile合并成为一个大的HFile,然后对之前的HFile做清除处理。

            常见的会在执行删除数据的动作、以及达到hbase.hstore.compactionThreshold触发条件的时候发生

            删除数据:不会立即删除,做一个标记(标记删除),等到执行合并操作的时候,才进行数据的处理

      marjor compaction(大合并):

             将一个列族中的所有的HFile合并成为一个HFile,然后对之前的HFile做清除处理。

             大合并非常消耗性能,非常耗时,不建议操作,当然是直接可以在shell执行操作的。

②把在HBase中的HLog存在的意义称之为WAL(write ahead log,预写日志)机制,这种机制有对应的专业的数据结构

SLM-Tree(Structured Log Merge-Tree), 这是HBase能够达到高速随机写,而且能够保障数据不丢失根本原因。

⑤memstore

    注意:在memstore写的过程中,必须不能是多线程(并行)调用的,hstore在调用的过程中必须持有一个读锁和写锁。

在写的过程中,预先将数据在memstore中进程排序,因为数据最终是有序存放的,当memstore中的数据量超过阈值之后,就会舒心到磁盘文件 storefile中。   

hbase.hregion.memstore.flush.size=128M,storeFile 默认的大小就是128M---->刚好对应了一个datanode的block块的大小 

⑥storeFile

最终保存在HStore数据的文件,数据时有memstore不断向磁盘刷新过程中产生的,当storefile达到一定量的时候,会将这些

storefile组成一个storefiles。,且这个storefiles有可能持有其他store里边的storefile。

⑦HFlie

在hdfs上存放数据之前的一个物理结构,用于接收从客户端提交过来的数据。

HFile中的数据都是key-value键值对的方式存储,并且key和value都是字节数组,并且因为数据已经在memstore中排序过了,所以数据在hfile中也是有序的。

hfile同时是由一个个的block来组成的,最终k-v实际上是在这一个个的block中的,block的推荐的大小在8k~1M之间,默认

大小65536byte-->16kb。

三、hbase的安装

1.软件环境

(1)我现在使用hbase的版本是hbase-1.2.5

(2)hadoop

(3)zookeeper

(4)java

hadoop、zookeeper的安装我会在以后的文章中为大家介绍的~或者大家可以先在网上找一些资料,学习怎么去安装~


2.单机版本

(1)解压

tar -zxvf soft/hbase-1.2.5-bin.tar.gz 

(2)将hbase添加至环境变量

vi /etc/profile

export HBASE_HOME=/opt/hbase

(3)修改配置文件

在安装hbase时,主要是修改两个配置文件,hbase-env.sh和hbase-site.xml 

hbase-env.sh:

    在这里配置比较简单,只要添加两条记录即可。

     

export JAVA_HOME=/opt/jdk
export HBASE_MANAGES_ZK=false   -- (这里指明不适用hbase自己的zookeeper,要使用我们安装的)

 hbase-site.xml :

            <property>
                <name>hbase.rootdir</name>
                <value>hdfs://ns1/hbase</value>
            </property>
            <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
            </property>
            <property>
                <name>hbase.zookeeper.quorum</name>
                <value>master</value>
            </property>

(4) 启动

sh $HBASE_HOME/bin/start-hbase.sh

在这个时候,我们使用jps命令,当HMaster、HRegionServer两个进程都启动的时候,这证明我们的单机hbase已经启动成功了,见以下两张图,因为我搭建的是集群,所有HMaster、HRegionServer没有在一台服务器上。

(5)停止

 sh $HBASE_HOME/bin/stop-hbase.sh

(6)单个进程启动 

HMaster的启动: hbase-daemon.sh start master

HRegionserver的启动: hbase-daemon.sh start regionserver

   (7)访问

web访问: http://127.0.0.1:16010

cli访问: bin/hbase shell

3.分布式安装

(1)既然我们已经完成了单机安装,那么分布式的安装也就比较简单了,只需要在单机的版本上新增一个配置文件conf/regionservers, 并在其内添加两个节点(两行):

slave01

slave02

 注意:如果已经配置过单机版,我们需要将hbase在hdfs上的目录,以及hbase在zk中的目录清楚,以免和我们的集群版本操作发生冲突。

(2)修改配置文件hbase-site.xml

            <property>
                <name>hbase.zookeeper.quorum</name>
                <value>master,slave01,slave02</value>
            </property>

(3)拷贝master上面的数据到slave01和slave02

scp -r /opt/hbase root@slave01:/opt

 scp -r /opt/hbase root@slave02:/opt

 同样在slave01和slave02上面添加相关环境变量

 scp /etc/profile root@slave01:/etc/profile.d/

scp /etc/profile root@slave02:/etc/profile.d/

注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。

注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。

注意:在我们每次修改环境变量后,一定别忘记使用souce命令使其生效。
      
     (4)启动hbase集群

sh $HBASE_HOME/bin/start-hbase.sh

这个时候在master机器上面,有一个进程HMaster,在slave01和slave02上面分别有一个HRegionServer (如上面截图)

至此,我们hbase的简单介绍以及安装已经介绍完了,希望对大家能够有所帮助~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章