如何部署HBase的集群?

Apache-Hadoop

1 基础知识

1.1 HBase的简介

– HBase是一个分布式的可扩展的大数据存储
– HBase适用于对大型数据进行随机、实时的读写访问
– HBase目标是托管非常大的表(数十亿行X百万列)
– HBase是一个开源的、分布式的、版本化的非关系数据库
– HBase模仿谷歌的“Bigtable: A Distributed Storage System for Structured Data
– HBase在Hadoop和HDFS之上提供类似Bigtable的功能
– HBase是一种NoSQL数据库(不支持SQL作为主要访问语言的RDBMS)
– HBase从技术角度更像数据存储而非数据库(例如缺少类型列、二级索引、触发器、高级查询语言等)
– HBase支持线性和模块化缩放功能
– Hbase集群通过添加托管在商品类服务器上的Region Servers进行扩展(Region Servers翻倍则存储和处理亦翻倍)

1.2 HBase支持的功能

– 支持强一致读写,HBase不是最终一致的数据存储,这使得他非常适合作为高速计数器聚合等任务
– 支持表自动分片,HBase表通过区域分布在集群上,区域会随着数据的增长而自动分隔和重新分配
– 支持Region Servers之间的自动故障转移
– 支持与Hadoop或HDFS集成,- HBase支持HDFS作为其分布式文件系统
– 支持与MapReduce集成,HBase支持通过MapReduce进行大规模并行处理并将HBase作为源和接收器
– 支持Java客户端和API,HBase支持使用Java API进行编程访问
– 支持Thrift或REST API,Hbase支持非Java前端的Thrift和REST
– 支持块缓存和布隆过滤器,HBase支持块缓存和布隆过滤器以实现高容量和查询优化
– 支持运营管理,HBase提供内置网页,用于运营洞察和JMX指标

1.3 HBase的架构

1.3.1 HBase的Master角色

– HBase Master可简称HMaster
– HMaster负责监视集群中的所有RegionServer实例
– HMaster为HBase客户端提供元数据(类似块存储的指针)服务(增删改查)

1.3.2 HBase的RegionServer角色

– HBase的RegionServer为特定HBase客户端提供区域管理(接入、读数据、写数据)
– HBase的RegionServer为特定数据范围行提供读写服务
关于区域的概念,详细的结构如下,

Table                    (HBase table)
    Region               (Regions for the table)
        Store            (Store per ColumnFamily for each Region for the table)
            MemStore     (MemStore for each Store for each Region for the table)
            StoreFile    (StoreFiles for each Store for each Region for the table)
                Block    (Blocks within a StoreFile within a Store for each Region for the table)

如上所示,具体结构名称解析如下,
– “Table”即HBase的数据表名称
– “Region”即Table的区域(指示数据存储的服务器节点名称)
– “Store”即Table的ColumnFamily(即“Region”下逻辑存储路径名称)
– “MemStore”即“Store”下的内存数据存储路径名称
– “StoreFile”即“Store”下的文件数据存储路径名称(数据先存“MemStore”,达到特定的阈值刷新到“StoreFile”)
– “Block”即“StoreFile ”下的具体数据块名称

1.3.3 HBase的客户端

– HBase客户端可通过查询“HBase:meta”表寻找服务于特定区域的RegionServer
– HBase客户端连接该区域的RegionServer(不是连接Master服务)
– HBase客户端向区域RegionServer发起读写请求
– HBase客户端缓存当前区域可用的RegionServer以备下次使用
– HBase客户端缓存的RegionServer如果失效,则进行重新的查询以便重新缓存

1.4 HBase的适用场景

– HBase适用于数亿或数十亿行数据的场景(几千或百万行可使用传统的RDBMS)
– HBase使用需确保应用可没有RDBMS提供的所有额外功能情况下生存(例如,键入列、二级索引、事务、高级查询语言)
– HDFS适用于包含5个节点在内的集群环境

1.5 HBase与Hadoop或HDFS的区别

– HDFS是一种分布式文件系统,非常适合存储大型文件
– HDFS不是通用文件系统且不提供文件的快速单个记录查找。
– HBase建立在HDFS之上,为大型表提供快速记录查找和更新。
– HBase内部将数据存放于HDFS的索引“StoreFile”中(便于高速查找)

1.6 HBase的运行模式

1.6.1 单机模式

– 单机模式是HBase的默认模式
– 单机模式下HBase使用的是本地文件系统(非HDFS)
– 单击模式下HBase的所有服务和zooKeeper都运行于一个JVM中

1.6.2 伪分布模式

– 伪分布模式下,进程仅运行于一台服务器
– 伪分布模式下,同一台服务器运行多个JVM
– 伪分布模式可用于模拟测试,但不能用于性能测试

1.6.3 完全分布模式

– 完全分布模式下,HBase守护进程的实例在集群中的多个节点运行
– 完全分布模式适用于生产环境

1.7 完全分布模式下的角色与关系

1.7.1 HBase的Master角色

