Ubuntu 16.04 安装 HBase2.2.2
解决SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J
Ubuntu 16.04 安装 HBase2.2.2
HBase2.2.2 安装
写在前面
不知不觉,我也已经写了很多篇博客了,之前老是觉得写个博客是个多么困难的事情,事实好像跟我的想像差距并不大。写博客,真的很难,我每次都会问自己,简单一点,写进 Markdown 自己看不就好了吗,为什么还要发出来?我也不知道,应该说,最直观的感受是,如果不发出来,会亏。在我所写的博客里面,有不少是借鉴了众多大牛的地方,但也不是全全把别人的搬过来,因为在不同的时间,不同的系统,不同的软件版本条件下,很多东西都有所不同,特别是 Linux 里面,不同的地方更多。今天我的师姐问了一句 “这样子的,不会侵权吗?”,虽然我立刻就跟她解释了,博客里面的操作、纠错、都是我自己做的,但是,因为这句话,我还是思考了特别长的时间,我在想还要不要继续写下去。挺突然地,就不知道自己为什么要写这个东西了,但想了想,这一篇博客已经开了头了,索性就继续写下去吧。在这里也是补上一些我自己的想法,如果在别的地方,看到有类似的博客,千万不要惊讶,因为我也是看了很多别人的文章才能写出这样一篇博客的。
零、环境
主机版本:Windows11
虚拟机版本:ubuntukylin-16.04-desktop-amd64
VMware 版本:VMware® Workstation 17 Pro
网卡:桥接模式
jdk 版本:jdk-8u162-linux-x64
Hadoop 版本:hadoop-3.1.3
HBase 版本:hbase-2.2.2
注:硬件版本是使用的兼容 VMware 12.X 的。
一、HBase 介绍
HBase 是一个开源的分布式 NoSQL 数据库,建立在 Hadoop 的 HDFS 上。 它适用于存储和处理大规模数据,并具有高可扩展性,高吞吐量和高可靠性的特点。 HBase 是一个分布式列存储的数据存储系统,它的设计旨在应对超大规模数据集,可以在上面提供随机的实时读/写访问能力。 HBase 的数据模型类似于 Bigtable,支持水平扩展,并且可以部署在廉价的硬件上。
HBase 特点
HBase 最初是由 Facebook 创建的,并根据自己的需求进行了高度优化。然后,HBase 被 Apache 开源。 HBase 的存储模型是基于 Google Bigtable 的,基于稀疏的、分布式的、持久的多维排序映射表(sparse, distributed, persistent multidimensional sorted map),其支持快速的物理范围扫描和随机访问,并拥有强大的数据模型。 HBase 可以作为一种数据存储解决方案,广泛应用于大规模在线数据存储和数据分析领域,例如社交媒体、日志处理、金融行业等。 HBase 的主要特点包括:
- 强大的数据模型:HBase 提供的数据模型灵活多变,可以方便地存储半结构化或非结构化的数据,如 JSON 文档等,适用于数据存储、检索、分析等。
- 高可靠性:HBase 通过在多个节点之间复制数据达到高可靠性,即使某个节点失效,也能保证数据的可用性和完整性。
- 高可扩展性:HBase 具有很好的水平扩展性,可以通过增加节点来扩展存储和处理能力,从而提高系统的性能和吞吐量。
- 高性能:HBase 可以通过并行存储和检索数据来提高性能,在大数据量的情况下仍能保持较快的响应速度。
需要注意的是,HBase 虽然具有很多优点,但也需要针对不同的应用场景做出相应的调整。在应用 HBase 时,需要根据具体需求进行数据建模、数据分区、数据复制、操作优化等。同时,需要了解 HBase 的一些重要概念,如行键、列族、版本等,来充分利用 HBase 的强大功能。
注意事项
- 请各位严格对照版本,如果各位要安装配置的版本不是 HBase2.2.2 的,请速速划走,不然会浪费您一大片的时间,最后发现还弄不好,得不偿失。
- 本篇文章中,我们将会学习下载已经编译好并且稳定的
bin版本,而不是带有src标签的未编译源码版本,如果到这里也是不符合您的需求,那么也可以速速划走,不然真的会浪费时间。 - 本篇文章适用于
Ubuntu-14.04、Ubuntu-16.04、Ubuntu-18.04,若是Ubuntu-20.04的朋友,请您尽快划走,否则假设安装配置失败,概不负责。 - HBase 的版本一定要和之前已经安装的 Hadoop 的版本保持兼容,不能随便选择版本。其中,
HBase1.1.2和Hadoop2.7.1或Hadoop2.6.0或Hadoop2.7.3兼容,而HBase2.2.2和Hadoop3.1.3兼容。本文安装HBase2.2.2,并且假设你之前已经安装了Hadoop3.1.3。 -
开启 HBase 需要先开启 Hadoop,而关闭 Hadoop 必须先关闭 HBase,所以总的流程顺序就是:
开启 Hadoop --> 开启 HBase --> 关闭 HBase --> 关闭 Hadoop请一定严格按照顺序进行,否则可能会出现错误,如果不确定是否有开启其中的某个服务,可以使用
jps命令进行查看进程id。
二、安装配置 HBase
在安装 HBase2.2.2 之前,请确保你的电脑已经安装了 Hadoop3.1.3,由于 HBase 对 Hadoop 具有版本依赖性,所以,在安装 HBase2.2.2 时,一定要首先安装 Hadoop3.1.3。
1、HBase2.2.2 安装
点击下面的地址到HBase2.2.2官网下载地址下载 HBase2.2.2 。
1.1 下载安装包
这一部分我们总共介绍三种瞎子方式,第一种是从 Linux 的浏览器 Firefox 进入官网进行下载 hbase-2.2.2-bin.tar.gz 安装包进行安装;第二种是从 Windows 中进行下载,然后通过 Xftp 7 传输的方式将安装包传到 Linux 中;第三种是使用终端,用 wget 命令从官网下载 hbase-2.2.2-bin.tar.gz 安装包。
(1)Firefox下载
首先,打开 Firefox 浏览器,然后在地址栏输入 http://archive.apache.org/dist/hbase/2.2.2/,这个地址就是 HBase-2.2.2的下载页面,然后点击 hbase-2.2.2-bin.tar.gz 进入下载页面
http://archive.apache.org/dist/hbase/2.2.2/

