一周一个中间件-hbase

前言

hbase是大数据的生态的一部分,是高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。介于nosql和RDBMS之间。主要存储非结构化和半结构化的松散数据。

海量数据存储
快速随机访问
大量写操作的应用

背景

我们公司现在需要一套监控系统,并且需要存储一系列的用户访问数据,这些数据很松散,现在看起来无关紧要的数据但是确实潜在的用户行为数据。之后会帮助我们分心用户行为,为我们提供个性化数据作为依据。
在综合现在主流的监控系统,cat,pinpoint,zikpin,SkyWalking等监控系统。我们选择了pinpoint这个基于字节码注入的调用链分析。所消耗的性能低,无代码侵入性。但是搭建pinpoint时,需要使用hbase作为存储数据的数据库。

知识准备

  • region

RegionServer.理解为数据节点,存储数据的
region服务器的内存主要服务于内部数据结构。你需要64位操作系统和使用大于4G的内存空间。

  • 架构图

  • HMater

HMaster是Master Server的实现,负责监控集群中的RegionServer实例,同时是所有metadata改变的接口,在集群中,通常运行在NameNode上面。master机器不需要大存储空间,不需要挂载过多的磁盘。由于master的重要性大于slalve。可以通过冗余提升硬件可用率。
master机器要运行NameNode,SecondaryNameNode,JobTRacker和HBase Master.800TB数据推荐24G内存。

  • slave

HBase的RegionServer.slave机器要使用DataNode,TaskTracker和HBase RegionServer.800TB数据推荐24G内存以上配置。

  • hbase使用的文件系统

本地模式: hbase可以不使用HDFS或者其他集群。使用FileSystem类连接到文件系统实现。Hadoop客户端加载并使用hadoop提供ChecksumFileSystem类直接操作本地磁盘路径来存储所有的路径。
参数 file:///
HDFS模式: 是默认的文件系统,Hbase选择HDFS作为文件系统。
hdfs://😕

  • hbase集群

单机模式
分布式模式
hbase的主从架构,hmaster作为主节点,hregionServer作为从节点。

宕机分为 HMaster 宕机和 HRegisoner 宕机,如果是HRegisoner 宕机, HMaster 会将其所管理的 region 重新分布到其他活动的
 RegionServer 上.

由于数据和日志都持久在 HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。

如果是 HMaster 宕机, HMaster 没有单点问题.

HBase 中可以启动多个 HMaster,通过Zookeeper 的 Master Election 机制保证总有一个 Master 运行。

即 ZooKeeper 会保证总会有一个 HMaster 在对外提供服务

参考文献

HBase权威指南(中文版) 提取码: nisk

HBase安装包 hbase-2.2.1-bin.tar提取码:utts

安装

单机安装和分布式安装。
在linux服务器中指定位置 wget //mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.2.1/hbase-2.2.1-src.tar.gz
编辑conf/hbase-env.sh文件指定运行HBase的java环境。
export JAVA_HOME=/usr/bin/java
export HBASE_MANAGES_ZK=true 将zookeeper设置true(true使用hbase自带的zk,false使用自己安装的zk)
修改配置hbase-site.xml

<configuration>
	<property>
       <name>hbase.rootdir</name>
          <value>file:////root/hbase-2.2.1-Data/HbaseData</value>
    </property>
    <!-- hbase zookeeper数据存储地址 -->
    <property>
    	<name>hbase.zookeeper.property.dataDir</name>
    	<value>/root/hbase-2.2.1-Data/zkData</value>
  	</property>
 	<property>
    	<name>hbase.cluster.distributed</name>
    	<value>true</value>
  	</property>
  	<!-- zookeeper集群的地址 -->
  	<property>
    	<name>hbase.zookeeper.quorum</name>
    	<value>47.105.153.163</value>
  	</property>
  	<!-- zookeeper集群的端口 -->
  	<property>
    	<name>hbase.zookeeper.property.clientPort</name>
    	<value>2183</value>
  	</property>
</configuration>

执行命令行 ./start-hbase.sh > console.out &
单机下这就已经就可以启动了。

  • 问题1
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately 
using -XX:ParallelGCThreads=N
可能因为服务器内存不足。

下面是介绍集群环境下的hbase的环境的安装。
conf/hbase-site.xml指定使用HDFS的/hbase目录作为根目录。HDFS的端口9000,数据只保留一个副本。
hbase shell是hbase的命令行脚本

hbase原理

  • hbase实时查询

可以认为是从内存中查询的,HBase的机制就是将数据先写入内存中,当数据量到达一定的量(128m),在写入磁盘。,在内存中,是不进行数据的更新或者合并操作,只增加数据,使得用户写操作进入内存就可以立即返回。保证hbase的I/O的高性能。

  • hbase合并文件

Compact操作。当hbase中每当memstore数据flush到硬盘,形成storefile,当storefile的数量达到一定程度后,需要将storefile文件compact操作。
compact操作:1 合并文件 2清除过期,多版本的数据 3 提高读写数据的效率
二种方式 minor操作。和major操作。

Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。
Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用 filter 的场景HBase 为筛选数据提供了一组过滤器,通过这个过滤器可以在 HBase 中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列名,时间戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是通过scan设置的,所以是基于scan的查询结果进行过滤.过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;如在进行订单开发的时候,我们使用rowkeyfilter过滤出某个用户的所有订单 
  • hbase机制

在 HBase 中无论是增加新行还是修改已有行,其内部流程都是相同的。 HBase 接到命令后存下变化信息,或者写入失败抛出异常。默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead log,也称 HLog)和 MemStore。 HBase 的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。MemStore 是内存里的写入缓冲区, HBase 中数据在永久写入硬盘之前在这里累积。当MemStore 填满后,其中的数据会刷写到硬盘,生成一个 HFile。 HFile 是 HBase 使用的底层存储格式。 HFile 对应于列族,一个列族可以有多个 HFile,但一个 HFile 不能存储多个列族的数据。在集群的每个节点上,每个列族有一个 MemStore。大型分布式系统中硬件故障很常见, HBase 也不例外。设想一下,如果 MemStore 还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据就会丢失。 HBase 的应对办法是在写动作完成之前先写入 WAL。 HBase 集群中每台服务器维护一个 WAL 来记录发生的变化。WAL 是底层文件系统上的一个文件。直到 WAL 新记录成功写入后,写动作才被认为成功完成。这可以保证 HBase 和支撑它的文件系统满足持久性。大多数情况下, HBase 使用Hadoop 分布式文件系统(HDFS)来作为底层文件系统。如果 HBase 服务器宕机,没有从 MemStore 里刷写到 HFile 的数据将可以通过回放WAL 来恢复。你不需要手工执行。 Hbase 的内部机制中有恢复流程部分来处理。每台HBase 服务器有一个 WAL,这台服务器上的所有表(和它们的列族)共享这个 WAL。你可能想到,写入时跳过 WAL 应该会提升写性能。但我们不建议禁用 WAL,除非你愿意在出问题时丢失数据。如果你想测试一下,如下代码可以禁用 WAL: 注意:不写入 WAL 会在 RegionServer 故障时增加丢失数据的风险。关闭 WAL,出现故障时 HBase 可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。