启动Master时出现HBase错误IllegalStateException:hsync

时间:2018-02-09 15:54:51

标签: hadoop hbase apache-zookeeper

我正在尝试在hadoop集群上安装HBase,并且无法弄清楚为什么HMaster在从start-hbase.sh调用时无法启动。日志文件表明hsync存在问题。我已经确认zookeeper在分布式模式下正常运行,并且我没有遇到任何通过spark使用hadoop集群的问题。尝试启动HBase时,区域服务器在所有数据节点上启动。

我有hadoop版本3.0.0,zookeeper 3.4.11和hbase 2.0.0 beta 1.

我已经清除了zookeeper hbase节点和hdfs hbase目录并重新启动,没有运气。我将myid zookeeper文件存储在与zookeeper和hbase区域服务器的/ .pid文件相同的目录中/ usr / local / zookeeper / data /

下面我摘录了与hsync异常有关的hbase主日志文件。

  

2018-02-08 17:26:54,786 ERROR [master / MasterNode / MasterNode:16000] master.HMaster:无法成为活动主人   java.lang.IllegalStateException:过程WAL依赖于在组件故障期间hsync正常运行的能力,但底层文件系统不支持这样做。请检查'hbase.procedure.store.wal.use.hsync'的配置值以设置所需的健壮性级别,并确保'hbase.wal.dir'的配置值指向可提供它的FileSystem挂载。       在org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1036)       在org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:374)       在org.apache.hadoop.hbase.procedure2.ProcedureExecutor.start(ProcedureExecutor.java:532)       在org.apache.hadoop.hbase.master.HMaster.startProcedureExecutor(HMaster.java:1232)       在org.apache.hadoop.hbase.master.HMaster.startServiceThreads(HMaster.java:1145)       在org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:837)       在org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2026)       在org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:547)       在java.lang.Thread.run(Thread.java:748)   2018-02-08 17:26:54,787 ERROR [master / MasterNode / MasterNode:16000] master.HMaster:主服务器中止:加载的协处理器是:[]   2018-02-08 17:26:54,787 ERROR [master / MasterNode / MasterNode:16000] master.HMaster:未处理的异常。开始关机。   java.lang.IllegalStateException:过程WAL依赖于在组件故障期间hsync正常运行的能力,但底层文件系统不支持这样做。请检查'hbase.procedure.store.wal.use.hsync'的配置值以设置所需的健壮性级别,并确保'hbase.wal.dir'的配置值指向可提供它的FileSystem挂载。       在org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1036)       在org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:374)       在org.apache.hadoop.hbase.procedure2.ProcedureExecutor.start(ProcedureExecutor.java:532)       在org.apache.hadoop.hbase.master.HMaster.startProcedureExecutor(HMaster.java:1232)       在org.apache.hadoop.hbase.master.HMaster.startServiceThreads(HMaster.java:1145)       在org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:837)       在org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2026)       在org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:547)       在java.lang.Thread.run(Thread.java:748)

以下是hbase-site.xml文件

<property>
    <name>hbase.master</name>
    <value>localhost:60000</value>
    <description>The host and port that the HBase master runs at.A value of 'lo$
</property>
<property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
    <description>Property from ZooKeeper's config zoo.cfg.The port at which the$
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>MasterNode,Slave1,Slave2</value>
    <description>Comma separated list of servers in the ZooKeeper Quorum.For ex$
</property>
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://MasterNode:9000/hbase</value>
</property>
<property>
    <name>hbase.tmp.dir</name>
    <value>/usr/local/zookeeper/data</value>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/usr/local/zookeeper/data</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>zookeeper.znode.parent</name>
    <value>/hbase</value>
</property>

以下是对hbase-env.sh文件设置的更改

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HBASE_HOME=/usr/local/hadoop/HBase
export HADOOP_HOME=/usr/local/hadoop
export HBASE_MANAGES_ZK=false
export HBASE_PID_DIR=/usr/local/zookeeper/data

以下是core-site.xml

