Power by GeekHades

Hadoop学习笔记——Hbase安装(踩各种坑)

前言

Hadoop生态圈中提供实时分布式存储的部分是Hbase,Hbase通过HDFS来存储数据。但是在安装HBase的过程中可能就并不是如此顺利。

例如你会遇到ZooKeeper莫名的"Connection refused"亦或者是HMaster莫名其妙的启动后就Down掉。又因为log4j包冲突,一堆Warning不胜其烦。很可能一个Hbase的启动错误能让你排查一天,我就已经排查了整整一天。

因此接下来我会用最正确的安装姿势来让大家越过这些坑坑洼洼。

开始之前

在开始安装之前我必须的说一些重要的事:

  • 第一:如果你不想理解Hadoop生态圈的安装过程,或者认为这些麻烦的安装过程简直是为大数据学习之路添堵的同学,请立即关闭此网页,去搜索「Ambari」。Hadoop生态圈的自动化安装、部署、管理、监测工具。

  • 第二:如果你还想手动安装Hbase请认真阅读以下文字

Hbase 的最新版的目前是2.2.0,它里面lib依赖的是Hadoop 2.8.5,Hbase 在存储过程中为了保证数据的正确存储采取了hflush/hsync的流存储,如果你的Hadoop此时是2.8以上的话,很可能就产生不兼容。由此可能印发一大堆问题,望读者悉知!

下图是Hbase官方的温馨提醒

hbase_note

Hbase 官方推荐使用Hadoop 2.x,因为它们更快而且包含更多特性,并且3.x目前还都是不稳定版。

我之前的教程用了Hadoop 3.x版本来做,感觉自己有点鲁莽了!

本文的实验环境是

  • Hbase 2.2.0
  • Hadoop 3.1
  • Ubuntu 16.04 LTS

但是我极力推荐读者使用以下的配置:

  • Hbase 2.2.0
  • Hadoop 2.8.5

因为这种环境你将不会遇到hflush/hsync不兼容的问题。

安装

下载解压

下载地址,从下载地址中把相应的bin包下载到机器上。

然后使用下列命令完成解压缩、迁移文件和修改权限操作。

tar xzvf hbase-x.x.x-bin.tar.gz
sudo mv hbase-x.x.x /usr/local/hbase
cd /usr/local
chown -R $USER hbase
cd hbase

修改配置文件

单机(standalone)模式

强烈推荐读者先进行此模式的实验,因为如果单机模式没问题的话,之后分布式部署出现问题就能够缩小排查范围。

修改conf/hbase-env.sh添加JAVA_HOME

# 2.0 以上最好使用jdk1.8
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

修改conf/hbase-site.xml文件添加以下内容,testuser是你目前的用户,示例来自Hbase官网。与其他网上教程不同的是,多了hbase.unsafe.stream.capability.enforce这个属性的设置,这就是文章开头所说的hflush/hsync的新特性。如果使用的是单机模式将value置为false

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/testuser/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/testuser/zookeeper</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
    <description>
      Controls whether HBase will check for stream capabilities (hflush/hsync).

      Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
      with the 'file://' scheme, but be mindful of the NOTE below.

      WARNING: Setting this to false blinds you to potential data loss and
      inconsistent system state in the event of process and/or node failures. If
      HBase is complaining of an inability to use hsync or hflush it's most
      likely not a false positive.
    </description>
  </property>
</configuration>

此时在命令行中输入bin/start-hbase.sh启动hbase。在这个过程你可能会遇到log4j的冲突警告,可以忽略它。运行结束后使用jps查看此时是否有HMaster, HRegionServer这两个进程。如果有则说明启动成功。

使用bin/hbase shell进入Hbase的命令行交互环境。

键入status查看相应状态。正常应如下图所示

status

PS:如果出现ERROR: KeeperErrorCode = NoNode for /hbase/master错误提示,请检查logs文件提示内容以及查看2181是否被zookeeper监听。之后使用stop-hbase.sh关闭Hbase数秒后再次启动。

此时Hbase单机模式就已经部署成功了。

伪分布式模式

此模式需要在单机模式的配置文件基础上做出改动。

修改conf/hbase-site.xml

添加hbase.cluster.distributed属性置值为true开启分布式模式,如果是false则是单机模式。

<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>

rootdir的值改为hdfs的地址,注意这里必须是要和Hadoopcore-site.xml中的fs.defaultFS值一致。

<property>
  <name>hbase.rootdir</name>
  <value>hdfs://localhost:9000/hbase</value>
</property>

再将hbase.unsafe.stream.capability.enforce的值设置为true,这是为了保证数据能够正确的存储。

至此伪分布式的配置文件修改完毕使用使用下列命令启动。在这之前必须保证Hbase和内建的zookeeper处于关闭状态。使用stop-hbase.sh即可

start-dfs.sh
start-hbase.sh

启动完毕后运行jps查看以下进程是否都存在 jps

确保都存在之后运行hbase shell再次键入status查看是否部署成功。

如果全部正常则部署已经全部成功完成。

如果读者是使用我目前的配置进行部署很可能会遇到Connection refused or

java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.
    at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1092)
    at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:424)
    at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.init(ProcedureExecutor.java:576)
    at org.apache.hadoop.hbase.master.HMaster.createProcedureExecutor(HMaster.java:1538)
    at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:956)
    at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2353)
    at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:598)
    at java.lang.Thread.run(Thread.java:748)

Connection refused错误

这是zookeeper连接不上hadoop导致的,请确保2181端口是否被zoopkeeper监听以及rootDirhdfs路径是否正确(与core-site.xmlfs.defaultFS值一致。)

hsync错误

这个坑是最不容易发现的,也是让我调了一整天的坑。原因在前面已经说过了就是本机的Hadoop版本与Hbase所依赖的Hadoop版本不一致所引发的。

以下给出我亲测有效的3种解决办法

  • 关闭hsync检查

hbase-site.xml文件中的 hbase.unsafe.stream.capability.enforce值置为false。这种方法简单粗暴,立马见效,但是副作用就是有可能会导致文件存储错误。

  • 在官方repo中拉下hbase源码编译适配Hadoop3.x版

这种方法就能得到官方示例中的hbase-3.0.0-SNAPSHOT-bin.tar.gz。具体操作命令如下

git clone https://github.com/apache/hbase.git
cd hbase
mvn clean package -DskipTests assembly:single -Dhadoop.profile=3.0

这种方法是最安全的,唯一缺点就是maven下载依赖包太耗时间。

  • 主动降低Hadoop版本

这种方法是官方所推荐的,具体的Hadoop版本适配请查看Hbase目录中的lib底下Hadoop依赖包的版本。

例如Hbase 2.2.0依赖的就是Hadoop 2.8.5。

总结

本文介绍了Hbase的安装以及适配Hadoop的具体方式,给出可能会遇到的错误的具体解决方案。

最后我还是建议读者以后搭建Hadoop环境时使用「Ambari」。

祝大家身体健康、学业进步和工作顺利。



* 如果你对文章有任何意见或建议请发 邮件 给我!
* if you have any suggestion that you could send a E-mail to me, Please!