一、Hbase简介
1.1
Apache Hbase 是Hadoop数据库,一个分布式、可伸缩的大数据存储。
1.2 Hbase的特点
大:一个表可以有数十亿行,上百万列。
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的 存储和权限控制,列(族)独立检索;
稀疏:对于空的列,并不占用存储空间,表可以设计的非常稀疏;
数据多版本:每个单元的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
数据类型单一: Hbase 中的数据都是字符串,没有类型。
二、Hbase 的角色
2.1 Hmaster 功能:
- 监控RegionServer
2.处理RegionServer 的故障转移
3.处理数据的变更
4.处理region的分配或转移
5.在空闲时间进行数据的负载均衡
6.通过Zookeeper发布自己的位置给客户端
2.2 RegionServer
功能:
1.负责存储Hbase的实际数据
2.处理分配给他的Region
3.刷新缓存到HDFS
4.维护Hlog
5.执行压缩
6.负责处理Region分片
组件:
1.Write-Ahead logs
Hbase 的修改记录,当时Hbase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间。但把数据保存在内存中可能有更高的概率引起熟路丢失,为了解决该问题,数据会先写到一个 Write-Ahead logs的文件中,然后再写入内存中。所以系统出现故障的时候,数据可以通过这个日志文件重建。
2.Hfile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
3.Store
Hflie存储在Store中,一个Store对应HBase表中的一个列族。
4.MemStore
是指内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer 会在内存中存储键值对。
5.Region
Hbase表的分片,Hbase表会根据RewKey 值被切分成不同的region存储在RegionServer中,在一个RegionServer 中可以有多个不同的region。
2.3 架构图
读数据流程:
1)HRegionServer 保存着 meta 表以及表数据,要访问表数据,首先 Client 先去访问 zookeeper ,从 zookeeper 里面获取 meta 表所在的位置信息,即找到这个 meta 表在哪个 HRegionServer 上保存着。
2)接着Client 通过刚才获取到的HRegionServer 的 IP 来访问meta 表所在的 HRegionServer, 从而读取到 Meta,进而获取到 Meta 表中存放的元数据。
3)Client 通过元数据中存储的信息,访问对应的 HRegionServer,然后扫描所在 HRegionServer 的 Memstore 和 Storefile 来查询数据。
最后 HRegionServer 把查询的数据响应给 Client
写数据流程:
1)Client 也是先访问 zookeeper,找到 Meta 表,并获取Meta 表信息。
2)确定当前将要写入的数据所对应的 RegionServer 服务器和 Region。
3)Client 向该 RegionServer 服务器发起写入数据请求,然后 RegionServer 收到请求并响应。
4)Client 先把数据写入到 Hlog ,防止数据丢失。
5)然后将数据写入到 Memstore.
6)如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore 到达阈值,会把 Memstore 中的数据 flush 到 StoreFile 中。
7)当 StoreFile 越来越多,会触发 Compact 合并操作,把过多的Storefile 合并成一个大的StoreFile 。当StoreFile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split 操作,将 Region 一分为二。
三、Hbase 部署与使用
3.1部署
1.Zookeeper正常部署
首先保证Zookeeper集群的正常部署,并且启动:
#:/usr/local/zookeeper-3.1.0/bin/zkServer.sh start
2.Hadoop正常部署
Hadoop集群的正常部署并且启动:
#:/usr/local/hadoop-2.7.2/bin/start-dfs.sh
#:/usr/local/hadoop-2.7.2/bin/start-yarn.sh
3.Hbase的解压
#:tar -zxvf hbase-1.3.1-bin.tar.gz -C /usr/local
4.Hbase的配置文件
hbase-env.sh 修改内容:
export JAVA_HOME=/usr/local/jdk1.8.0_121
export HBASE_MANAGES_ZK=false
hbase-site.xml修改内容:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98 后的新变动,之前版本没有.port,默认端口为 60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper-3.1.0/zkData</value>
</property>
</configuration>
regionservers:
hadoop01
hadoop02
hadoop03
3.2 Hbase 需要依赖的jar包
由于Habse需要依赖于Hadoop,所以替换Hbase的lib 的目录下的 jar 包,以解决兼容问题:
1.删除原有的jar包
rm -rf /usr/lcoal/hbase-1.3.1/lib/hadoop-*
rm -rf /usr/local/hbase-1.3.1/lib/zookeeper-3.4.6.jar
2.拷贝新jar包
hadoop-annotations-2.7.2.jar
hadoop-auth-2.7.2.jar
hadoop-client-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
hadoop-mapreduce-client-app-2.7.2.jar
hadoop-mapreduce-client-common-2.7.2.jar
hadoop-mapreduce-client-core-2.7.2.jar
hadoop-mapreduce-client-hs-2.7.2.jar
hadoop-mapreduce-client-hs-plugins-2.7.2.jar
hadoop-mapreduce-client-jobclient-2.7.2.jar
hadoop-mapreduce-client-jobclient-2.7.2-tests.jar
hadoop-mapreduce-client-shuffle-2.7.2.jar
hadoop-yarn-api-2.7.2.jar
hadoop-yarn-applications-distributedshell-2.7.2.jar
hadoop-yarn-applications-unmanaged-am-launcher-2.7.2.jar
hadoop-yarn-client-2.7.2.jar
hadoop-yarn-common-2.7.2.jar
hadoop-yarn-server-applicationhistoryservice-2.7.2.jar
hadoop-yarn-server-common-2.7.2.jar
hadoop-yarn-server-nodemanager-2.7.2.jar
hadoop-yarn-server-resourcemanager
hadoop-yarn-server-tests-2.7.2.jar
hadoop-yarn-server-web-proxy-2.7.2.jar
zookeeper-3.4.5.jar
特别提示:这些 jar 包的对应版本应替换成你目前使用的 hadoop 版本,具体情况具体分析。
3.3 Hbase软连接Hadoop配置
ln -s /usr/local/hadoop-2.7.2/etc/hadoop/core-site.xml
/usr/lcoal/hbase-1.3.1/conf/core-site.xml
ln -s /usr/local/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
/usr/local/hbase-1.3.1/conf/hdfs-site.xml