Hadoop+Zookeeper+HBase

Hbase 是一个依赖于 Hadoop+ZooKeeper 的开源的非关系型数据库,而 Hadoop 是一个 Google File System 论文的实现,用于支持数据密集型分布式应用程序。在此之前 HBase 只是 Hadoop 的子项目,而 Hadoop 是在 Google File System 在 2003 年之后的 2004 年 Doug Cutting 基于 MapReduce、Nutch 搜索引擎实现了自己的分布式文件存储系统被命名为 *NDFS(Nutch Distributed File System)*,而 Google 自己的分布式文件存储系统被称之为 GFS(Google File System)
同年 Google 又发布了一篇技术学术论文,展示了 MapReduce 编程模型,用于大规模数据集的并行分析运算,而后的 1 年时间里,也就是 2005 年,Docug Cutting 基于 MapReduce 在 Nutch 搜索引擎中实现了这一功能并命名为 MapReduce,之后 Diug Cutting 被 Yahoo 收购后改名 Hadoop,
2006 年Bigtable: A Distributed Storage System for Structured Data 发布而后 Diug Cutting 在自己的 Hadoop 进行集成了 Bigtable 后加入到 Hadoop 中命名为 HBase,这也意味着 HBase 具有高性能、高可扩展性基于 HDFS 的文件存储系统,用于存储大规模结构化数据,适用于云计算。
HBase 核心
Hadoop
HDFS
HBase 核心就是 HDFS(Hadoop File System)和 MapReduce,由于 HBase 是基于 HDFS 上运行,每个存储的文件也被称之为 HDFS 文件,具有高度的容错能力,可在部署在低成本的硬件中,并提供高吞吐量的访问,适用于具有大型数据集的应用程序。
大概设计上是通过 The Google File System 进行实现,阅读 HDFS 的 官方文档 基本上等同于阅读 The Google File System
| id | Name | Info |
|---|---|---|
| 1 | 硬件故障 | HDFS 通常可能由几百台或几千台计算机组成,每台计算机都村粗文件系统数据的一部分,实际上大量的组件可能会出现故障概率,因此 HDFS 可以检测故障并从中快速且自动回复故障是架构的核心目标 |
| 2 | 流数据访问 | 流式数据访问的特点就是像水一样,不是一次写入而是一点一点写入,如果是全部收到数据后在处理,那么延迟会加大,会消耗大量的内存。HDFS 更多的是为了批处理而进行设计,重点的数据访问的高吞吐量而不是数据访问的低延迟。 |
| 3 | 大型数据集 | 在 HDFS 上运行的程序具有大型数据集,HDFS 中典型的文件大小为 GB~TB ,因此 HBase 也支持大文件,应提供高举和数据贷款并扩展到单个集群中的数百个节点 |
| 4 | 简单的一致性模型 | HDFS 应用程序对文件采用一次写入多次读取的访问模型,文件一旦创建后写入和关闭除追加和截断意外无需更改。支持i将内容追加到文件末尾但不能在任意节点中更新,这简化了一致性问题并实现了高吞吐量数据访问 |
| 5 | 移动计算比移动数据更便宜 | 应用程序请求的计算在他所操作的数据附近所执行的,那么他的效率会搞得很多,当数据集规模较大的时候依然如此。 |
| 6 | 跨异构硬件和软件平台的可移植性 | HDFS 被设计易于从移植到另一个平台,可移植性有益于 HDFS 作为大量应用程序的首选平台 |
上述六个是 HBase 的假设和目标,来让 HBase 成为一个非关系型数据库,在 Eric Brewer 的 CAP 理论中,HBase 属于 CP 类系统,保证了一致性但对可用性或缺,可能会有几个节点不可用,通常适用与银行系统。
Namenode and Datanode

