【问题标题】:HBase Error IllegalStateException when starting Master: hsync启动 Master 时出现 HBase 错误 IllegalStateException:hsync
【发布时间】:2018-02-09 15:54:50
【问题描述】:

我正在尝试在 hadoop 集群上安装 HBase,但无法弄清楚为什么从 start-hbase.sh 调用 HMaster 无法启动。日志文件表明 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 区域服务器 /usr/local/zookeeper/data/ 的 .pid 文件相同的目录中

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

2018-02-08 17:26:54,786 错误 [master/MasterNode/MasterNode:16000] master.HMaster: 无法成为活动主机 java.lang.IllegalStateException:过程 WAL 依赖于在组件故障期间进行正确操作的 hsync 能力,但底层文件系统不支持这样做。请检查“hbase.procedure.store.wal.use.hsync”的配置值以设置所需的稳健性级别,并确保“hbase.wal.dir”的配置值指向可以提供它的文件系统挂载。 在 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 错误 [master/MasterNode/MasterNode:16000] master.HMaster:主服务器中止:加载的协处理器是:[] 2018-02-08 17:26:54,787 错误 [master/MasterNode/MasterNode:16000] master.HMaster:未处理的异常。开始关机。 java.lang.IllegalStateException:过程 WAL 依赖于在组件故障期间进行正确操作的 hsync 能力,但底层文件系统不支持这样做。请检查“hbase.procedure.store.wal.use.hsync”的配置值以设置所需的稳健性级别,并确保“hbase.wal.dir”的配置值指向可以提供它的文件系统挂载。 在 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

【问题讨论】:

    标签: hadoop hbase apache-zookeeper


    【解决方案1】:

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

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

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

    【讨论】:

    • 这解决了我遇到这样错误的同样问题。 (以独立模式运行 hbsae)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      解决方案

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

      【讨论】:

      • hbase.unsafe.stream.capability.enforce 解决了我的问题。谢谢。
      【解决方案4】:

      理想情况下,我们不应将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 时,当前 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 的所有二进制文件。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多