– Master可配置角色的主从关系
– 主Master角色,即英文“Primary Master”
– 备份Mster角色,即英文“Backup Master”

1.7.2 HBase的RegionServer角色

– 集群需要部署HBase的多个RegionServer角色
– 该角色的配置文件为“conf/regionservers”
– “conf/regionservers”配置文件使用主机列表定义该角色

2 HBase的部署知识

2.1 依赖关系与兼容性

2.1.1 HBase与Java的兼容性

HBase Version JDK 7 JDK 8 JDK 9 (Non-LTS) JDK 10 (Non-LTS) JDK 11

2.1+

1.3+

2.1.2 HBase与hadoop的兼容性

HBase-1.3.x HBase-1.4.x HBase-1.5.x HBase-2.1.x HBase-2.2.x

Hadoop-2.4.x

Hadoop-2.5.x

Hadoop-2.6.0

Hadoop-2.6.1+

Hadoop-2.7.0

Hadoop-2.7.1+

Hadoop-2.8.[0-2]

Hadoop-2.8.[3-4]

Hadoop-2.8.5+

Hadoop-2.9.[0-1]

Hadoop-2.9.2+

Hadoop-3.0.[0-2]

Hadoop-3.0.3+

Hadoop-3.1.0

Hadoop-3.1.1+

如上表所示,

  • = 经过测试可正常运行

  • = 已知功能不完整或存在CVE,因此在较新的次要版本中放弃支持

  • = 未测试,可能存在未知问题

2.1.3 HBase与ZooKeeper的兼容性

– HBase需要安装ZooKeeper 3.4.x

2.2 HBase的配置文件

2.2.1 配置的部署

– HBase使用与Apache Hadoop相同的配置机制,所有配置都存储“conf”目录
– HBase的“conf”目录需要集群中的所有运行节点保持同步
– HBase的配置文件分布模式下需要自行发布到集群的运行节点(HBase不会自动完成)
– HBase的配置文件分布模式下可通过rsync或scp或其他工具发布到运行节点
– HBase的配置需要重启服务方能正式生效
– HBase的配置完全分布模式的配置范例请参阅官方链接
– HBase的配置完全分布模式的重要配置请参阅官方链接

2.2.2 hbase-site.xml

– 该配置文件为HBase的主要配置文件
– 该配置文件包含覆盖HBase默认配置的配置选项
– 该配置文件的默认配置文件为“docs/hbase-default.xml”(不允许编辑该文件)
– 该配置文件可使用“HBase Web UI”的“HBase Configuration”选项卡中查看有效配置
– 该配置文件的完全分布模式范例如下,

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://namenode.example.org:8020/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>node-a.example.com,node-b.example.com,node-c.example.com</value>
  </property>
</configuration>

以上范例配置意义如下,
– 属性“hbase.rootdir”指示HBase的数据存储的根为HDFS的数据存储路径“hdfs://namenode.example.org:8020/hbase”
– 属性“hbase.cluster.distributed”设置为“true”指示HBase以全分布模式启动
– 属性“hbase.zookeeper.quorum”指定ZooKeeper仲裁的主机列表

2.2.3 hbase-env.sh

– 该配置文件用户设置HBase相关环境变量
– 该配置文件包含Java的位置配置和Java选项
– 该配置包含被注释的配置范例

2.2.4 regionservers

– 该配置文件为纯文本定义
– 该配置文件用于定于HBase集群的RegionServer角色主机定义(主机名称或IP地址)
– 该配置文件包含一行“localhost”的主机定义(定义集群中的所有节点都运行RegionServer服务)
– 该配置文件可使用“xmllint -noout filename.xml” 命令验证配置的格式
– 该配置文件的范例如下,

node-a.example.com
node-b.example.com
node-c.example.com

2.2.5 backup-masters

– 该配置文件默认情况下需要自行创建
– 该配置文件为纯文本格式
– 该配置文件用于列出启用备份主机进程的主机名称
– 该配置文件的范例如下,

node-b.example.com
node-c.example.com

2.2.6 hadoop-metrics2-hbase.properties

– 该配置文件用于连接HBase Hadoop的Metrics2框架
– 该配置文件包含被注释的配置范例
– 该配置文件详细请参阅Wiki文档

2.2.7 hbase-policy.xml

– 该配置文件用于配置RPC(远程过程调用)服务器的授权策略
– 该配置用于HBase的安全性配置

2.2.8 log4j.properties

– 该配置文件用于定义HBase的日志输出配置

2.3 HBase的节点通讯

– HBase集群节点之间使用SSH协议进行通讯
– HBase集群中的所有节点必须运行SSH服务以便于管理Hadoop和HBase守护进程
– HBase要求使用公钥认证的方式(无密码管理)从Master或Backup Master连接到所有节点(包括自己)

2.4 HBase的节点的时间同步

– HBase集群在时间较大偏差情况下可能会导致不稳定或意外行为
– HBase需要使用NTP协议(网络时间协议)进行时钟同步

2.5 HBase的性能要求

2.5.1 文件数量限制

