本文主要讨论这几个问题:
- HBase系统组成
- Master
- RegionServer
- 底层文件系统(Hadoop HDFS)
- Zookeeper
- ThriftServer
- RestServer
- 客户端驱动(Java API)
1. HBase系统组成


- HBase服务端主要包括如下几个组件:
- Master
- Master节点
- RegionServer
- HBase服务集群的Region服务器节点
- Master
- 底层文件系统
- 默认推荐是将HBase构建在Hadoop HDFS分布式文件系统之上
- Zookeeper
- 分布式协调组件
- 分布式协调组件
- ThriftServer
- 提供Thrift协议(跨语言通信协议)接口服务
- RestServer
- 提供HTTP协议Rest接口服务
- 客户端驱动(Java API)
- Java客户端驱动程序
2. Master
- Master的主要实现类为org.apache.hadoop.hbase.master.HMaster,会启动一个HMaster进程,默认会监听16000端口(hbase.master.port)和web ui的16010(hbase.master.info.port)
- HBase服务集群的主节点,可以启动多个HMaster,通过Zookeeper实现Master的选举机制,保证总有一个Master主节点提供服务,其他作为standby
- Master服务主要负责metadata的变更和集群中regionserver的监控管理工作:
- 元数据操作接口(HBase表的创建,删除,修改,启用,禁用,表信息查询等)
- 在Region分裂后,负责新Region分配
- Region的负载均衡,调整Region分布
- 在RegionServer挂掉后,负责故障转移,负责RegionServer上Region的迁移
- 内置httpserver,提供HBase Master UI访问界面
- 由于Master节点不负责数据,因此其需要的内存和CPU资源不像RegionServer那么多,通常部署运行在hadoop集群的namenode节点上
- 由于客户端处理数据时直接与RegionServer交互,并且HBase表的meta data不会常驻HMaster,会保存在”hbase:meta”表中,因此集群可以在没有master节点存在情况下客户端仍然能短期内(如果没有RegionServer宕机或者region分裂等)“正常”对表数据进行操作。
3. RegionServer
- RegionServer的主要实现类为org.apache.hadoop.hbase.regionserver.HRegionServer,会启动一个HRegionServer进程,默认会监听hbase region server端口,16020(hbase.regionserver.port)和region server web ui端口,默认是16030(hbase.regionserver.info.port)
- RegionServer会负责客户端的数据读写,在Hadoop集群中通常和DataNode部署在同一节点,这样可以实现数据本地性,提高读写效率
- RegionServer主要负责Region的管理工作以及为客户端提供数据读写操作:
- 定期向Master汇报RS的情况,包括RS内存使用状态、在线状态的Region等信息
- 管理Region,执行Flush、Compaction、Open、Close、Load等操作
- 管理预写日志(WAL)
- 提供客户端的数据操作,执行数据插入、更新和删除操作,以及数据查询
- Metrics:对外提供了衡量HBase内部服务状况的参数
- 内置HttpServer,提供访问RS的界面
4. 底层文件系统(Hadoop HDFS)
- HBase推荐生产环境使用Hadoop HDFS作为底层文件系统。但是HBase使用的文件系统是一个可插拔的架构,可以使用任何支持Hadoop接口的文件系统代替HDFS。
- 通过HDFS的多副本机制实现了HBase的数据文件HFile的数据冗余备份,因此,当某个RegionServer崩溃后,不用担心数据丢失。
5. Zookeeper
- HBase集群利用Zookeeper作为分布式协调服务来实现HMaster选举与主备切换、系统容错、RootRegion管理、Region状态管理和分布式SplitWAL任务管理等
- Zookeeper中存储了hbase:meta表的位置信息
- HBase集群可以使用其自身管理的Zookeeper,也可以配置独立部署的Zookeeper集群
6. ThriftServer
- 因为HBase是Java语言编写的,其提供的Java客户端driver只能Java客户端调用。而Thrift是一个跨语言的通信框架,因此HBase提供了ThriftServer供其他语言通过Thrift协议调用HBase接口。
- 当用户通过Thrift协议访问ThriftServer时,ThriftServer实际上也是用的Java Client API去访问的HBase.
- Thrift接口有两个版本:Thrift和Thrift2,Thrift2是为了适应新的Java API而提出的,但由于Thrift2版本没有完全兼容Thrift版本,因此就保留了两个版本,Thrift2的接口设计的比Thrift接口更贴近现在的API。
- org.apache.hadoop.hbase.thrift.ThriftServer
- org.apache.hadoop.hbase.thrift2.ThriftServer
- 目前HDP版本,ambari默认是没有集成对HBase ThriftServer管理的,需要手动进行启动:
- 默认thrift server默认监听9090端口(hbase.regionserver.thrift.port),thrift server的web ui默认监听9095端口(hbase.thrift.info.port)
- bin/hbase-daemon.sh start thrift –infoport 19991 -p 19990
- bin/hbase-daemon.sh start thrift2 –infoport 19991 -p 19990
7. RestServer
- 和Thrift接口一样,HTTP协议的rest接口也和语言不相关。
- 接口服务主要实现类为org.apache.hadoop.hbase.rest.RestServer
- bin/hbase-daemon.sh start rest -p <port>
8. 客户端驱动(Java API)
- 使用HBase的client可能会遇到依赖冲突的问题,比如HBase中使用了protobuf,而项目其他地方可能使用了版本不兼容的protobuf,这时需要通过maven-shade-plugin对protobuf依赖进行包名重命名。具体可参见:《HBase 工程中 protobuf 版本冲突解决》
- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client/2.2.1
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-shaded-client</artifactId>
<version>2.2.1</version>
</dependency>
/* 本文属于原创文章,转载请注明作者和出处 quarterback.cn,请勿用于任何商业用途 */