选择,打开,通过(O) --> 确定 进入下载。

等待下载完成后,可以在浏览器的 下载 按钮找到我们下载的包,右键单击,选择 打开所在文件夹,就可以找到安装包下载的地方了,默认的安装路径都是在 ~/下载 目录下或者如果你选择的是英文,那应该是 ~/Downloads 目录下。

(2)Windows 下载
本来我是没想着写这种方法的,但是奈何桥接的网络不太好,下载速度太慢了(而且说不好可能还会下载失败),所以我就想方设法另辟蹊径,就为了节约那么一点点的时间。在 Windows 下载其实和在 Ubuntu 下载差不多,打开浏览器,输入 HBase-2.2.2 的下载地址,最后点击下载。

然后打开 Xftp 7 前提是你要能连上 Ubuntu,否则无法打开会话,也就无法进行传输。打开后,找到安装包的具体位置,再找到你想存到 Ubuntu 的具体目录,注意,除非你是以管理员身份进行登录(一般来说,由于 Ubuntu 管理员密码每次启动都会更改,所以应该没有这种可能)Xftp 7,否则只能放到对应用户的目录下面,如下图所示:

(3)wget 命令下载
这种方式也是需要事先知道具体的下载路径,在这里我就直接给出来了,其实比上面两种方法轻松不了多少,但相对也没那么困难嘛,所以也就写一写,希望能帮助到大家。输入下面命令,将 hbase-2.2.2-bin.tar.gz 压缩包下载到对应的 ~/下载 目录下。
wget http://archive.apache.org/dist/hbase/2.2.2/hbase-2.2.2-bin.tar.gz -P ~/下载/
只要开始下载,就会在 /home/hadoop/下载 目录下看见 hbase-2.2.2-bin.tar.gz 压缩包,但是只有下载完成,整个压缩包才是完整的,否则就是没有用的。

1.2 解压安装包
下载完成后,就可以在 ~/下载 目录下找到 hbase-2.2.2-bin.tar.gz 压缩包,输入如下命令
ll 下载/ |grep hbase-2.2.2-bin.tar.gz
效果如下图:

然后对压缩包进行解压,这里选择解压 hbase-2.2.2-bin.tar.gz 至路径 /usr/local,命令如下:
cd ~ # 进入用户目录
sudo tar -zxf ~/下载/hbase-2.2.2-bin.tar.gz -C /usr/local
没有报错就说明解压成功了,没有别的提示是因为没有使用 -v 选项,如果想看到提示,可以把 -zxf 改为 -zxvf

1.3 修改文件名
将解压的文件名 hbase-2.2.2 改为 hbase,以方便使用,命令如下:
cd /usr/local # 进入 /usr/local 目录
sudo mv ./hbase-2.2.2 ./hbase
为了让大家看的更清楚,这里用了 ls 命令来对更改前后进行对比,效果如下图所示:

1.4 配置环境变量
将 hbase 下的 bin 目录添加到环境变量中,这样,启动 hbase 就无需到 /usr/local/hbase 目录下,大大的方便了 hbase 的使用。这里为了照顾大家,让大家理解运行的过程,所以下面的部分还是切换到了 /usr/local/hbase 目录进行操作。当然,如果大家都会了,可以省去下面的一些操作步骤,到时候省哪些估计大家也能自己判断出来。
首先,输入下面命令,使用 vim 编辑器来编辑 ~/.bashrc 文件,因为是当前用户为属主权限的缘故,所以不需要使用 sudo 来提高权限:
vim ~/.bashrc
可以选择在 export PATH 这行追加 /usr/local/hbase/bin,这里的 : 是分隔符。如下图:

又或着使用 : 连接符进行连接,将之前的 PATH 和新加的连接起来,这样子也可以,命令如下:
export PATH=$PATH:/usr/local/hbase/bin
个人推荐这一种,一味地往后追加只会导致越来越多,然后看不清加了什么,反而这样可以使你更为清晰有条理的添加变量。效果如下图:

编辑完成后,保存退出后再执行 source 命令使上述配置在当前终端立即生效,命令如下:
source ~/.bashrc
到这里,可能大家想对 Linux 的环境变量进行更深一层的了解,如果下一篇不知道写什么,我就出一篇关于 Linux 环境变量的博客,先悄悄立个 Flag。
1.5 添加HBase权限
输入下面命令,把 hbase 目录权限赋予给 hadoop 用户:
cd /usr/local # 进入 /usr/local 目录
sudo chown -R hadoop ./hbase #将hbase下的所有文件的所有者改为 hadoop,hadoop是当前用户的用户名。
为了让大家能明显看到效果,这里依旧使用了 ls 命令来突出修改前后对比,效果如下图:

1.6 查看 HBase 版本
我们需要查看 Hbase 的版本来确定 hbase 安装成功,命令如下:
hbase version
看到输出版本消息表示 HBase 已经安装成功,如下图所示:

警告修正
上面还有几个警告,最主要的问题就是 HBase 启动时默认会把 Hadoop 的 jar 包拿过来,下面的参数默认是 false,也就是包含 hadoop lib 文件夹下的 jar 包。我们可以看到是 HBase-2.2.2 和 Hadoop-3.1.3 中的slf4j-log4j12-1.7.25.jar冲突导致的问题。有很多种解决办法(首先,如果你打开了 HBase,请先把它关闭,如果不确定是否打开,可以输入 jps 查看是否有 HBase 相关的进程 id):
-
可以选择把 HBase 中的
slf4j-log4j12-1.7.25.jar包进行重命名或者删除,这种办法不太建议,因为可能会产生一种情况是 HBase 的 jar 包被你删了,但是又不给使用 Hadoop 的包,导致报错。 -
修改 HBase 中的配置文件,将
HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP变量设置为True,作用是启动 HBase 时禁用查找 Hadoop 的 Classs,就可以避免冲突。cd /usr/local/hbase vim conf/hbase-env.sh打开
hbase-env.sh文件后,将HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP变量前面的注释取消掉即可,位置应该在最后一行,如果不想找,也可以直接在最前面添加:export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
2. HBase配置
HBase有三种运行模式,单机模式、伪分布式模式、分布式模式。作为学习,我们这里重点描述一下单机模式和伪分布式模式。
以下先决条件很重要,比如没有配置 JAVA_HOME 环境变量,就会报错。
- jdk
- Hadoop( 单机模式不需要,伪分布式模式和分布式模式需要)
- SSH
以上三者如果没有安装,请查看我的另一篇博客Ubuntu 16.04——Hadoop集群安装配置参考如何安装。
2.1 单机模式配置
这一部分主要是需要修改 HBase 的两个配置文件,以适应我们单机模式的需求,这两个文件都位于 /usr/local/hbase/conf 目录下,下面我们先详细介绍一下这两个文件:
第一个是 hbase-env.sh 文件,此文件是用于设置 HBase 及其相关服务(如 HBase 主服务器和区域服务器)使用的环境变量。可以在此文件中设置的一些关键环境变量包括:
HBASE_HOME:HBase 安装的根目录JAVA_HOME:安装 Java 的目录HBASE_CLASSPATH:HBase 的其他类路径条目HBASE_OPTS:启动 HBase 服务时传递给 JVM 的选项
默认情况下,此文件包含一些基本的环境变量设置,但可以自定义这些设置以满足 HBase 部署的特定需求。
第二个是 hbase-site.xml 文件,该文件用于配置 HBase 的各种参数。其中包括控制 HBase 集群的各种参数,如 HDFS 和 Zookeeper 的配置参数、HBase RegionServer 的数量等等。在此文件中,还可以配置 HBase 表的属性,如表的命名空间、表的复制数、表的TTL等等。下面是该文件中的几个重要的配置参数:
-
hbase.rootdir: HBase 表的根目录,默认为hdfs://namenode:8020/hbase。也就是说,所有的 HBase 表数据都存储在 HDFS 上,具体位置由该参数指定。 -
hbase.zookeeper.quorum: ZooKeeper 服务器的主机名或IP地址列表,多个服务器之间使用逗号分隔。用于 HBase 的元数据协调。 -
hbase.master: HBase master 节点的主机名或 IP 地址和端口号,如hostname:60000,默认端口号为 60000。该参数指示客户端连接到哪个HBase master 节点,HBase master控制着 HBase 集群中所有的 RegionServer。 -
hbase.regionserver.handler.count: HBase RegionServer 处理请求的线程数。可以随着系统的硬件资源、负载和容量等情况进行相应的调整。 -
hbase.hregion.max.filesize: HBase 每个 HRegion 最大的文件大小(单位: 字节),当文件达到该限制时,HBase 将进行拆分(即,将 HRegion拆分成两个)。
需要注意的是,对于配置文件的修改,需要手动重启相应的 HBase 服务。更改配置文件后,请运行 bin/stop-hbase.sh 以停止 HBase 服务,配置完成后再运行bin/start-hbase.sh 以启动服务。
当然,我们并不是每个参数都需要修改,具体修改什么参数,请接着往下看。
配置 hbase-env.sh
必须在启动HBase之前设置JAVA_HOME环境变量。 为了使此操作更简单,为了方便起见,HBase 允许你在 conf/hbase-env.sh 文件中设置它。你必须找到 Java 在你的机器上的安装位置,找到它的方法之一是使用 whereis java 命令。一旦你找到了位置,编辑 conf/hbase-env.sh 文件,取消对以 #export JAVA_HOME= 开头的一行的注释,然后将其设置为你的 Java 安装路径。
我们来看具体操作。首先,我们先要使用 whereis 命令来获取 Java 的安装路径,如果你已经知道了,能写出来的可以把这一步略去,命令如下:
whereis java
这里我们找到了路径,但是有两个,当然,后面那个才是正确的路径,所以我们取 /usr/lib/jvm/jdk1.8.0_162

然后我们进入 HBase 的安装目录下的 conf 目录,我这里是 /usr/local/hbase/conf/,大家根据自己的安装目录进行适当的调整。然后使用 vim 编辑器打开 hbase-env.sh 文件,修改文件内容,具体命令如下:
cd /usr/local/hbase/conf/ # 进入 conf 目录
vim hbase-env.sh
配置 Java 的环境变量,具体作用是告诉 HBase 使用哪一个 jdk,我这里 Java 的安装目录是 /usr/lib/jvm/jdk1.8.0_162,还需要配置令 ZooKeeper 由 HBase 自己管理,不需要单独的 ZooKeeper,具体需要添加的内容如下:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 # 配置 Java 的环境变量
export HBASE_MANAGES_ZK=true # 配置 ZooKeeper 的管理者
因为在 hbase-env.sh 文件中已经存在有 JAVA_HOME、HBASE_MANAGES_ZK 这两个变量,但只是被注释掉了,也就是前面带了 #,所以大家可以直接寻找到对应的变量,将前面起注释作用的 # 删去,然后修改后面的值即可。但我这里比较懒,不想去找,所以我就直接写在文件顶部了,这个是不影响运行操作的,可以放心,具体图示如下:

配置 hbase-site.xml
这里我们需要修改文件中的 hbase.rootdir 、hbase.unsafe.stream.capability.enforce 两个参数,
hbase.rootdir:URI语法为hdfs:////添加一个配置,默认情况下,我们会将数据写入 ${hbase.tmp.dir} 设置的任何地方,通常是 /tmp,所以需要改变这个配置,否则机器重启时所有数据都会丢失。这里我们给它设置为 HBase 安装目录下的 hbase-tmp 文件夹,对于我的安装目录来说,具体路径在 /usr/local/hbase/hbase-tmp,大家可以根据自己的安装目录进行一定的调整,以适应不同的安装需求。
hbase.unsafe.stream.capability.enforce:这个配置项用于启用或禁用 TFramedTransport或者TLowDelayTransport的帧大小检查,在默认情况下会启用帧大小检查,用于保证网络连接和数据传输的稳定性,也就是把他的值设置为 True,因为我们现在是伪分布模式,所以不需要保证稳定性,可以选择禁用帧大小检查,从而提升数据传输性能,就是将它的值设置为 Flase,当然,也可以不管这个配置项,主要是看个人需求。
拓展一下:
hbase.unsafe.stream.capability.enforce启用此属性可能会减少故障切换选项,并可能导致潜在的数据不一致。建议在启用此属性时谨慎使用,并在将其部署到生产环境之前在非生产环境中对其进行彻底测试。该文件中还有一个参数
hbase.cluster.distributed:这个参数用于设置群集将处于的模式。对于独立模式,值设置为为false。对于分布式模式,值设置为true。默认值为false,此时startup将在一个 JVM 中运行所有 HBase 和 ZooKeeper 守护进程。
首先进入 /usr/local/hbase/conf/,然后使用 vim 编辑器修改其文件内容,具体命令如下:
cd /usr/local/hbase/conf/ # 进入 conf 目录
vim hbase-site.xml
打开可以看到其中 <configuration> 和 </configuration> 两个标签内并没有内容,我们需要输入下面内容来进行配置:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///usr/local/hbase/hbase-tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
修改前:

修改后:

测试运行
首先将工作目录切换回 HBase 安装目录,我这里的路径是 /usr/local/hbase,再启动 HBase,并且打开 shell 命令行模式,成功打开后,用户就可以通过输入 shell 命令来使用操作 HBase 数据库了。具体命令如下:
cd /usr/local/hbase
bin/start-hbase.sh # 启动 HBase
bin/hbase shell # 打开 shell 命令行模式
出现下面图示的样子,就说明 shell 命令行被成功打开了,可以看到,还有 hbase(main) 的字样:

如果出现下面问题,请点击 解决办法 ,查看解决办法。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.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 服务,可以看见已经不报警告了
cd /usr/local/hbase
start-hbase.sh

输入 help,可以获取帮助信息,帮助你更好的熟悉使用方法,还可以看见当前 HBase 的版本,如下图所示:

输入 exit,就可以退出该模式,返回终端控制台。最后我们需要停止 HBase 的运行,在终端输入下面命令:
bin/stop-hbase.sh
注意:如果在操作 HBase 的过程中发生错误,可以通过 {HBASE_HOME} 目录下的 logs 子目录中的日志文件查看错误原因,我这里的 {HBASE_HOME} 是在 /usr/local/hbase 。
2.2 伪分布式模式配置
这一部分主要是需要修改 HBase 的两个配置文件,以适应我们伪分布模式的需求,这两个文件都位于 /usr/local/hbase/conf 目录下,下面我们先详细介绍一下这两个文件:
第一个是 hbase-env.sh 文件,此文件是用于设置 HBase 及其相关服务(如 HBase 主服务器和区域服务器)使用的环境变量。可以在此文件中设置的一些关键环境变量包括:
HBASE_HOME:HBase 安装的根目录JAVA_HOME:安装 Java 的目录HBASE_CLASSPATH:HBase 的其他类路径条目HBASE_OPTS:启动 HBase 服务时传递给 JVM 的选项
默认情况下,此文件包含一些基本的环境变量设置,但可以自定义这些设置以满足 HBase 部署的特定需求。
第二个是 hbase-site.xml 文件,该文件用于配置 HBase 的各种参数。其中包括控制 HBase 集群的各种参数,如 HDFS 和 Zookeeper 的配置参数、HBase RegionServer 的数量等等。在此文件中,还可以配置 HBase 表的属性,如表的命名空间、表的复制数、表的TTL等等。下面是该文件中的几个重要的配置参数:
-
hbase.rootdir: HBase 表的根目录,默认为hdfs://namenode:8020/hbase。也就是说,所有的 HBase 表数据都存储在 HDFS 上,具体位置由该参数指定。 -
hbase.zookeeper.quorum: ZooKeeper 服务器的主机名或IP地址列表,多个服务器之间使用逗号分隔。用于 HBase 的元数据协调。 -
hbase.master: HBase master 节点的主机名或 IP 地址和端口号,如hostname:60000,默认端口号为 60000。该参数指示客户端连接到哪个HBase master 节点,HBase master控制着 HBase 集群中所有的 RegionServer。 -
hbase.regionserver.handler.count: HBase RegionServer 处理请求的线程数。可以随着系统的硬件资源、负载和容量等情况进行相应的调整。 -
hbase.hregion.max.filesize: HBase 每个 HRegion 最大的文件大小(单位: 字节),当文件达到该限制时,HBase 将进行拆分(即,将 HRegion拆分成两个)。
需要注意的是,对于配置文件的修改,需要手动重启相应的 HBase 服务。更改配置文件后,请运行 bin/stop-hbase.sh 以停止 HBase 服务,配置完成后再运行bin/start-hbase.sh 以启动服务。
当然,我们并不是每个参数都需要修改,具体修改什么参数,请接着往下看。
配置 hbase-env.sh
必须在启动HBase之前设置JAVA_HOME环境变量。 为了使此操作更简单,为了方便起见,HBase 允许你在 conf/hbase-env.sh 文件中设置它。你必须找到 Java 在你的机器上的安装位置,找到它的方法之一是使用 whereis java 命令。一旦你找到了位置,编辑 conf/hbase-env.sh 文件,取消对以 #export JAVA_HOME= 开头的一行的注释,然后将其设置为你的 Java 安装路径。
HBASE_CLASSPATH 是 HBase 用来指定 HBase 操作所需的其他类路径的环境变量。 它用于将自定义 jar 和资源添加到 HBase 的类路径中。HBase 利用此变量在其启动和操作阶段查找和加载所需的类和资源。 默认情况下,HBase 使用 CLASSPATH 环境变量来查找所需的类和资源。
我们来看具体操作。首先,我们先要使用 whereis 命令来获取 Java 的安装路径,如果你已经知道了,能写出来的可以把这一步略去,命令如下:
whereis java
这里我们找到了路径,但是有两个,当然,后面那个才是正确的路径,所以我们取 /usr/lib/jvm/jdk1.8.0_162