– HBase数据库需要允许用户一次性打开大量的文件,否则可能会提示如下错误,

2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Exception increateBlockOutputStream java.io.EOFException
2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Abandoning block blk_-6935524980745310745_1391901

– Linux可使用“ulimit -n”检查当前系统的配置,一般为“1024”,官方建议值为“10240”
– 所需打开的文件数量取决于Columnfamilies的数量和区域数量,粗略的计算公式如下,

(StoreFiles per ColumnFamily) x (regions per RegionServer)

– 设RegionServer有100区域,每区域有3个ColumnFamily,每ColumnFamily有3个StoreFiles,即需开文件数为“3*3*100=900”
– 设置需开启的文件数量请使用“/etc/security/limits.conf”配置,用法请用“man limits.conf”查询或参考如下范例,

hadoop soft nproc 32000
hadoop hard nproc 32000

– “limits.conf”配置依赖于“/etc/pam.d/common-session”文件包含“session required pam_limits.so”行的配置

3 最佳实践

3.1 环境信息

3.1.1 角色Hadoop HDFS的基本信息

hostname = hd0[1-5].cmdschool.org
ipaddress = 10.168.0.10[1-5] OS = centOS 7.6 x86_64

详细的角色分布如下,
Apache Hadoop HDFS NameNode(hdfs-nn) = hd01.cmdschool.org
Apache Hadoop HDFS SecondaryNameNode(hdfs-snn) = hd02.cmdschool.org
Apache Hadoop HDFS DataNode(hdfs-snn) = hd0[3-5].cmdschool.org
注:
– Hbase的完全分布模式下需要HDFS支撑,如果你尚未配置HDFS,请参阅https://www.cmdschool.org/archives/5579
– 本章HDFS实例由“hadoop-2.6.5”提供

3.1.2 角色Apache Hadoop YARN的基本信息

hostname = hd0[1-5].cmdschool.org
ipaddress = 10.168.0.10[1-5] OS = centOS 7.6 x86_64

详细的角色分布如下,
Apache Hadoop YARN ResourceManager(yarn-rm) = hd01.cmdschool.org
Apache Hadoop YARN NodeManager(yarn-nm) = hd0[1-5].cmdschool.org
注:
– Hbase的完全分布模式下需要YARN支撑,如果你尚未配置YARN,请参阅https://www.cmdschool.org/archives/8313
– 本章YARN实例由“hadoop-2.6.5”提供

3.1.3 角色Apache ZooKeeper的基本信息

hostname = hd[06-10].cmdschool.org
ipaddress = 10.168.0.1[06-10] OS = centOS 7.6 x86_64

详细的角色分布如下,
Apache Hadoop ZooKeeper(zoo) = hd[06-10].cmdschool.org
注:
– ZooKeeper的“leader”与“followers”角色由集群投票自行选举
– Hbase的完全分布模式下需要ZooKeeper支撑,如果你尚未配置ZooKeeper,请参阅https://www.cmdschool.org/archives/8605
– 本章ZooKeeper实例的版本为“zookeeper-3.4.14”

3.1.4 角色Apache HBase的基本信息

hostname = hd[06-10].cmdschool.org
ipaddress = 10.168.0.1[06-10] OS = centOS 7.6 x86_64

详细的角色分布如下,
HBase Master(hbase-master) = hd06.cmdschool.org
HBase BackupMaster(hbase-bmaster) = hd07.cmdschool.org
Hbase RegionServers(hbase-region) = hd[08-10].cmdschool.org

3.2 系统的基本配置

3.2.1 安装Java

In hd[01-10],
– 由于前面章节默认会部署,所以可直接跳过此配置
– 如果有其他节点需要配置,请参阅以下方法安装jdk-8u121-linux-x64,
https://www.cmdschool.org/archives/397

3.2.2 配置SSH公钥认证

In hd[01-10],
– 服务器需要安装ssh客户端与SSHD服务端
– 详细请参阅后面的实践章节,此处不再详述

3.2.3 名称解析

In hd[01-10],
– HBase需要使用本地的主机名(hostname)获取IP地址
– HBase会使用主机名解析到正确的接口IP(适用于多接口)
– Hbase可通过设置“hbase.regionserver.dns.interface”指定正确的主接口
– 由于前面章节与后面章节会有配置,此处不再详述

3.2.4 回环接口(可选)

In hd[06-10],
– Hbase需要使用回环接口进行快速自访问
– 例如,可按如下实例配置,

vim /etc/hosts

加入如下配置,

            127.0.0.1 localhost
            127.0.0.1 hbase01.cmdschool.org hbase01

注:由于前面章节与后面章节会有配置host与接口私网地址的名称解析,我们认为性能不会相差太远,可选配置

3.2.5 配置NTP服务

In hd[01-10],
Hbase服务可容忍稍微的时间偏差,但不能太大,故需要使用NTP服务校准时间,

yum install -y chrony

确认以下时间服务器的配置符合环境需求,

grep ^server /etc/chrony.conf

可见如下服务配置,

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

