第 5 章 HBase简介、部署与开发 本章首先介绍HBase数据库,包括数据模型、系统架构及存储格式。其次 介绍HBase的安装和配置,以及如何使用HBaseShell建表和增加、删除、修改、 查询数据。最后剖析了一个HBaseJava实例。 ..5.ae简介 1 HBs HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库系统。利用 HBase可在廉价PCServer上搭建大规模结构化数据管理集群。 HBase是一款借鉴GoogleBigtable技术实现的开源软件。Bigtable利用 GFS作为其文件存储系统,HBase则利用HDFS作为其文件存储系统;Bigtable 利用MapReduce处理Bigtable中的海量数据,HBase则利用HadoopMapReduce处理HBase中的海量数据;Bigtable利用Chubby实现协同服务, HBase则利用Zookeper实现同样的功能。 在Hadoop生态系统中,HBase为一款结构化数据管理工具。HDFS为 HBase提供了高可靠性的底层存储支持,HadoopMapReduce为HBase提供了 高性能的计算能力,Zookeper为HBase提供了稳定服务和故障转移(Failover) 机制。Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得从传统数 据库向HBase迁移变得非常方便。 ..5.2 HBase访问接口 HBase提供了丰富的访问接口。 (1)NativeJavaAPI:是最常用且高效的访问方式,适合MapReduceJob 并行处理HBase表格的数据。 使用 ( 。 2)HBaseShel:是HBase的命令行工具,适合对HBase进行管理时 (3)ThriftGateway:利用Thrift序列化技术,支持C++、PHP 、Python等 多种语言,适合其他异构系统访问HBase表格数据。 (4)RESTGateway:支持REST风格的HTTPAPI访问HBase,解除了 82 Hadop与Spark入门 语言限制。 (5)Pig:可以使用PigLatin编程语言来操作HBase中的数据(编译成MapReduce Job来处理HBase表格的数据),适合做数据统计。 6)Hiv7.va (e:0.0以上版本的Hie支持HBse,使得用户可以使用类似SQL的查询 语言来访问HBase。 ..5.3 HBase的数据模型 HBase包含如下4个重要概念。 Table:HBase的表格,类似关系数据库的表格,但是有所不同。 RowKey:行键,是Table的主键,Table中的记录按照RowKey排序。 Column和ColumnFamily(列簇或者列分组):Table在垂直方向由一个或者多个 ColumnFamily组成。ColumnFamily可以由任意多个Column组成,即ColumnFamily 支持动态扩展,无须预先定义Column的数量以及类型。所有Column均以二进制格式 存储,用户需要自行进行类型转换。 Timestamp:每次数据操作对应的时间戳,可以看作是数据的版本号(Version Number)。 图5-1展示了一个HBase的数据模型实例,该表以反转的URL作为RowKey。 图5- 1 HBase的数据模型 这个表格有两个ColumnFamily,分别是Contents和Anchor。Contents保存了页面 的内容,每个时间戳对应一个页面,可以保留该页面的不同历史版本;Anchor则保存了指 向这个页面(即引用该页面)的其他页面的锚点(即其他页面的超链接指向本页面)的文本 信息。 tlutaecnicok(.ok.a) 在这个实例中,CNN的主页,被SporsIsrtd(ns.om)和MyLomyloc 两个页面指向,所以每行记录有Anchr:cnicom和Anhr:my.ok.a两列,它们隶 ons.coloc 属于同一个ColumnFamily,即Anchor。 这个表格有两个RowKey,第一个RowKey保留了3个时间戳的Contents列,一个 chcnichmy.ok. 时间戳的Anor:ns.om列,以及另一个时间戳的Ancor:loca列。 当Table的记录数不断增加而变大后,一个Table逐渐分裂(Split)成多个Split,称 为Region。每个Region由[startkey,endkey)或[startkey,endkey]表示,不同的Region 被Master分配给相应的RegionServer进行管理(存储),如图5-2所示。 HBase中有两张特殊的Table:-ROOT-和.META. 。 第5章HBase简介、部署与开发83 图5-2HBase的Region(1).META.:记录用户表的Region信息,其可以有多个Region。 (2)-ROOT-:记录.META.表的Region信息,其只有一个Region。 Zookeeper中记录了-ROOT-表的位置信息(Location)。Client访问数据之前需要先 访问Zookeeper,再访问-ROOT-表,然后访问.META.表,进而找到用户数据的位置,最后 访问具体的数据。 ..5.4HBase系统架构 HBase系统架构如图5-3所示,这是一个典型的主从(Master-Slave)架构,包含 HMaster、HRegionServer和Zookeeper。 图5- 3 HBase的系统架构 Client:HBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行 通信。对于管理类操作,Client通过RPC访问HMaster;对于数据读写类操作,Client通 过RPC访问HRegionServer。 Zookeper:ZookeperQuorum 存储-ROOT-表的地址和HMaster的地址。 HRegionServer把自己以短暂的(Ephemeral)方式,注册到Zookeper中,使HMaster可 84Hadoop与Spark入门 以随时感知各个HRegionServer的健康状态。引入Zookeeper,避免了HMaster的单点 失败问题。 HMaster:HMaster负责Table和Region的管理工作,具体包括如下内容。 (1)管理用户对Table的增加、删除、修改、查询操作。 (2)管理HRegionServer的负载均衡,调整Region分布。 (3)在Region分裂后,负责分配新的Region。 (4)在HRegionServer停机后,负责失效HRegionServer上的Region的迁移。 HBase可以启动多个HMaster,通过Zookeeper的MasterElection机制,保证总有 一个ActiveMaster运行,所以HMaster没有单点失败问题。 HRegionServer:主要负责响应用户I/O请求,向HDFS读写数据,是HBase中最核 心的模块。每个HRegionServer大约可以管理1000个Region。 图5-4为HRegionServer的内部结构。 图5- 4 HRegionServer的内部结构 HRegionServer内部管理一系列HRegion对象,每个HRegion对应了Table中的一 个Region。HRegion由多个HStore组成,每个HStore对应了Table中的一个Column Family的存储。可以看出,每个ColumnFamily是一个集中的存储单元,因此最好将具 备共同I/O特性的Column放在一个ColumnFamily中,这样可以提高I/O效率。 HStore存储是HBase存储的核心模块,由两部分组成,即MemStore和一系列 StoreFile。MemStore是排序内存缓冲区(SortedMemoryBufer),用户写入的数据首先 会放入MemStore,当MemStore满了以后,写入一个StoreFile(底层实现是HFile)。 当StoreFile数量增长到一定阈值,会触发压缩(Compact)合并操作,将多个 StoreFile合并成一个大的StoreFile,合并过程中会进行版本合并和数据删除。 第5章HBase简介、部署与开发85HBase只能增加数据,所有的更新和删除操作都是在后续的压缩(Compact)过程中 进行的。这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高 性能。当 StoreFile压缩后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一 定阈值后,会触发分裂操作,把当前Region分裂成两个Region,父Region会下线,新分 裂出的两个子Region会被HMaster分配到相应的HRegionServer上,使得原先一个 Region的读写压力得以分流到两个Region上,如图5-5所示。 图5-5HBase压缩/分裂过程 在分布式系统环境中,无法避免系统出错或者宕机。一旦HRegionServer意外退 出,MemStore中的内存数据将会丢失,因此需要引入HLog。 每个HRegionServer都有一个HLog对象,HLog是一个实现预写日志(Write AheadLog,WAL)的类。在每次用户操作写入MemStore时,首先写一份数据到HLog 文件中。HLog文件定期删除旧的日志(已持久化到StoreFile中的数据)。 当HRegionServer意外终止后,HMaster会通过 gZookeper感知到这个情况, HMaster首先会处理遗留的HLog文件,将其中不同Reion的Log数据进行拆分,分别 放到相应Region的目录下,然后再将失效的Region重新分配。领取到这些Region的 HRegionServer,在装载Region的过程中,会发现有历史HLog需要处理,因此会重放 HLog(应用日志记录)中的数据到MemStore中,然后写入StoreFile中,完成数据恢复。 ..5.5 HBase存储格式 HBase的所有数据文件都存储在HadoopHDFS上,包括两种文件类型。 (1)HFile:Hadoop的二进制格式文件,实现HBase中KeyValue数据的存储。 StoreFile是对HFile做了轻量级包装,即StoreFile底层就是HFile。 (2)HLogFile:在HBase中实现WAL(WriteAheadLog)的存储格式,本质上是 HadoopSequenceFile。 HFile的存储格式如图5-6所示。 HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer 中有指针指向其他数据块的起始点。FileInfo中记录了文件的一些元信息,如AVG_ KEY_LEN 、AVG_VALUE_LEN 、LAST_KEY 、COMPARATOR 、MAX_SEQ_ID_KEY 等。DataIndex和MetaIndex块记录了每个Data块和Meta块的起始点。因此,HFile 86Hadoop与Spark入门 图5-6HFile的存储格式 形成了一种自描述的文件结构。 Data块是HBaseI/O的基本单元。为了提高效率,HRegionServer中实现了基于最 近最少使用(LeastRecentlyUsed,LRU)的BlockCache机制。每个Data块的大小可以 在创建一个Table时通过参数指定,较大的块有利于顺序扫描,较小的块有利于随机 查询。每 个Data块除了开头的Magic信息以外,就是由一个个<Key,Value>拼接而成 的。Magic的内容是一些随机数字,目的是防止数据损坏。 HFile里面的每个<Key,Value>都是一个简单的字节(Byte)数组,但是字节数组里 面包含了很多项,并且有固定的结构。 如图5-7所示,字节数组开始是两个固定长度的数值,分别表示Key的长度和Value 的长度。然后是Key部分具体项目排序如下:①固定长度的数值,表示RowKey的长 度;②RowKey;③固定长度的数值,表示ColumnFamily的长度;④ColumnFamily(见 图5-1中的AncooumnQulfer(见图5-1中的cnscom或者my.ok.a); hr);⑤Claiiniloc ⑥两个固定长度的数值,表示Timestamp和KeyType(Put/Dele)。最后Value部分结 构简单,就是纯粹的二进制数据。te(.) 图5- 7 字节数组 HLogFile的存储格式如图5-8所示。 HLog文件就是一个普通的HadoopSequenceFile。HLogSequenceFile的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了Table和Region名字外, 同时还包括SequenceNumber和Timestamp。Timestamp是写入时间,Sequence Number的起始值为0,或者是最近一次存入文件系统的SequenceNumber。HLogSequenceFile的Value是HBase的<Key,Value>对象,即对应HFile中的Key和 Value。 第5章HBase简介、部署与开发87 图5-8HLogFile的存储格式 ..5.6在HBase系统上运行MapReduce 可以在HBase系统上运行MapReduce作业,如图5-9所示,实现数据的批处理。 图5- 9 在HBase系统上运行MapReduce的原理 HBaseTable和Region的关系,类似于HDFSFile和Block的关系。HBase提供了 配套的TableInputFormatAPI 和TableOutputFormatAPI,可以方便地将HBaseTable 作为HadoopMapReduce的数据源(Source)和目的地(Sink)。对于MapReduce作业的 应用开发人员,不需要关注HBase系统的细节。 ..5.7 HBase安装、配置与运行 下面介绍如何安装、配置和运行HBase数据库。 配置192.129 、130 、131 虚拟机的//hs文件。增 168.31.192.31.168.ecs 168.192.31.tot 88 Hadoop与Spark入门 加如下内容: 127.0.0.1 localhost 从官方网址下载HBase安装包hbase-1.2.5-bin.tar.gz。 解压缩后,对目录进行重新命名。 cd /opt/linuxsir tar xzvf hbase-1.2.5-bin.tar.gz ls hbase-1.2.5 mv hbase-1.2.5 /opt/linuxsir/hbase HBase 可以以独立(Standalone)、伪分布式(Pseudo-Distributed)、分布式 (Distributed)3种模式进行部署,这里只介绍分布式模式。 修改/opt/linuxsir/hbase/conf目录下的hbase-env.sh脚本文件。设置JAVA_HOME的 环境变量,以便启动HBase。 export JAVA_HOME=/opt/linuxsir/java/jdk export HBASE_CLASSPATH=/opt/linuxsir/hadoop/etc/hadoop export HBASE_MANAGES_ZK=true 注意: (1)HBASE_CLASSPATH 环境变量的设置,使得HBase和Hadoop的配置文件相 连。也就是把Hadoop配置文件所在目录加入HBASE_CLASSPATH 环境变量,使 HBase看到HDFS的配置信息。 (2)如果想使用外部的Zookeeper,那么HBASE_MANAGES_ZK应该设置为false。 修改当前用户目录下的~/.bashrc文件,并使之生效。 echo "">>~/.bashrc echo "export HBASE_HOME=/opt/linuxsir/hbase">>~/.bashrc echo "export PATH=\$HBASE_HOME/bin:\$PATH">>~/.bashrc echo "export CLASSPATH=\$CLASSPATH:/opt/linuxsir/hbase/lib/*">>~/.bashrc cat ~/.bashrc source ~/.bashrc 执行如下命令,建立一些目录,包括tmp/zookeeper等。 mkdir /opt/linuxsir/hbase/tmp 第5章 HBase简介、部署与开发 89 ls /opt/linuxsir/hbase/zookeeper //没有该目录就创建 mkdir /opt/linuxsir/hbase/zookeeper 有任何错误,可以先把tmp和zookeeper目录删除后再尝试。 rm -rf /opt/linuxsir/hbase/tmp rm -rf /opt/linuxsir/hbase/zookeeper 编辑HBase配置文件,即/opt/linuxsir/hbase/conf目录下的hbase-site.xml,内容 如下: <? xml version="1.0"? > <? xml-stylesheet type="text/xsl" href="configuration.xsl"? > <configuration> <property> <name> hbase.rootdir</name> <!- - 用户无需手动创建HBase 的data 目录,HBase 启动的时候会自动创建--> <value>hdfs://hd-master:9000/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/linuxsir/hbase/zookeeper</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hd-master,hd-slave1,hd-slave2</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/linuxsir/hbase/zookeeper</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> 90 Hadoop与Spark入门 <value>12181</value> </property> </configuration> 在分布式模式下,HBase 集群包含若干节点,运行主HMaster 进程、Backup HMaster进程、Zookeeper进程及HRegionServer进程等。 本书采用如下部署规划,注意Zookeeper进程的部署已经在hbase-site.xml文件中 设置。 (1)HMaster进程,运行在hd-master、hd-slave1(backup)上。 (2)Zookeeper进程,运行在hd-master、hd-slave1、hd-slave2上。 (3)HRegionServer进程,运行在hd-slave1、hd-slave2上。 编辑/opt/linuxsir/hbase/conf目录下的regionservers文件,内容如下: hd-slave1 hd-slave2 编辑/opt/linuxsir/hbase/conf目录下的backup-masters文件,内容如下: hd-slave1 注意:这里没有关于HMaster的部署位置的配置。当在hd-master上启动HBase 时,hd-master节点将运行HMaster进程。 .. 5.8 启动HBase并且测试 从hd-master复制/opt/linuxsir/hbase目录以及~/.bashrc文件到hd-slave1和hdslave2, 并且在3个节点上使~/.bashrc文件生效。 clear scp -r /opt/linuxsir/hbase hd-slave1:/opt/linuxsir scp -r /opt/linuxsir/hbase hd-slave2:/opt/linuxsir scp ~/.bashrc hd-slave1:~/.bashrc scp ~/.bashrc hd-slave2:~/.bashrc source ~/.bashrc ssh root@192.168.31.130 source ~/.bashrc ssh root@192.168.31.131 source ~/.bashrc 启动HBase前,需要先启动Hadoop。 首先,清空日志目录,以便启动出错时,方便查看最新出错信息。