<property>
    <name>hadoop.tmp.dir</name>
    <value>/app/hadoop/tmp</value>
</property>
<property>
    <name>fs.default.name</name>
    <value>hdfs://MasterNode:9000</value>
</property>

下面是zoo.cfg

tickTime=2000
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
clientPort=2181
initLimit=5
syncLimit=2
server.1=MasterNode:2888:3888
server.2=Slave1:2888:3888
server.3=Slave2:2888:3888

以下是与hadoop设置相关的.bashrc设置

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_PREFIX=/usr/local/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONFDIR=$HADOOP_HOME/etc/hadoop
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/
export PATH=$PATH:$HADOOP_HOME/bin
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HBASE_HOME=/usr/local/hadoop/HBase
export PATH=$PATH:$HBASE_HOME/bin

5 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我的解决方案如下: 编辑hbase-site.xml并添加以下内容:

<property>
  <name>hbase.unsafe.stream.capability.enforce</name>
  <value>false</value>
</property>

该属性控制HBase是否检查流功能(hflush / hsync)。更多详细信息请参考official website

答案 1 :(得分:2)

我遇到了与您完全相同的问题。遇到问题时,我正在运行hbase-2.0.1和hadoop-2.9.1。我的解决方案是我下载了更高版本的hbase(hbase-0.98.13-hadoop2)。您正在使用的hadoop和hbase版本之间可能存在版本不兼容。

答案 2 :(得分:2)

理想情况下,我们不应该将hbase.unsafe.stream.capability.enforce设置为false。这是有风险的。相反,只需将您的某些hadoop二进制文件复制到hbase lib。

例如, 如果您的HBase是2.2.5,请使用Hadoop 2.8.5构建。 (您可以使用hbase库下的ls hadoop*2.8.5*.jar文件对hadoop二进制文件进行grep,这将告诉您使用哪个HBase构建的Hadoop版本。)

hbase.unsafe.stream.capability.enforce设置为false时,Curent HBase将Hadoop版本显示为

Hadoop版本2.8.5, 版本= 826afbeae31ca687bc2f8471dc841b66ed2c6704

现在我正在尝试将HBase 2.2.5(由Hadoop 2.8.5预先构建)与Hadoop 2.9.2结合使用

要解决的步骤是

  1. 转到$ HBASE_HOME / lib
  2. 列出hadoop ls hadoop*2.8.5*.jar的所有文件并做笔记。
  3. 删除旧的hadoop库rm hadoop*2.8.5*.jar
  4. 从hadoop提取的文件夹中找到已记录的二进制文件(如果有)?否则,请根据您的hadoop版本从maven存储库Hadoop Binary Home下载二进制文件。
  5. 转到$ HBASE_HOME / lib,复制所有下载的二进制文件。
  6. 启动HBase,根据我的示例,HBase UI将显示如下的hadoop版本

Hadoop版本2.9.2, 版本= 826afbeae31ca687bc2f8471dc841b66ed2c6704

总体而言,您要确保HBase库仅包含要使用的Hadoop的所有二进制文件。

答案 3 :(得分:0)

您似乎从HBase镜像站点下载了HBase-2.0-beta1发行版。 HBase的默认编译是使用默认的hadoop配置文件完成的,即2.0。 HBase lib文件夹包含hadoop-2.7版本的hadoop依赖项,它不支持hsync功能。因此,尝试通过 -Dhadoop.profile = 3.0 从源代码构建HBase。这构建了具有hadoop-3.0依赖关系的Hbase发行版。使用此分发来运行HBase。

答案 4 :(得分:0)

在使用HDFS作为base.rootdir的3-N Hbase群集上将HBase 2.2.1与Hadoop 3.2.1结合使用时,我遇到了类似的问题。

解决方案

  1. hbase-site.xml
  2. 中将配置设置为hbase.unsafe.stream.capability.enforcefalse
  3. 不确定是否有必要,也将hbase.wal.dir更改为hbase.rootdir之外的HDFS目录