如果不符合请更换为内网的NTP服务器地址,可使用如下命令启动服务并配置自启动

systemctl start chronyd.service
systemctl enable chronyd.service

另外还建议你根据实际配置时区,

timedatectl set-timezone 'Asia/Shanghai'

3.2.6 优化内核配置

In hd[01-10],

vim /etc/security/limits.d/hadoop.conf

加入如下配置,

hadoop soft nproc 32000
hadoop hard nproc 32000

另外,还需要配置以下配置才能使limits配置生效,

vim /etc/pam.d/common-session

加入如下配置,

session required  pam_limits.so

3.3 软件环境配置

3.3.1 下载软件包

In hd[06-10],

cd ~
wget http://archive.apache.org/dist/hbase/1.3.5/hbase-1.3.5-bin.tar.gz

如果你需要其他版本,请从以下链接下载,
http://archive.apache.org/dist/hbase/

3.3.2 解压软件包

In hd[06-10],

tar -xf hbase-1.3.5-bin.tar.gz

3.4 部署软件包

3.4.1 配置运行用户

In hd[06-10],

groupadd hbase
useradd -g hbase -d /var/lib/hbase/ hbase

3.4.2 部署软件到目录

In hd[06-10],

mv hbase-1.3.5 /usr/

部署完成后,建议创建以下目录便于管理,

ln -s /usr/hbase-1.3.5/conf/ /etc/hbase

另外,还需配置目录权限

chown hbase:hbase -R /usr/hbase-1.3.5/
chmod 755 -R /usr/hbase-1.3.5/

2.4.3 配置主到从节点的hbase用户公钥认证

In hd06,

su - hbase
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

In hd01,

mkdir -p /var/lib/hbase/.ssh/
scp hd06:/var/lib/hbase/.ssh/id_rsa.pub /var/lib/hbase/.ssh/

ssh hd07 mkdir -p /var/lib/hbase/.ssh/
scp /var/lib/hbase/.ssh/id_rsa.pub hd07:/var/lib/hbase/.ssh/authorized_keys
ssh hd07 chown hbase:hbase -R /var/lib/hbase/.ssh/
ssh hd07 chmod 0600 /var/lib/hbase/.ssh/authorized_keys

ssh hd08 mkdir -p /var/lib/hbase/.ssh/
scp /var/lib/hbase/.ssh/id_rsa.pub hd08:/var/lib/hbase/.ssh/authorized_keys
ssh hd08 chown hbase:hbase -R /var/lib/hbase/.ssh/
ssh hd08 chmod 0600 /var/lib/hbase/.ssh/authorized_keys

ssh hd09 mkdir -p /var/lib/hbase/.ssh/
scp /var/lib/hbase/.ssh/id_rsa.pub hd09:/var/lib/hbase/.ssh/authorized_keys
ssh hd09 chown hbase:hbase -R /var/lib/hbase/.ssh/
ssh hd09 chmod 0600 /var/lib/hbase/.ssh/authorized_keys

ssh hd10 mkdir -p /var/lib/hbase/.ssh/
scp /var/lib/hbase/.ssh/id_rsa.pub hd10:/var/lib/hbase/.ssh/authorized_keys
ssh hd10 chown hbase:hbase -R /var/lib/hbase/.ssh/
ssh hd10 chmod 0600 /var/lib/hbase/.ssh/authorized_keys

配置完成后,可使用如下命令测试,
In hd06,

su - hbase
ssh hd06
ssh hd07
ssh hd08
ssh hd09
ssh hd10

3.4.4 配置从到主节点的hbase用户公钥认证

In hd06,

su - hbase
scp /var/lib/hbase/.ssh/id_rsa hd07:/var/lib/hbase/.ssh/id_rsa
scp /var/lib/hbase/.ssh/id_rsa hd08:/var/lib/hbase/.ssh/id_rsa
scp /var/lib/hbase/.ssh/id_rsa hd09:/var/lib/hbase/.ssh/id_rsa
scp /var/lib/hbase/.ssh/id_rsa hd10:/var/lib/hbase/.ssh/id_rsa

配置完成或,务必使用如下命令测试公钥认证,
In hd[06-10],

su - hbase
ssh hd06

注:以上,如果不用输入密码即可完成登录,则配置完成。

3.5 配置软件包

3.5.1 配置软件包的环境变量

In hd[06-10],

vim /etc/profile.d/hbase.sh

加入如下定义,

export HBASE_HOME=/usr/hbase-1.3.5
export PATH=${HBASE_HOME}/bin:$PATH
export HBASE_CONF_DIR=/etc/hbase
export HBASE_STOP_TIMEOUT=1200
export HBASE_MASTER=hd06:${HBASE_HOME}

– 变量“HBASE_HOME”声明HBase的家目录
– 变量“PATH”声明可执行文件的位置(加入HBase执行文件的声明)
– 变量“HBASE_CONF_DIR”声明HBase配置文件路径
– 变量“HBASE_MASTER”声明使用RSync同步的HBase目标主机与目录
创建完成后,你需要使用如下命令导入环境变量,