HDFS 是一个主/从架构,集群由 NameNode 组成,作为主服务器,用于管理文件系统命名空间并调节客户端对文件的访问。而 Datanode 管理附加到运行他们的节点存储,HDFS 文件系统命名空间,并允许用户数据存储在文件夹中,在内部被拆分为一个或多个块,这些块都存储在 DataNode 中。
NameNode 执行文件系统命名空间操作,如打开、关闭和重命名目录,并确定块到 DataNode 的映射,DataNode 负责为来自文件系统客户端的读取和请求提供服务,DataNode 还根据 NameNode 的执行来执行块的创建和删除以及复制。
Hadoop HA
Hadoop 分为 HA(High Avaliable,高可用性)模式和非 HA 模式,在生产环境中 Hadoop 都应为 HA 模式,以保障整个集群中 Namenode 节点没有单点故障的问题,HA 模式主要用于解决单点故障。
如果一个集群太依赖一个点,而那个点宕掉了就算其他集群是好的,而整个集群也相当于整体瘫痪,他通常会出现在元数据存储节点中,而这种节点通常出现在 namenode 上,Hadoop HA 的做法就是启动两个或多个 Namenode,一个处于 active(活跃) 状态,其他的机器则处于 standby(后备机) 状态,他只是单纯同步 active 数据,当活跃机宕掉后可直接自动切换过去,这也被称之为 HA 模式。
Zookeeper
Zookeeper 是一个轻量级的分布式架构集群,同时也是 Hadoop 和 HBase 的重要组件,提供了配置维护、域名服务、分布式同步、组服务、服务治理等功能,Zookeeper 的集成使得我们可以直接依赖 Zookeeper 来维护节点,而不是自己在编写节点的注册、取消、维持和存活检测、节点失效等代码。
Hadoop
Vagrant
在正式安装 Hadoop 之前我们需要依赖于 vagrant 以及 Oracle VM VirtualBox 来搭建 Centos 系统环境,共为 5 台机器。
前三台分别被称之为 nn01、nn02,作为 namenode,后三台作为 datanode,分别为 dn01、dn02、dn3。
对于第一次使用 vagrant 作为主要的虚拟机管理工具的读者,我们首先需要通过 vagrant init centos/7 然后直接 vagrant up 即可。
但由于一系列不可抗拒的因素国内可能通过这样下载很慢,我们也可以借助工具来下载他的 .box 文件,下载后可以通过下述几个命令来进行启动:
1 | vagrant init 'D:\Vagrant Dabatables\hbase\CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box' |
当看到 vagrant up 成功启动 Centos 之后,接下来输入 vagrant ssh 以连接虚拟机的 Shell 进行操作,除此我们还可以使用 supend(挂起)、reload(重启)、halt(关机)、status(查看状态) 等参数提升效率。
在上述的操作过程中(泛指 vagrant init) 之后会产生一个 Vagrantfile 文件,我们需要修改并设置与物理机共享的文件夹,以及固定的 IP 等配置:
尽管
config.vm.box可能会报错,改为.box所在地址即可。
1 | # Create a private network, which allows host-only access to the machine |
Host Configuration
Host name
在了解到 vagrant 基本的使用方法后我们可以搭建 HBase 所需要的环境,当然这是通用的,我们只演示 nn01 的配置方法,之后 nn02、dn01、dn02、dn03 跟着随后即可,可以说名称和IP不一样。
通过 vi /etc/hosts 文件将所有机器的 IP 和机器名都配置到 hosts 文件中,以方便我们使用 ssh 根据对应的节点名称来进行连接(对于网段可以根据自身环境来进行配置)
1 | 192.168.115.10 nn01 |
为防止之后通过 ssh nn1 的时候可能会提示 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 的错误消息,我们可以通过 vi /etc/ssh/sshd_config 来进行更改配置:
1 | # To disable tunneled clear text passwords, change to no here! |
最后通过 sudo systemctl restart sshd 来重启下 sshd 服务,在重新进行测试即可,为区分节点之间的名称建议通过 hostnamectl set-hostname <name> 来修改当前主机名称以方便之后在 ssh 还是在控制台内的查看集群信息。
同样的还有 /etc/sysconfig/network 文件下配置当前的 hostname 之后通过 service network restart 重新穷下。
Shell No password
以 useradd hadoop 新建用户 hadoop 并为其设置 passwd hadoop 密码后通过 sudo chmod u+w /etc/sudoers 将 hadoop 添加到 sudoers 列表,向 /etc/sudoers 文件中添加
1 | ## Allow root to run any commands anywhere |
使用 ssh-keygen -t rsa 生成 id_rsa.pub 后以 scp 将自身的 rsa 密钥分发给 nn01,scp .ssh/id_rsa.pub hadoop@nn01:/home/hadoop/.ssh/nn02_keys,当然也包括自己的,这将使得可以自己 shell 免密连接自己,并设置目录权限:
1 | cd .ssh/ |
最后使用 scp authorized_keys hadoop@nn02:/home/hadoop/.ssh/ 将 authorized_keys 文件分发给 nn02、dn01、dn02、dn03 机器中。
Java 1.8 install
在安装和配置 Hadoop 之前,我们需要安装 Java 环境且至少实在 1.8 版本以上,我们直接从 https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html 下载系统对应的文件并通过 sudo vi /etc/profile 添加环境变量后刷新即可 source /etc/profile
1 | export JAVA_HOME=/usr/jdk1.8.0_202 |
为了防止普通用户无法使用 Java 还需要设置普通用户的环境变量 sudo vi ~/.bashrc 同样的向此文件添加 JDK 所在位置并使用 source ~/.bashrc 刷新即可:
1 | export JAVA_HOME=/usr/jdk1.8.0_202 |
正常环境下直接通过
/etc/profile配置全局的环境变量即可,可根据实际环境自行选择
单机模式与集群模式

