HBase高可用

考虑关于HBase集群的一个问题,在当前的HBase集群中,只有一个Master,一旦Master出现故障,将会导致HBase不再可用。所以,在实际的生产环境中,是非常有必要搭建一个高可用的HBase集群的。

HBase高可用简介

HBase的高可用配置其实就是HMaster的高可用。要搭建HBase的高可用,只需要再选择一个节点作为HMaster,在HBase的conf目录下创建文件backup-masters,然后再backup-masters添加备份Master的记录。一条记录代表一个backup master,可以在文件配置多个记录。

搭建HBase高可用

  1. 在hbase的conf文件夹中创建 backup-masters 文件
cd /export/server/hbase-2.1.0/conftouch backup-masters
  1. 将node2.itcast.cn和node3.itcast.cn添加到该文件中
vim backup-masters

node2.itcast.cn
node3.itcast.cn

  1. 将backup-masters文件分发到所有的服务器节点中
scp backup-masters node2.itcast.cn:$PWDscp backup-masters node3.itcast.cn:$PWD
  1. 重新启动hbase
stop-hbase.shstart-hbase.sh
  1. 查看webui,检查Backup Masters中是否有node2.itcast.cn、node3.itcast.cn
    http://node1.itcast.cn:16010/master-status

  2. 尝试杀掉node1.itcast.cn节点上的master
    kill -9 HMaster进程id

  3. 访问http://node2.itcast.cn:16010和http://node3.itcast.cn:16010,观察是否选举了新的Master

HBase架构

系统架构

  • Client
    客户端,例如:发出HBase操作的请求。例如:之前我们编写的Java API代码、以及HBase shell,都是CLient

  • Master Server
    在HBase的Web UI中,可以查看到Master的位置。

    监控RegionServer
    处理RegionServer故障转移
    处理元数据的变更
    处理region的分配或移除
    在空闲时间进行数据的负载均衡
    通过Zookeeper发布自己的位置给客户端

  • Region Server

    处理分配给它的Region
    负责存储HBase的实际数据
    刷新缓存到HDFS
    维护HLog
    执行压缩
    负责处理Region分片

    RegionServer中包含了大量丰富的组件,如:Write-Ahead logs、HFile(StoreFile)、Store、MemStore、Region。

逻辑结构模型

  • Region
    在HBASE中,表被划分为很多「Region」,并由Region Server提供服务

  • Store
    Region按列蔟垂直划分为「Store」,存储在HDFS在文件中

  • MemStore

    1. MemStore与缓存内存类似
    2. 当往HBase中写入数据时,首先是写入到MemStore
    3. 每个列蔟将有一个MemStore
    4. 当MemStore存储快满的时候,整个数据将写入到HDFS中的HFile中
  • StoreFile

    1. 每当任何数据被写入HBASE时,首先要写入MemStore
    2. 当MemStore快满时,整个排序的key-value数据将被写入HDFS中的一个新的HFile中
    3. 写入HFile的操作是连续的,速度非常快
    4. 物理上存储的是HFile
  • WAL

    WAL全称为Write Ahead Log,它最大的作用就是 故障恢复
    WAL是HBase中提供的一种高并发、持久化的日志保存与回放机制
    每个业务数据的写入操作(PUT/DELETE/INCR),都会保存在WAL中
    一旦服务器崩溃,通过回放WAL,就可以实现恢复崩溃之前的数据
    物理上存储是Hadoop的Sequence File

常见问题

Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

  1. 找到$HADOOP_HOME/etc/mapred-site.xml,增加以下配置
<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value></property>
  1. 将配置文件分发到各个节点
  2. 重新启动YARN集群

Caused by: java.net.ConnectException: Call to node2.itcast.cn/192.168.88.101:16020 failed on connection exception: org.apache.hbase.thirdparty.io.netty.channel.ConnectTimeoutException: connection timed out: node2.itcast.cn/192.168.88.101:16020

无法连接到HBase,请检查HBase的Master是否正常启动

Starting namenodes on [localhost] ERROR: Attempting to launch hdfs namenode as root ,ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.

解决办法:
是因为缺少用户定义造成的,所以分别编辑开始和关闭脚本

$ vim sbin/start-dfs.sh $ vim sbin/stop-dfs.sh 

在顶部空白处添加内容:

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

Starting resourcemanager ERROR: Attempting to launch yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch. Starting nodemanagers ERROR: Attempting to launch yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch.

vim sbin/start-yarn.sh vim sbin/stop-yarn.sh 

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

Exception in thread “main” java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat

解决方案:
将 hadoop.dll 放到c:/windows/system32文件夹中,重启IDEA,重新运行程序