source /etc/profile.d/hbase.sh

配置环境变量所需的目录,

mkdir -p /var/run/hbase/
chown hbase:hbase /var/run/hbase/
chmod 775 /var/run/hbase/
mkdir -p /var/log/hbase
chown hbase:hbase /var/log/hbase
chmod 775 /var/log/hbase

3.5.2 配置HBase的启动环境变量

In hd01,

cp /usr/hbase-1.3.5/conf/hbase-env.sh /usr/hbase-1.3.5/conf/hbase-env.sh.default
vim /usr/hbase-1.3.5/conf/hbase-env.sh

修改如下参数,

export JAVA_HOME=/usr/java/jdk1.8.0_121
export HBASE_LOG_DIR=/var/log/hbase
export HBASE_IDENT_STRING=$USER
export HBASE_NICENESS=10
export HBASE_PID_DIR=/var/run/hbase
export HBASE_MANAGES_ZK=false

– 变量“JAVA_HOME”声明JDK的家目录
– 变量“HBASE_LOG_DIR”声明HBase日志目录位置
– 变量“HBASE_IDENT_STRING”声明HBase的运行用户
– 变量“HBASE_NICENESS”声明HBase的运行级别
– 变量“HBASE_PID_DIR”声明HBase的PID目录位置
– 变量“HBASE_MANAGES_ZK”设置为“false”声明Hbase不管理ZooKeeper(即ZooKeeper是独立分开的)
另外,由于使用的是JDK8+,所以如下行需要注释掉,

# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
#export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
#export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"

否则启动服务可见如下提示,

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0

3.6 配置PrimaryMaster节点

3.6.1 配置HBase启动所需的目录

In hd01,

su - hdfs
hdfs dfs -mkdir /hbase
hdfs dfs -chown hbase:hbase /hbase

配置完毕后,我们建议使用如下命令确认,

su - hdfs
hdfs dfs -ls /

可见如下显示,

 
Found 1 items
drwxr-xr-x   - hbase hbase          0 2019-12-20 16:05 /hbase

3.6.2 修改HBase主配置文件

In hd06,

cp /usr/hbase-1.3.5/conf/hbase-site.xml /usr/hbase-1.3.5/conf/hbase-site.xml.default
vim /usr/hbase-1.3.5/conf/hbase-site.xml

修改配置如下,

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hd01:9000/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>hd06,hd07,hd08,hd09,hd10</value>
  </property>
</configuration>

参数解析,
– 参数“hbase.rootdir”定义HBase的数据目录到HDFS的名称节点主机名称为“hd01”的“/hbase”目录
– 参数“hbase.cluster.distributed”设置“true”即声明集群使用完全分布模式
– 参数“hbase.zookeeper.quorum”指定ZooKeeper仲裁的主机列表(主机间使用逗号分隔)

3.6.3 手动同步主节点配置

In hd06,

su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'

3.6.4 手动启动服务

In hd06,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ start master'

可见如下显示,

starting master, logging to /var/log/hbase/hbase-hbase-master-hd06.cmdschool.org.out

我们建议你检查以下日志,

cat /var/log/hbase/hbase-hbase-master-*.out

如果有如下错误提示,

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hbase-1.3.5/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop-2.6.5/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

以上为包冲突,我们建议你使用如下命令删除HBase目录的包,

rm -rf /usr/hbase-1.3.5/lib/slf4j-log4j12-1.7.5.jar

另外,如果服务无法正常启动,请检查如下日志,

cat /var/log/hbase/hbase-hbase-master-*.log

可使用如下命令检查启动的进程,

pgrep -a -u hbase java

可见如下显示,

12171 /usr/java/jdk1.8.0_121/bin/java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -XX:+UseConcMarkSweepGC -Dhbase.log.dir=/var/log/hbase -Dhbase.log.file=hbase-hbase-master-hd06.cmdschool.org.log -Dhbase.home.dir=/usr/hbase-1.3.5 -Dhbase.id.str=hbase -Dhbase.root.logger=INFO,RFA -Djava.library.path=/usr/hadoop-2.6.5/lib/native -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.master.HMaster start

可使用如下命令查看服务倾听的端口,

netstat -antp | grep `pgrep -u hbase java` | grep LISTEN

可见如下显示,

tcp6       0      0 :::16010                :::*                    LISTEN      12171/java
tcp6       0      0 10.168.0.106:16000      :::*                    LISTEN      12171/java

3.6.5 手动停止服务

In hd06,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ stop master'

可见如下显示,

stopping master.

3.6.6 配置服务控制脚本

In hd06,

vim /usr/lib/systemd/system/hbase-master.service

可加入如下配置,

[Unit]
Description=Apache HBase manager
Wants=network.target
Before=network.target
After=network-pre.target
Documentation=https://hbase.apache.org/book.html