然后我们进入 HBase 的安装目录下的 conf 目录,我这里是 /usr/local/hbase/conf/,大家根据自己的安装目录进行适当的调整。然后使用 vim 编辑器打开 hbase-env.sh 文件,修改文件内容,具体命令如下:
cd /usr/local/hbase/conf/ # 进入 conf 目录
vim hbase-env.sh
配置 JAVA_HOME,具体作用是告诉 HBase 使用哪一个 jdk,我这里 Java 的安装目录是 /usr/lib/jvm/jdk1.8.0_162;HBASE_MANAGES_ZK 配置令 ZooKeeper 由 HBase 自己管理,不需要单独的 ZooKeeper。HBASE_CLASSPATH 变量可用于确定运行自定义 HBase 操作所需的其他 JAR 文件和目录的优先级。最后是具体需要添加的内容如下:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 # 配置 Java 的环境变量
export HBASE_MANAGES_ZK=true # 设置 ZooKeeper 的管理者
export HBASE_CLASSPATH=/usr/local/hbase/conf # 设置
因为在 hbase-env.sh 文件中已经存在有 JAVA_HOME、HBASE_MANAGES_ZK、HBASE_CLASSPATH 这三个变量,只是被注释掉了,也就是前面带了 #,所以大家可以直接寻找到对应的变量,将前面起注释作用的 # 删去,然后修改后面的值即可。我这里比较懒,不想去找,所以我就直接写在文件顶部了,这个是不影响运行操作的,可以放心,具体图示如下:

配置 hbase-site.xml
这里我们需要修改文件中的 hbase.rootdir、hbase.cluster.distributed、hbase.unsafe.stream.capability.enforce 三个参数。
hbase.rootdir:举个例子,如果要指定 HDFS 实例的 Namenode 在 nameenode.example.org 上运行的 HDFS 目录 /hbase,端口为 9000,则需要将此值设置为:hdfs://namenode.example.org:9000/hbase,因为我们做的是伪分布,所以这里我们就将它设置在本机的 9000 端口号上。
hbase.cluster.distributed:这个参数用于设置群集将处于的模式。对于分布式模式,值设置为 true,因为我们做的是伪分布模式,所以我们将其值设置为 True。
hbase.unsafe.stream.capability.enforce:这个配置项用于启用或禁用 TFramedTransport或者TLowDelayTransport的帧大小检查,在默认情况下会启用帧大小检查,用于保证网络连接和数据传输的稳定性,也就是把他的值设置为 True,因为我们现在是伪分布模式,所以不需要保证稳定性,可以选择禁用帧大小检查,从而提升数据传输性能,就是将它的值设置为 Flase,另外,此属性可能会减少故障切换选项,所以在启用的时候需要谨慎,所以我们这里禁用它也有这一层原因。
进入 /usr/local/hbase/conf/,然后使用 vim 编辑器修改其文件内容,具体命令如下:
cd /usr/local/hbase/conf/ # 进入 conf 目录
vim hbase-site.xml
打开可以看到其中 <configuration> 和 </configuration> 两个标签内并没有内容,我们需要输入下面内容来进行配置:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
修改前:

修改后:

传输到 Slave 节点上
上述 2 个文件全部配置完成以后,需要把 Master 节点上的 /usr/local/hbase 文件夹复制到各个节点上。如果之前已经运行过单机模式,建议在切换到伪分布模式之前首先删除之前在单机模式下生成的临时文件和日志文件。
因为我们要将整个 HBase 目录打包,然后再发送到其他节点中,所以我们需要先离开 Hadoop 的安装目录,所以先用 cd /usr/local 到达 HBase 安装目录的上一级目录,然后删除临时文件,之后再打包压缩发送到 Slave 节点上。注意:此时使用了 scp 命令之后是不需要输入密码的,如果需要输入密码,那就是 ssh 免密配置不成功,需要重新配置。
cd /usr/local
sudo rm -r hbase/hbase-tmp/ hbase/logs/
tar -zcf ~/hbase.master.tar.gz ./hbase
上面的 tar 命令我没加 -v,因为打包归档会有很多条目,我们也没必要都看,所以就不加 -v 选项了。当然,如果你还没有启用过 HBase ,那在删除的时候显示的应该是下面这个图的样子,因为没有启动过,那就没有日志文件,也没有缓存,但如果你之前是有进行过单机模式的配置运行,那么就会有 hbase-tmp 目录和 hbase/logs 目录。

然后就是使用 scp 命令进行传输,也可以通过 Xftp 等软件进行传输,这里我们就只演示 scp 命令传输,具体命令如下:
cd # 进入用户主目录
scp hbase.master.tar.gz Slave1:/home/hadoop/ # 发送 hbase.master.tar.gz 到 Slave1 的 /home 的 hadoop 用户目录下
因为我有三个子节点,所以需要传输三次:

Slave 节点解压
大家需要再各节点上
sudo rm -r /usr/local/hbase # 删掉旧的(如果存在)
sudo tar -zxvf ~/hbase.master.tar.gz -C /usr/local # zxvf中的 V 可以看到解压的过程。
sudo chown -R hadoop /usr/local/hbase
测试运行
首先先查看一下自己有没有打开 Hadoop 的服务,输入 jps 命令来查看是否有 Namenode 和 Datanode 等一系列进程 id。
jps # 查看当前已开启的进程 id

我这里还没有开启 Hadoop 服务,所以我们先进入 Hadoop 目录,然后再开启 Hadoop 服务,当然,前提是需要先测试一下远程登录服务 SSH 是否能够进行免密登录,最后输入 jps 查看当前已开启的进程 id,所以全部命令如下:
ssh localhost # 远程登录
cd /usr/local/hadoop # 进入 Hadoop 的安装目录
./sbin/start-dfs.sh # 开启 HDFS 服务
jps # 查看当前已开启的进程 id
能看到 NameNode、SecondaryNameNode 都已经成功启动,表示 Hadoop 启动成功:

然后再切换回 HBase 的安装目录下,再开启 HBase 服务。具体命令如下:
cd /usr/local/hbase # 进入 HBase 安装目录
./bin/start-hbase.sh # 开启 HBase 服务
jps # 查看当前已开启的进程 id
输入 jps 后就可以看见有 HQuorumPeer、HRegionServer、HMaster,都已经成功启动。
HBase RegionServer,提供 region 的服务HQuorumPeer,ZooKeeper 集群的成员