当上述配置完成之后,开始安装 Hadoop,这也是 HBase 的运行基础,在此之前我们先看下当前系统的磁盘最大分区,以决定是否要修改日志存储目录:
1 | df -h |
我的系统分区最大是 / 也就是说无需更改他的日志存储路径,如果你的磁盘大小和我的不一样那么建议之后在 Hadoop 的配置文件中更改日志存储位置即可,可通过清华大学镜像站直接进行下载 Hadoop 并解压:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.1/
通过 tar zxvf hadoop-3.3.1.tar.gz 解压文件并重命名为 hadoop(mv hadoop-3.3.1 hadoop)并移动到 usr/local 文件夹中,之后在 ~/.bashrc 添加环境变量:
1 | # Hadoop_Home |
保证可以输入
hadoop出现参数提示即可,但不要忘记使用source ~/.bashrc刷新配置,以及在/usr/local目录那为 hadoop 设置用户组为 hadoop(sudo chown hadoop:hadoop /usr/local/hadoop/*)
进入到 /usr/local/hadoop/etc/hadoop 目录下配置 core-site.xml 文件并写入节点名称
1 | <configuration> |
之后编辑 hdfs-site.xml 文件被指 HDFS 相关属性并增加数据备份(dfs.replication)、namenode\datanode 存储文件位置:
1 | <configuration> |
并建立 datanode/namenode 存储文件以及为其分配权限:
1 | cd / |

切换到 hadoop 用户使用 hdfs namenode -format 来格式化 namenode 后启动单机模式 bash /usr/local/hadoop/sbin/start-dfs.sh,结束后访问 http://<ip>:9870/ 即可看到 Hadoop 单机模式的控制台页面来验证上述配置的正确,之后将上述配置全部在 nn02、dn01、dn02、dn03 中在配置一遍。
可使用
bash /usr/local/hadoop/sbin/stop-dfs.sh来停止单机模式
并在所有机器上执行 hdfs namenode -format 用于格式化来调试,并启动 bash /usr/local/hadoop/sbin/start-dfs.sh 进行单机启动来保证所有机器配置都是正确的,之后在所有节点中删除数据:
1 | rm -rf /data/hadoop/hdfs/nn/* |
之后在 nn01 节点中使用 hdfs namenode 来启动主节点,之后在其他节点中启动 start-dfs.sh 即可将此连接为一个集群。
在没有配置 ZooKeeper 之前,datanode 和 namenode 是通过 core-site.xml 中的 fs.defaultFS 属性去连接 namenode 的 8020 端口,并建立连接,在没有 ZooKeeper 之前,是不允许有两个 Namenode 节点存在的,也就是非HA模式,他只会有一个 Namenode 节点,对于其他的都会被 Hadoop 视为 Datanode 节点,在后续步骤中我们要完成 Hadoop HA 的配置。
Hadoop HA and ZooKeeper
ZooKeeper install / run

在开始 ZooKeeper 之前我们已经了解到为什么 Hadoop HA 需要 ZooKeeper 了,ZooKeeper 同样是 Apache 基金会下的开源项目,他用于分布式应用程序协调服务,是 Google Chubby 的开源实现,为分布式应用提供一致性服务,包括了配置维护、域名服务、配置同步以及组服务等。
ZooKeeper 集群最好是奇数,这样会有利于仲裁,感兴趣的读者可以去了解下 Raft(Reliable,Replicated,Redundant,And Fault-Tolerant)这和 Hadoop HA 有异曲同工之妙。
以 useradd zookeeper 新建用户 zooke 并为其设置 passwd zookeeper 密码后通过 sudo chmod u+w /etc/sudoers 将 hadoop 添加到 sudoers 列表,向 /etc/sudoers 文件中添加
1 | ## Allow root to run any commands anywhere |
之后通过清华大学开源镜像站获取 https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 并解压到 /usr/local/ 中。
1 | tar zxvf apache-zookeeper-3.6.3.tar.gz |
通过在 /etc/profile 增加全局变量后以 source /etc/profile 命令让配置生效
1 | export ZOOKEEPER=/usr/local/zookeeper |
进入到 /usr/local/zookeeper/conf 目录下将 zoo_sample.cfg 文件复制一份并改名 zoo.cfg:cp -r zoo_sample.cfg zoo.cfg ,并编辑 daraDir 这一行的文件夹位置为 /data/zookeeper。
在 /usr/local/zookeeper/bin/ 文件内的 zkEnv.sh 文件中增加 ZOO_LOG_DIR=/data/logs/zookeeper 日志存放目录并新建目录和权限的设置:
1 | sudo mkdir /data/zookeeper |
然后在 /data/zookeeper 新建一个文件命名为 myid,并写入这台服务器的 Zookeeper id,取值范围为 1~255,配置如下:
| id | host |
|---|---|
| 1 | nn01 |
| 2 | nn02 |
| 3 | dn01 |
| 4 | dn02 |
| 5 | dn03 |
通过 zkServer.sh start 启动 Zookeeper,之后使用 zkCli.sh 测试是否可以连接上,如无报错执行下列命令查看 ZooKeeper 根目录。
1 | [zk: localhost:2181(CONNECTED) 1] ls / |
之后 zkServer.sh stop 来停止 Zookeeper 的运行并清空数据文件夹和日志文件夹,并在 /usr/local/zookeeper/conf/zoo.cfg 添加节点信息:
1 | server.1=nn01:2888:3888 |
此时在执行过 zkServer.sh start 后 Zookeeper 会将配置中所有的节点连接成一个集群,可以通过 zkServer.sh status 来进行查看:
1 | [zookeeper@nn01 local]$ zkServer.sh status |
自启动脚本
自启动脚本在 etc/init.d 下,通过 root 账号来进行操作,我们通过建立 zookeeper 文件后写入下述内容,即可通过 service zookeeper status | start | stop 来进行对 zookeeper 的操作。
1 | ! /bin/bash |
为脚本赋予可执行权限
sudo chmod +x /etc/init.d/zookeeper添加 Zookeeper 在自启动,重启机器后通过jps命令再次查看服务是否正常启动。
Hadoop HA
Haddoop HA (High Avaliable,高可用) 的主要作用就是 保证当一个 namenode 宕机的时候,另一台 namenode 可以立即切换来替代宕掉的 namenode,这样就大概上解决了单点故障的问题。这样的原理基本就是同时启动两台 namenode,一台是活跃状态(active),另一台则是处于 支持(standby) 状态,其主要的作用就是将处于 active 状态的机器上所做过的事情进行同步,以方便在 active 挂掉的时候 standy 可以无缝切换。
在 Hadoop HA 模式下,主要通过 ZooKeeper 来进行对节点的维护,因此 Hadoop HA 的搭建与 ZooKeeper 密不可分,而 ZooKeeper 在整个流程当中都处于服务治理、故障检测、节点维护的身份进行工作。
JournalNode
日志节点(JournalNode) 主要的作用就是在 standby 同步 active 这个流程中充当与数据同步的方式,standby 就是通过 journalnode 集群来同步 active 节点的操作。
JournalNodde 与 dataname 和 namenode 一样,都是 Hadoop 集群中的角色,只不过他主要用于同步 namenode 之间的操作,以防止脑裂现象。
假设测试环境的配置不是很好,那么可以通过在
hdfs-site.xml文件内添加dfs.qjournal.start-segment.timeout.ms的配置,来增加和 JournalNode 集群之间的超时时间
1 | <property> |
手动 Failover
failover 的配置分为手动和自动,本文我们选择手动进行操作,failover 即故障切换或故障转移。当一个 Haddop 中有一台 namenode 宕掉了,那么就可以将另外台处于 standby 状态的机器切换成 active 的 namenode 。
这样就可以大幅程度上减少了单点故障所给服务集群带来的影响和损失,在 failover 没有运用之前,相对于单点应用只有一个台 namenode,假设这台刚好宕掉了,那么集群就约等于无法正常提供服务了。当 failover 配置成功后,当这台 namenode 宕掉了还会有另一台 namenode 进入 active 状态从而继续提供服务。
修改所有 namenode 机器上的 /usr/local/hadoop/etc/hadoop/hdfs-site.xml 文件并写入以下配置,分别作为服务id,以及服务 id 内所含有的 namenode:
1 | <property> |
| Id | Name | Info |
|---|---|---|
| 1 | dfs.nameservices | 服务 id |
| 2 | dfs.ha.namenodes.mycluster | 服务 id 内所含有的 namenode |
| 3 | dfs.namenode.rpc-address.mycluster.nn01 | 设置两个 Namenode 的 RPC 访问地址 |
| dfs.namenode.rpc-address.mycluster.nn02 | ||
| 4 | dfs.namenode.http-address.mycluster.nn01 | 设置两个 Namenode 的 HTTP 访问地址 |
| dfs.namenode.http-address.mycluster.nn02 | ||
| 5 | dfs.namenode.shared.edits.dir | 配置 journalnode 集群的访问地址 |
| 6 | dfs.client.failover.proxy.provider.mycluster | 配置 dfs 客户端的类名,以判断哪个 namenode 是活跃的 |
| 7 | dfs.ha.fencing.methods | 故障迁移方法,通过 ssh 直接过去将被判断为故障的 namenode 直接杀掉,以防止脑裂现象 |
| dfs.ha.fencing.ssh.private-key-files | ssh 免密登录的 id_rsa 位置,以实现上面的故障迁移 | |
| 8 | dfs.journalnode.edits.dir | journalnode 的数据文件夹位置 |
| 9 | dfs.ha.fencing.methods | 隔离机制方法 (多个机制用换行分割,即每个机制暂用一行) |
之后修改 core-site.xml 文件,将之前的 fd.defaultFS value 值改为 hdfs://mycluster 。此前的 fs.defaultFS 内是需要单独配置 8020 端口的,但是这个端口被移植到了 hdfs-site.xml 中,因此在 core-site.xml 中不需要专门填写一个端口,他们已经组成了一个集群,只需要向外暴漏 nameserver ID 在 ZooKeeper 集群中找出 active 的 namenode 所对应的 ip:port 来进行连接。
并为 journalnode 建立需要的文件夹和赋予权限:
1 | mkdir /data/hadoop/hdfs/jn |
在此之前我强烈的建议你清口所有 hadoop 生成过数据的目录,否则你可能会在启动 journalnode 之后出现一系列的问题,比如 hdfs namenode -format 格式化失败等:
1 | sudo rm -rf /data/hadoop/hdfs/dn/* |
然后在所有节点中启动 journalnode,数量必须为奇数即可,分别执行 hdfs --daemon start journalnode 之后通过 jps 来查看是否 journalnode 节点启动成功:
1 | $ jps |
可通过
hdfs --daemon stop journalnode停止 journalnode 节点
然后在 nn01 上使用 hdfs namenode -format 来进行格式化,然后在在启动 Namenode :hdfs namenode。
切换到 nn02 中同步 namenode 让他完全做好成为备份机(standby) 的准备 hdfs namenode -bootstrapStandby,然后在 dn01~dn03 机器中启动 HDFS: start-dfs.sh 使得启动 Datanode 节点后使用 jps 进行查看节点的启动状态:
1 | 2615 JournalNode |

最后访问 <namenode ip>:9870 可以直接查看到 Hadoop 控制台状态,显示两个 namenode 节点都处于 standby 状态中,并执行手动 failover :hdfs haadmin -failover nn02 nn01,此时会提示:
1 | Failover from nn02 to nn01 successful |
但查看 namenode 1 节点的控制台中可以发现已经将 nn01 切换为 active 状态了,而 namenode 2 则仍然处于 standby 状态
自动 Failover

在此前我们提到过 Failover 即故障切换和 Hadoop HA 主要是为了应对脑裂现象,而脑裂现象主要由 Namenode 所产生。在这里就需要引入 zkfc 的概述,zkfc 主要是检测 Hadoop HA 集群中处于 active 状态的 namenode 是否宕机,如果宕机了则会迅速的将 standby 状态的 namenode 切换为 active ,并将当前已经宕机的 namenode kill,以防止脑裂现象的出现,这也是 Failover 核心所解决的问题。
本地的测试环境中,通常机器的性能不是很高,那么就会遇到 zkfc 启动不起来的问题,也就是超过 5s 连接不上 Zookeeper 就自动推出,那么可以在 core-site.xml 中加入下述配置:
1 | <property> |
| Id | Name | Info |
|---|---|---|
| 1 | ha.zookeeper.session-timeout.ms | 设置 zkfc 连接 Zookeeper 的延迟时间 |
| 2 | dfs.ha.automatic-fallover.enabled | 启动自动 failover |
| 3 | ha.zookeeper.quorum | ZooKeeper 集群访问地址 |
在所有节点中启动 journalnode: hdfs --daemon start journalnode ,以及所有 namenode 节点中启动 zkfc: hdfs --daemon start zkfc
在此之前可能需要使用
hdfs zkfc -formatZK进行格式化 /hdfs namenode -format

和 Namenode 主节点中启动:hdfs namenode / hdfs --daemon start namenode,然后切换到 nn02 中同步 namenode 让他完全做好成为备份机(standby) 的准备 hdfs namenode -bootstrapStandby,最后在 dn01~dn03 机器中启动 HDFS: start-dfs.sh 那么再次查看 Hadoop 控制台则会在两个 namenode 之间任选一个节点为 active
自启动脚本
为方便之后环境的便捷启动,我们需要为 journalnode(nn01dn03) 、zkfs(nn01nn02) 设置自启动,在 /etc/init.d/ 目录下新建 hadoop-journalnode 并写入:
1 | ! /bin/bash |
之后在为 zkfs 设置自启动服务,这主要用于 nn01~nn02 机器中,之后同样的赋予他们 +x 权限以及通过 chkconfig 将服务加入到启动项中。
1 | ! /bin/bash |
没有将 namenode 和 datanode 设置为自启动服务的主要原因是因为 namenode 需要 active 和 standby 主/备机器,所以建议手动启动
HBase

安装 HBase 的前提是拥有 Zookeeper 虽然 HBase 自带了一个 Zookeeper 但是无法满足 Hadoop 的使用,因此我们通过 https://downloads.apache.org/hbase/stable/ 下载 HBase 稳定版本。
在 HBase 中主要通过 HMaster 来管理元数据,也就是 Hadoop 中的 namenode,之后 RegionServer(区域服务器) 负责存储数据,,也就类似于 Hadoop 中的 datanode。同样的,Zookeeper 在此的作用依然是维护节点(需要注意的是 HDFS 是基于完全部署模式的,也就是通过 HDFS 存储数据,在单机模式下直接使用的是普通文件系统来存储数据。)
这里需要引入一个点是,在 HBase 官方文档中:http://hbase.apache.org/book.html#standalone_dist,将 HBase 的启动分为了三大类,分别为:独立 HBase、伪分布式和完全分布式集群启动,通常独立 HBase 也被称之为快速上手并理解 HBase 的不二之选。
hbase user create and Shell nopasswd
以 useradd hbase 新建用户 hbase 并为其设置 passwd hbase 密码后通过 sudo chmod u+w /etc/sudoers 将 hbase 添加到 sudoers 列表,向 /etc/sudoers 文件中增加
1 | ## Allow root to run any commands anywhere |
之后切换到 hbase 用户下执行 sudo whoami 来查看 etc/sudoers 是否配置成功(一般是 sudo su root 无需输入密码并返回 root 即完成此配置)
同样的为了应对之后的 HBase 伪分布式模式,我们需要为其配置免密登录,使用 ssh-keygen -t rsa 生成 id_rsa.pub 后以 scp 将自身的 rsa 密钥分发给 nn01,scp .ssh/id_rsa.pub hbase@nn01:/home/hbase/.ssh/nn01_keys,当然也包括自己的,这将使得可以自己 shell 免密连接自己,并设置目录权限:
1 | sudo chmod 700 /home/hbase/ |
之后在通过 scp 将 authorized_keys 分发到 nn01~dn03 的
/.ssh文件夹中,切记也为其赋予 700 权限
1 | sudo chmod 700 /home/hbase/ |
Java bashrc and HBase install
在 https://downloads.apache.org/hbase/stable/ 内下载一个稳定版本的 HBase 并在节点机器中使用 wgethttps://downloads.apache.org/hbase/2.3.7/ 进行下载并直接使用 sudo mv hbase-2.3.7 /usr/local/hbase 移动到 /usr/local 目录下。
最后我们还需要通过sudo vi ~/.bashrc 向用户变量内添加 JDK 所在位置和 HBase 的环境变量,然后使用 source ~/.bashrc 刷新即可:
1 | export JAVA_HOME=/usr/jdk1.8.0_202 |
单机模式
进入到 /usr/local/hbase 目录下追加或修改 hbase.rootdir 和 hbase.zookeeer.property.dataDir 配置:
1 | <property> |
单机模式下我们启动了 HBase 自带的 Zookeeper
这个操作只需要在单个节点中进行测试,因为只是单机模式,会临时使用到 /home/hbase/hbase 和 /home/hbase/zookeeper 目录
接下来通过 start-hbase.sh 来启动 hbae,jps 查看进程正常启动后由 hbase shell 来连接到 hbase,并进行建表(create)、插入(put)、查询(scan) 等三个测试:
1 | hbase(main):001:0> create 'testTable','testFamily' |
当一切完成后我们可通过 stop-hbase.sh 来停止单机模式的 HBase 并 rm -rf /home/hbase/hbase /home/hbase/zookeeper/ 删除掉 HBase 在启动之前自动建立的文件夹。
在这里我们需要引入一个 HBase 对于伪分布式的概念,伪分布式很类似完全分布式,但是他是介于 HDFS 为非 HA 状态的,音译仅此将此模式用于原型设计和测试目的,无法用于开发环境和性能评估,我们直接进入完全分布式模式。
完全分布式

默认情况下 HBase 在独立模式(单机模式)下运行,以提供最小规模测试(同样包含了非分布式),对于生产环境加以使用分布式模式,在分布式模式下 HBase 守护程序将会在多个实例集群中服务器运行,但需要注意的完全分布式需要 HDFS 为 HA 模式即可,之后记得在 hbase-env.sh 文件中关闭 HBase 自带的 Zookeeper:
1 | # Tell HBase whether it should manage it's own instance of ZooKeeper or not. |
之后通过sudo groupadd supergroup 建立 supergroup 用户组,然后将 hbase 用户加入到该组中 sudo groupmems -g supergroup -a hbase ,这也是 hdfs 所默认的超级用户组,也就是超级用户,可以无限制权限访问的特殊用户,之后为 Hbase 建立日志文件存储目录:
1 | sudo mkdir /data/logs/hbase |
HBase 会根据 HDFS 的客户端配置来做册罗调整,而让 HBase 读取到 HDFS 最为直接的方法就是把 HADOOP__CONF_DIR 的配置文件目录地址添加到 HBASE_CLASSPATH 中,以及 hbase 的日志文件夹配置
1 | # Extra Java CLASSPATH elements. Optional. |
在 hbase-site.xml 中增加并修改 hbase.cluster.distributed 为 true 以开启 HBase 分布式启模式启动:
1 | <configuration> |
| Id | Name | info |
|---|---|---|
| 1 | hbase.cluster.distributed | 告诉 hbase 开启了分布式模式启动 |
| 2 | hbase.rootdir | HBase 的根存储目录,其中 mycluster 为集群的 namenode,如果是伪分布式模式可以替换为机器的 namenode |
| 3 | hbase.zookeeper.quorum | Zookeeper 集群地址 |
然后将上述配置推送/复制到所有节点后,在 nn01 节点(任意节点都可在作为 Master )作为 Master 执行 hbase-daemon.sh start master,之后查看 jps HMaster 是否启动,在其余的集群中(nn01~dn02) 启动 RegionServer:hbase-daemon.sh start regionserver,然后浏览器访问 <master>:16010 即可,hbase 模式下的服务为:
1 | $ jps |