[Service]
Type=forking
ExecStartPre=/bin/sh -c 'mkdir -p /var/run/hbase;chown hbase:hbase /var/run/hbase;chmod 775 /var/run/hbase'
ExecStartPre=/bin/sh -c 'mkdir -p /var/log/hbase;chown hbase:hbase /var/log/hbase;chmod 775 /var/log/hbase'
ExecStartPre=/usr/bin/su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'
ExecStart=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ start master'
ExecStop=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ stop master'
PIDFile=/var/run/hbase/hbase-hbase-master.pid
Restart=on-success

[Install]
WantedBy=multi-user.target

修改完脚本后,你需要使用如下命令重载服务,

systemctl daemon-reload

你可使用如下命令控制服务和查询状态,

systemctl start hbase-master.service
systemctl status hbase-master.service
systemctl stop hbase-master.service
systemctl restart hbase-master.service

测试完毕,建议你使用如下命令设置服务自动启动,

systemctl enable hbase-master.service

3.6.7 配置服务端口

firewall-cmd --permanent --add-port 16000/tcp --add-port 16010/tcp
firewall-cmd --reload
firewall-cmd --list-all

3.7 配置BackupMaster节点

3.7.1 配置BackupMaster的启动环境变量

In hd06,

vim /usr/hbase-1.3.5/conf/hbase-env.sh

增加如下参数,

export HBASE_BACKUP_MASTERS=${HBASE_HOME}/conf/backup-masters

变量“BACKUP_MASTERS”声明BACKUP_MASTERS角色的配置文件路径,配置完成后,所以的环境变量可通过如下指令查看,

grep "^export"  /usr/hbase-1.3.5/conf/hbase-env.sh

修改如下参数,

export JAVA_HOME=/usr/java/jdk1.8.0_121
export HBASE_BACKUP_MASTERS=/etc/hbase/backup-masters
export HBASE_LOG_DIR=/var/log/hbase
export HBASE_IDENT_STRING=$USER
export HBASE_NICENESS=10
export HBASE_PID_DIR=/var/run/hbase
export HBASE_MANAGES_ZK=false

3.7.2 配置BackupMaster的主机列表

In hd06,

vim /etc/hbase/backup-masters

增加如下参数,

hd07

3.7.3 手动同步主节点配置

In hd07,

su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'

3.7.4 手动启动服务

In hd07,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/backup-masters start master-backup'

可见如下显示,

starting master-backup, logging to /var/log/hbase/hbase-hbase-master-backup-hd07.cmdschool.org.out

我们建议你检查以下日志,

cat /var/log/hbase/hbase-hbase-master-*.out

如果有如下错误提示,

Error: Could not find or load main class backup

请尝试使用如下命令启动,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/backup-masters start master-backup'

另外,如果服务无法正常启动,请检查如下日志,

cat /var/log/hbase/hbase-hbase-master-*.log

可使用如下命令检查启动的进程,

pgrep -a -u hbase java

可见如下显示,

9701 /usr/java/jdk1.8.0_121/bin/java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -XX:+UseConcMarkSweepGC -Dhbase.log.dir=/var/log/hbase -Dhbase.log.file=hbase-hbase-master-hd07.cmdschool.org.log -Dhbase.home.dir=/usr/hbase-1.3.5 -Dhbase.id.str=hbase -Dhbase.root.logger=INFO,RFA -Djava.library.path=/usr/hadoop-2.6.5/lib/native -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.master.HMaster --backup start

可使用如下命令查看服务倾听的端口,

netstat -antp | grep `pgrep -u hbase java` | grep LISTEN

可见如下显示,

tcp6       0      0 :::16010                :::*                    LISTEN      9701/java
tcp6       0      0 10.168.0.107:16000      :::*                    LISTEN      9701/java

3.7.5 手动停止服务

In hd07,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/backup-masters stop master-backup'

可见如下显示,

stopping master.

如果遇到如下错误提示,

no master-backup to stop because no pid file /var/run/hbase/hbase-hbase-master-backup.pid

可尝试使用如下命令停止服务,

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/backup-masters stop master --backup'

3.7.6 配置服务控制脚本

In hd07,

vim /usr/lib/systemd/system/hbase-bmaster.service

可加入如下配置,

[Unit]
Description=Apache HBase manager
Wants=network.target
Before=network.target
After=network-pre.target
Documentation=https://hbase.apache.org/book.html

[Service]
Type=forking
ExecStartPre=/bin/sh -c 'mkdir -p /var/run/hbase;chown hbase:hbase /var/run/hbase;chmod 775 /var/run/hbase'
ExecStartPre=/bin/sh -c 'mkdir -p /var/log/hbase;chown hbase:hbase /var/log/hbase;chmod 775 /var/log/hbase'
ExecStartPre=/usr/bin/su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'
ExecStart=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ --hosts /etc/hbase/backup-masters start master --backup'
ExecStop=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ --hosts /etc/hbase/backup-masters stop master --backup'
PIDFile=/var/run/hbase/hbase-hbase-master.pid
Restart=on-success

[Install]
WantedBy=multi-user.target

修改完脚本后,你需要使用如下命令重载服务,

systemctl daemon-reload