如果出现下面问题,请点击[解决办法](# 警告修正),查看解决办法。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.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]
最后打开 shell 界面,看是否有错误,输入下列指令:
./bin/hbase shell
这里他又有一个警告,有几个可能的原因,根源都是找不到 hadoop native libray,所以我们要确认 hadoop native libray 是否存在。

警告修改
首先输入下面命令进行检查:
hadoop checknative -a

可以看到报错的地方还是很多的,我们首先认为的可能是没有定义 hadoop native libray 的路径,导致找不到,可以有两种不同的解决办法,但是根本还是得先找到 hadoop native libray 的具体路径,先使用 ls 命令,查看 {HADOOP_HOME}/lib/native 下是否存在,存在就可以按照下列方法走(以下操作都是基于关闭 HBase 的情况下进行):
-
将
JAVA_LIBRARY_PATH添加到hbase-env.sh文件中,具体操作如下:首先使用编辑器打开
hbase-env.shvim conf/hbase-env.sh添加如下内容:
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native
然后重启 HBase,打开 shell 命令行
cd /usr/local/hbase # 进入 HBase 安装目录 start-hbase.sh # 开启 HBase 服务 ./bin/hbase shell # 以 HBase 开启 shell 命令行从图中可以看出,警告已经没有了

-
添加
JAVA_LIBRARY_PATH到环境变量文件~/.bashrc文件中,具体操作如下:首先用
vim编辑器打开~/.bashrc文件,然后添加变量,最后保存退出重新加载环境变量。vim ~/.bashrc添加如下内容:
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native具体效果如图:

重新加载环境变量:
source ~/.bashrc再次开启 HBase,可以看见,没有警告发出了。
cd /usr/local/hbase # 进入 HBase 安装目录 start-hbase.sh # 开启 HBase 服务 ./bin/hbase shell # 以 HBase 开启 shell 命令行
输入 exit,就可以退出该模式,返回终端控制台。最后我们需要停止 HBase 的运行,在终端输入下面命令:
bin/stop-hbase.sh
注意:如果在操作 HBase 的过程中发生错误,可以通过 {HBASE_HOME} 目录下的 logs 子目录中的日志文件查看错误原因,我这里的 {HBASE_HOME} 是在 /usr/local/hbase
2.3 完全分布式模式
要进行完全分布式配置,需要对 hbase-env.sh、hbase-site.xml、regionservers 等配置文件进行修改,下面我们就对 4 节点的 Hadoop 集群进行简单的 HBase 分布式配置。
Hadoop 的节点名:{“HDFS Namenode”:“Master”,“HDFS Datanode”:“Slave1,Slave2,Slave3”}
HBase 的节点名:{“HBase Master”:“Master”,“RegionServers”:“Slave1,Slave2,Slave3”}
ZooKeeper 集群:{“Slave1”,“Slave2,“Slave3”}
如果大家有很多的节点,那么 ZooKeeper 集群可以运行在部分节点上面,而不是所有节点都需要用上,端口号则保持默认,不做修改。
接下来我们就对这三个配置文件进行修改。
配置 hbase-site.xml
我们需要修改的属性有 4 个,分别是 hbase.zookeeper.quorum、hbase.zookeeper.property.dataDir、hbase.rootdir、hbase.cluster.distributed,下面先对这 4 个参数给一个基本的介绍。
hbase.zookeeper.quorum:Zookeeper 集群的地址列表,用逗号分割。例如:host1.mydomain.com,host2.mydomain.com,host3.mydomain.com。默认是localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。如果在hbase-env.sh设置了HBASE_MANAGES_ZK,这些 ZooKeeper 节点就会和 HBase 一起启动。
hbase.zookeeper.property.dataDir:ZooKeeper 的zoo.conf中的配置。 快照的存储位置,默认是:${hbase.tmp.dir}/zookeeper
hbase.rootdir:这个目录是 region server 的共享目录,用来持久化 HBase。URL 需要是完全正确的,还要包含文件系统的 scheme。例如,要表示 hdfs 中的/hbase目录,Namenode 运行在namenode.example.org的9090端口。则需要设置为hdfs://namenode.example.org:9000/hbase。默认情况下 HBase 是写到/tmp的。不改这个配置,数据会在重启的时候丢失。默认是:file:///tmp/hbase-${user.name}/hbase
hbase.cluster.distributed:HBase 的运行模式。如果为false,则是单机模式;如果为true,则是分布式模式。若为 false,HBase 和 Zookeeper 会运行在同一个 JVM 里面。默认为:false
使用 vim 编辑器打开 hbase-site.xml 文件
cd /usr/local/hbase/ # 进入 HBase 的安装目录
vim conf/hbase-site.xml
修改文件内容如下,其中<description> 是描述标签,用于对这个 <name> 进行解释。
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>Master,Slave1,Slave2,Slave3</value>
<description>The directory shared by RegionServers. </description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/hadoop/tmp/base/zookeeper</value>
<description>
Property from ZooKeeper's config zoo.cfg. The directory where the
snapshot is stored.
</description>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://Master:9000/hbase</value>
<description>The directory shared by RegionServers. </description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>
The mode the cluster will be in. Possible values are false:
standalone and pseudo-distributed setups with managed Zookeeper
true: fully-distributed with unmanaged Zookeeper Quorum (see
hbase-env.sh)
</description>
</property>
</configuration>
修改效果如下:

配置 regionservers
完全分布式模式的还需要修改conf/regionservers。一行写一个 host (就像 Hadoop 里面的 slaves 一样)。 列在这里的 server 会随着集群的启动而启动,集群的停止而停止.这个文件把 RegionServer 的节点列了下来。在这里面我让所有的节点都运行 RegionServer,除了第一个节点 Master,它要运行 HBase Master 和 HDFS Namenode,修改具体操作如下:
cd /usr/local/hbase/ # 进入 HBase 的安装目录
vim conf/regionservers
将文件内容中的 localhost 去掉,然后添加上其他节点的名称,因为我这里只有三个子节点,所以就看起来有点少,具体情况请大家根据自身情况自行进行调整。
Slave1
Slave2
Slave3
修改效果如图:

配置 hbase-env.sh
完全分布式模式还需要修改 hbase-env.sh 文件,具体命令如下:
cd /usr/local/hbase/ # 进入 HBase 的安装目录
vim conf/hbase-env.sh
我们将配置的输入如下内容:
JAVA_HOME:告知HBasejava的安装路径。
HBASE_MANAGES_ZK:默认的情况下 HBase 会管理一个 zookeeper 集群。这个集群会随着 HBase的 启动而启动。当然,你也可以自己管理一个zookeeper集群,但需要配置 HBase。这个值默认是true的,作用是让 HBase 启动的时候同时也启动 zookeeper。
HBASE_CLASSPATH:它的作用是用于配置 HBase 启动和运行时的 Java 类路径。具体而言,HBASE_CLASSPATH中设置的路径将被添加到 HBase 进程中的 CLASSPATH 系统环境变量中,以便可以加载 HBase 运行所需的所有 Java 类。
HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP:其作用是控制 HBase 是否使用 Hadoop 的默认类路径。当该值设置为true时,HBase 将不会自动添加 Hadoop 的相关类路径到 HBase 进程中的 CLASSPATH 环境变量中。这意味着,用户需要手动配置 Hadoop 所需的所有依赖项,包括 HDFS、MapReduce、YARN等组件的相关 jar 包和配置文件。通常情况下,HBase 会根据当前运行 HBase 的机器上的 Hadoop 安装路径自动添加 Hadoop 的依赖路径。但是在某些情况下,由于系统环境的变化或者运行时的限制,HBase 可能无法正确地识别和添加 Hadoop 类路径,从而导致 HBase 无法正常启动和运行。此时可以通过设置 HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP 来禁用 HBase的默认路径查找功能,从而让用户自己掌控 Hadoop 的类路径。
JAVA_LIBRARY_PATH:其作用是设置 Java 本地库的搜索路径。在 HBase 中,有些功能会依赖于本地库进行实现,例如 ZooKeeper、Snappy 等功能。如果这些本地库未被正确加载,将会导致功能无法正常运行。通过设置JAVA_LIBRARY_PATH环境变量,可以告诉 Java 虚拟机(JVM)在哪里查找所需的本地库。通常情况下,JAVA_LIBRARY_PATH的值应该包含目录路径,而不是特定的库文件名。当 JVM 加载本地库时,会根据操作系统不同自动添加后缀进行查找,这样可以保证在不同平台下的兼容性。
HBASE_HEAPSIZE:其作用是设置 HBase 进程所使用的堆内存大小。在 HBase 中,堆内存主要用于存储数据缓存、索引缓存、Bloom 过滤器等数据结构。由于这些数据结构会占用大量的内存空间,因此需要通过设置HBASE_HEAPSIZE来指定可用于 HBase 进程的最大堆内存大小,默认的大小为1G在这里我们设置为4G。最后拓展一下,不同平台下的
JAVA_LIBRARY_PATH配置也有区别,Linux 和 Unix 中,路径之间应该使用==冒号==:分隔;而在 Windows 中,则应该使用==分号==;分隔。
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export HBASE_MANAGES_ZK=true
export HBASE_CLASSPATH=/usr/local/hbase/conf
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native
export HBASE_HEAPSIZE=4096
因为一个个找变量太麻烦了,我就全把他们写一起了,修改效果如下图:

传输到 Slave 节点上
上述 3 个文件全部配置完成以后,需要把 Master 节点上的 /usr/local/hbase 文件夹复制到各个节点上。如果之前已经运行过单机模式,建议在切换到分布式模式之前首先删除之前在单机模式下生成的临时文件和日志文件。
因为我们要将整个 HBase 目录打包,然后再发送到其他节点中,所以我们需要先离开 Hadoop 的安装目录,所以先用 cd /usr/local 到达 HBase 安装目录的上一级目录,然后删除临时文件,之后再打包压缩发送到 Slave 节点上。注意:此时使用了 scp 命令之后是不需要输入密码的,如果需要输入密码,那就是 ssh 免密配置不成功,需要重新配置。
cd /usr/local
sudo rm -r hbase/hbase-tmp/ hbase/logs/
tar -zcf ~/hbase.master.tar.gz ./hbase
上面的 tar 命令我没加 -v,因为打包归档会有很多条目,我们也没必要都看,所以就不加 -v 选项了。当然,如果你还没有启用过 HBase ,那在删除的时候显示的应该是下面这个图的样子,因为没有启动过,那就没有日志文件,也没有缓存,但如果你之前是有进行过单机模式的配置运行,那么就会有 hbase-tmp 目录和 hbase/logs 目录。

然后就是使用 scp 命令进行传输,也可以通过 Xftp 等软件进行传输,这里我们就只演示 scp 命令传输,具体命令如下:
cd # 进入用户主目录
scp hbase.master.tar.gz Slave1:/home/hadoop/ # 发送 hbase.master.tar.gz 到 Slave1 的 /home 的 hadoop 用户目录下
因为我有三个子节点,所以需要传输三次:

Slave 节点解压
大家需要再各节点上
sudo rm -r /usr/local/hbase # 删掉旧的(如果存在)
sudo tar -zxvf ~/hbase.master.tar.gz -C /usr/local # zxvf中的 V 可以看到解压的过程。
sudo chown -R hadoop /usr/local/hbase
测试运行
首先先查看一下自己有没有打开 Hadoop 的服务,输入 jps 命令来查看是否有 Namenode 和 Datanode 等一系列进程 id。
jps # 查看当前已开启的进程 id

我这里还没有开启 Hadoop 服务,所以我们先进入 Hadoop 目录,然后再开启 Hadoop 服务,当然,前提是需要先测试一下远程登录服务 SSH 是否能够进行免密登录,最后输入 jps 查看当前已开启的进程 id,所以全部命令如下:
ssh localhost # 远程登录
cd /usr/local/hadoop # 进入 Hadoop 的安装目录
start-dfs.sh # 开启 HDFS 服务
jps # 查看当前已开启的进程 id

然后再切换回 HBase 的安装目录下,再开启 HBase 服务。具体命令如下:
cd /usr/local/hbase # 进入 HBase 安装目录
start-hbase.sh # 开启 HBase 服务
jps # 查看当前已开启的进程 id
这里报了个错误,无法创建 data 目录导致无法开启 ZooKeeper,这次的启动算是以失败告终。

往前面翻了翻,发现是我的 hbase-site.xml 文件配置中有一些问题,其中的 hbase.zookeeper.property.dataDir 变量的值有些问题,因为变量的值应该是一个路径,但是我写的路径并不存在,所以对该值进行修改,修改成如下图结果:

改完之后,将修改传到各个 Slave 节点中,然后再次开启 HBase 服务,就可以正常启动 HBase了。输入 jps 后就可以看见有 HQuorumPeer、HRegionServer、HMaster,都已经成功启动。
HRegionServer,提供 region 的服务HQuorumPeer, ZooKeeper 集群的成员
Master:

Slave1:

Slave2:

Slave3:

最后打开 shell 命令行,检查是否能进行启动以及是否有别的报警或报错:
cd /usr/local/hbase
bin/hbase shell
没有出现别的报错,说明我们成功了。

关闭 HBase 和 Hadoop,Hadoop 自带一个 stop-all.sh,可以一键把所有 Hadoop 服务全部关闭。
stop-hbase.sh # 关闭 HBase
stop-all.sh # 关闭 Hadoop
写在最后
这篇博客写了也不算很长时间,五天左右,从刚开始的思考,到最后我能独自解决这些问题,感觉真的特别不容易。很多问题出现了,又慢慢解决了。虽然可能在真正的生产环境中会有一些问题会暴露出来,但现在学习阶段,我希望的是,大家尽量多犯错,多多去查找问题的结果,多多解决问题,这才是提高最好的办法。下一篇我们就写 HBase 用 Shell 命令行的编程。
更多推荐


所有评论(0)