你可使用如下命令控制服务和查询状态,

systemctl start hbase-bmaster.service
systemctl status hbase-bmaster.service
systemctl stop hbase-bmaster.service
systemctl restart hbase-bmaster.service

测试完毕,建议你使用如下命令设置服务自动启动,

systemctl enable hbase-bmaster.service

3.7.7 配置服务端口

firewall-cmd --permanent --add-port 16000/tcp --add-port 16010/tcp
firewall-cmd --reload
firewall-cmd --list-all

3.8 配置RegionServers节点

3.8.1 配置RegionServers的启动环境变量

In hd06,

vim /usr/hbase-1.3.5/conf/hbase-env.sh

增加如下参数,

export HBASE_REGIONSERVERS=${HBASE_HOME}/conf/regionservers

变量“HBASE_REGIONSERVERS”声明RegionServer角色的配置文件路径,配置完成后,所以的环境变量可通过如下指令查看,

grep "^export"  /usr/hbase-1.3.5/conf/hbase-env.sh

修改如下参数,

export JAVA_HOME=/usr/java/jdk1.8.0_121
export HBASE_REGIONSERVERS=/etc/hbase/regionservers
export HBASE_BACKUP_MASTERS=/etc/hbase/backup-masters
export HBASE_LOG_DIR=/var/log/hbase
export HBASE_IDENT_STRING=$USER
export HBASE_NICENESS=10
export HBASE_PID_DIR=/var/run/hbase
export HBASE_MANAGES_ZK=false

3.8.2 配置RegionServers的主机列表

In hd06,

vim /etc/hbase/regionservers

参数修改如下,

# localhost
hd08
hd09
hd10

注:将配置修改为只有特定服务器可以启动该角色

3.8.3 手动同步主节点配置

In hd[08-10],

su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'

3.8.4 手动启动服务

In hd[08-10],

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/regionservers start regionserver'

可见如下显示,

starting regionserver, logging to /var/log/hbase/hbase-hbase-regionserver-hd08.cmdschool.org.out

我们建议你检查以下日志,

cat /var/log/hbase/hbase-hbase-regionserver-*.out

另外,如果服务无法正常启动,请检查如下日志,

cat /var/log/hbase/hbase-hbase-regionserver-*.log

可使用如下命令检查启动的进程,

pgrep -a -u hbase java

可见如下显示,

7514 /usr/java/jdk1.8.0_121/bin/java -Dproc_regionserver -XX:OnOutOfMemoryError=kill -9 %p -XX:+UseConcMarkSweepGC -Dhbase.log.dir=/var/log/hbase -Dhbase.log.file=hbase-hbase-regionserver-hd08.cmdschool.org.log -Dhbase.home.dir=/usr/hbase-1.3.5 -Dhbase.id.str=hbase -Dhbase.root.logger=INFO,RFA -Djava.library.path=/usr/hadoop-2.6.5/lib/native -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.regionserver.HRegionServer start

可使用如下命令查看服务倾听的端口,

netstat -antp | grep `pgrep -u hbase java` | grep LISTEN

可见如下显示,

tcp6       0      0 10.168.0.108:16020      :::*                    LISTEN      7514/java
tcp6       0      0 :::16030                :::*                    LISTEN      7514/java

3.8.5 手动停止服务

In hd[08-10],

su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase --hosts /etc/hbase/regionservers stop regionserver'

可见如下显示,

stopping regionserver.

3.8.6 配置服务控制脚本

In hd[08-10],

vim /usr/lib/systemd/system/hbase-region.service

可加入如下配置,

[Unit]
Description=Apache HBase manager
Wants=network.target
Before=network.target
After=network-pre.target
Documentation=https://hbase.apache.org/book.html

[Service]
Type=forking
ExecStartPre=/bin/sh -c 'mkdir -p /var/run/hbase;chown hbase:hbase /var/run/hbase;chmod 775 /var/run/hbase'
ExecStartPre=/bin/sh -c 'mkdir -p /var/log/hbase;chown hbase:hbase /var/log/hbase;chmod 775 /var/log/hbase'
ExecStartPre=/usr/bin/su - hbase -c 'rsync -a -e ssh --delete $HBASE_MASTER/ "$HBASE_HOME"'
ExecStart=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ --hosts /etc/hbase/regionservers start regionserver'
ExecStop=/usr/bin/su - hbase -c '/usr/hbase-1.3.5/bin/hbase-daemon.sh --config /etc/hbase/ --hosts /etc/hbase/regionservers stop regionserver'
PIDFile=/var/run/hbase/hbase-hbase-regionserver.pid
Restart=on-success

[Install]
WantedBy=multi-user.target

修改完脚本后,你需要使用如下命令重载服务,

systemctl daemon-reload

你可使用如下命令控制服务和查询状态,

systemctl start hbase-region.service
systemctl status hbase-region.service
systemctl stop hbase-region.service
systemctl restart hbase-region.service

测试完毕,建议你使用如下命令设置服务自动启动,

systemctl enable hbase-region.service

3.8.7 配置服务端口

firewall-cmd --permanent --add-port 16020/tcp --add-port 16030/tcp
firewall-cmd --reload
firewall-cmd --list-all

3.9 测试HBase

2.9.1 使用Shell登录

In hd[06-10],

hbase shell

可见如下显示,

HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 1.3.5, rb59afe7b1dc650ff3a86034477b563734e8799a9, Wed Jun  5 15:57:14 PDT 2019
hbase(main):001:0>

2.9.2 获取命令行帮助

In hd06,

help

可见如下显示,

HBase Shell, version 1.3.5, rb59afe7b1dc650ff3a86034477b563734e8799a9, Wed Jun  5 15:57:14 PDT 2019
Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command.
Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group.
[...]
  hbase> get 't1', "key\x03\x3f\xcd"
  hbase> get 't1', "key\003\023\011"
  hbase> put 't1', "test\xef\xff", 'f1:', "\x01\x33\x40"

The HBase shell is the (J)Ruby IRB with the above HBase-specific commands added.
For more on the HBase Shell, see http://hbase.apache.org/book.html

2.9.3 创建表

In hd06,

create 'test','cf'

可见如下提示,

0 row(s) in 1.6630 seconds

=> Hbase::Table - test

2.9.4 列出表

In hd6,

list 'test'

可见如下提示,

TABLE
test
1 row(s) in 0.0380 seconds

=> ["test"]

2.9.5 查看表的详细信息

In hd7,

describe 'test'

可见如下提示,

Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', C
OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0400 seconds

2.9.6 推数据到表

In hd08,

put 'test', 'row1', 'cf:a', 'value1'
put 'test', 'row2', 'cf:b', 'value2'
put 'test', 'row3', 'cf:c', 'value3'

可见如下提示,

0 row(s) in 0.0410 seconds

2.9.7 扫描表中的数据

In hd09,

scan 'test'

可见如下提示,

ROW                                 COLUMN+CELL
 row1                               column=cf:a, timestamp=1567775370910, value=value1
 row2                               column=cf:b, timestamp=1567775371023, value=value2
 row3                               column=cf:c, timestamp=1567775372617, value=value3
3 row(s) in 0.0450 seconds

2.9.8 获取单行数据

In hd10,

get 'test', 'row1'

可见如下提示,

COLUMN                              CELL
 cf:a                               timestamp=1567775370910, value=value1
1 row(s) in 0.0230 seconds

2.9.9 禁用或启用表

In hd06,

disable 'test'
enable 'test'

可见如下提示,

0 row(s) in 1.2930 seconds

2.9.10 删除表

In hd06,

drop 'test'

可见如下提示,

0 row(s) in 1.2440 seconds

注:删除之前要先禁用

2.9.11 退出Shell

In hd[06-10],

exit

2.10 HBase的其他使用方式

In hd[06-10],

2.10.1 Linux Shell中使用

echo "describe 'test'" | hbase shell -n
echo "describe 'test'" | hbase shell -n > /dev/null 2>&1

另外,如果需要请使用如下命令编写交互的脚本,

mkdir ~/scripts
vim ~/scripts/hbase.sh

加入如下内容,

#!/bin/bash

echo "describe 'test'" | hbase shell -n > /dev/null 2>&1
status=$?
echo "The status was " $status
if (($status == 0)); then
    echo "The command succeeded"
else
    echo "The command may have failed."
fi
return $status

由于包含“return”函数,所以建议使用如下命令执行,

source ~/scripts/hbase.sh

2.10.2 批处理方式处理

vim ~/scripts/hbase.hbs

加入之前的命令,

create 'test', 'cf'
list 'test'
put 'test', 'row1', 'cf:a', 'value1'
put 'test', 'row2', 'cf:b', 'value2'
put 'test', 'row3', 'cf:c', 'value3'
put 'test', 'row4', 'cf:d', 'value4'
scan 'test'
get 'test', 'row1'
disable 'test'
enable 'test'

使用如下语句调用并执行,

hbase shell ~/scripts/hbase.hbs

注:命令行只需要纯文本保存即可,与后缀名无关

参阅文档
===============
运行模式的概念
—————–
https://hbase.apache.org/book.html#standalone_dist

快速配置完全分布模式
——————-
https://hbase.apache.org/book.html#quickstart_fully_distributed

HBase的文档
———————-
https://hbase.apache.org/book.html

HBae的架构
https://hbase.apache.org/book.html#_architecture

没有评论

发表评论

Apache-Hadoop
如何部署Apache ZooKeeper 3.4.x集群?

1 基础知识 1.1 ZooKeeper的简介 – ZooKeeper是用于分布式应用程 …

Apache-Hadoop
如何部署Apache ZooKeeper 3.5.x集群?

1 基础知识 1.1 ZooKeeper的简介 – ZooKeeper是用于分布式应用程 …

Apache-Hadoop
如何部署Apache Hadoop YARN集群?

1 基础知识 1.1 YARN的介绍 – YARN英文全称为“Yet Another R …