You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Apache Accumulo 2.0.1与ZooKeeper 3.8.1后无法检测ZooKeeper的解决办法

问题

将包含Apache Accumulo和ZooKeeper的Docker栈更新,原配置适配Accumulo 1.9.3与ZooKeeper 3.4.8,升级至Accumulo 2.0.1和ZooKeeper 3.8.1后,Accumulo无法检测到ZooKeeper,调整环境变量无效,需修改Dockerfile或docker-compose中的哪些配置?

旧Dockerfile内容:

FROM hdfs-custom-image

ARG TAG
ARG ZOOKEEPER_VERSION
ARG ACCUMULO_VERSION


# Install Zookeeper
ENV ZOOKEEPER_VERSION ${ZOOKEEPER_VERSION}
ENV ZOOKEEPER_HOME /opt/zookeeper
ENV ZOOKEEPER_DATA /data/zookeeper
ENV ZOOKEEPER_CONF_DIR $ZOOKEEPER_HOME/conf
ENV ZOO_LOG4J_PROP WARN,CONSOLE
ENV PATH $PATH:$ZOOKEEPER_HOME/bin
ENV ACCUMULO_HOME=/opt/accumulo
ENV PATH="$PATH:/opt/accumulo/bin"

RUN set -x \
    && mkdir -p $ZOOKEEPER_HOME $ZOOKEEPER_DATA  \
    && curl -# https://archive.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}.tar.gz  \
    | tar -xz -C ${ZOOKEEPER_HOME} --strip-components=1


# Install Accumulo
ENV ACCUMULO_VERSION ${ACCUMULO_VERSION}
ENV ACCUMULO_HOME /opt/accumulo
ENV ACCUMULO_CONF_DIR $ACCUMULO_HOME/conf
ENV PATH=$PATH:$ACCUMULO_HOME/bin

ADD accumulo-${ACCUMULO_VERSION}-bin.tar.gz /opt

RUN set -x \
  && mv /opt/accumulo-${ACCUMULO_VERSION} ${ACCUMULO_HOME} \
  && yum install -y make gcc-c++ \
#  && bash -c "${ACCUMULO_HOME}/bin/build_native_library.sh" \
  && yum -y autoremove gcc-c++

WORKDIR "${ACCUMULO_HOME}"

COPY ./fs/sbin /sbin
COPY ./fs/opt /opt

ENTRYPOINT [ "/sbin/entrypoint.sh" ]
解决方案

一、Dockerfile核心调整

1. 修复ZooKeeper下载包类型

ZooKeeper 3.5+版本后,官方二进制包带-bin后缀,原下载地址指向源码包,会导致无法运行。修改下载命令:

# 替换原ZooKeeper下载行
&& curl -# https://archive.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz \
| tar -xz -C ${ZOOKEEPER_HOME} --strip-components=1

2. 启用Accumulo原生库构建

Accumulo 2.0.x依赖原生库支持,取消注释构建命令并补充编译依赖:

# 修改Accumulo安装段的RUN命令
RUN set -x \
  && mv /opt/accumulo-${ACCUMULO_VERSION} ${ACCUMULO_HOME} \
  && yum install -y make gcc-c++ openssl-devel \
  && bash -c "${ACCUMULO_HOME}/bin/build_native_library.sh" \
  && yum -y autoremove gcc-c++ openssl-devel

3. 添加ZooKeeper 3.8.x适配环境变量

新增必要的ZooKeeper配置变量:

# 在ZooKeeper环境变量段添加
ENV ZOO_CLIENT_PORT 2181
ENV ZOO_TICK_TIME 2000

二、Accumulo配置文件修正

修改${ACCUMULO_CONF_DIR}/accumulo.properties中的ZooKeeper相关配置(可在entrypoint脚本中动态生成或挂载自定义配置):

  • 指定ZooKeeper地址:instance.zookeeper.host=zookeeper:2181(对应docker-compose中ZooKeeper服务名)
  • 调整会话超时适配新版本:instance.zookeeper.timeout=30s
  • 设置Accumulo专属ZooKeeper根节点:instance.zookeeper.root=/accumulo

三、docker-compose.yml配置优化

1. 服务依赖与网络

确保Accumulo依赖ZooKeeper且同属一个网络:

version: '3.8'
services:
  zookeeper:
    build:
      context: .
      args:
        ZOOKEEPER_VERSION: 3.8.1
        ACCUMULO_VERSION: 2.0.1
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181
    volumes:
      - zk-data:/data/zookeeper
    networks:
      - accumulo-net

  accumulo:
    build:
      context: .
      args:
        ZOOKEEPER_VERSION: 3.8.1
        ACCUMULO_VERSION: 2.0.1
    depends_on:
      - zookeeper
    environment:
      ACCUMULO_INSTANCE_NAME: myinstance
      ACCUMULO_ROOT_PASSWORD: secret
      ACCUMULO_ZOOKEEPERS: zookeeper:2181
    volumes:
      - accumulo-data:/opt/accumulo/data
    networks:
      - accumulo-net

volumes:
  zk-data:
  accumulo-data:

networks:
  accumulo-net:
    driver: bridge

2. 健康检查确保服务就绪

给ZooKeeper添加健康检查,避免Accumulo提前启动:

zookeeper:
  # 其他配置不变
  healthcheck:
    test: ["CMD", "zkServer.sh", "status"]
    interval: 10s
    timeout: 5s
    retries: 5

同时在Accumulo的entrypoint.sh中添加等待ZooKeeper就绪的逻辑:

# 等待ZooKeeper服务可用
until echo ruok | nc zookeeper 2181 | grep imok; do
  sleep 2
done

四、entrypoint.sh脚本补全

  1. 生成ZooKeeper配置文件(3.8.x默认无zoo.cfg,需从模板复制):
cp ${ZOOKEEPER_CONF_DIR}/zoo_sample.cfg ${ZOOKEEPER_CONF_DIR}/zoo.cfg
sed -i "s|dataDir=/tmp/zookeeper|dataDir=${ZOOKEEPER_DATA}|" ${ZOOKEEPER_CONF_DIR}/zoo.cfg
echo "clientPort=${ZOO_CLIENT_PORT}" >> ${ZOOKEEPER_CONF_DIR}/zoo.cfg
echo "tickTime=${ZOO_TICK_TIME}" >> ${ZOOKEEPER_CONF_DIR}/zoo.cfg
  1. 初始化Accumulo时指定正确的ZooKeeper地址:
accumulo init --instance-name $ACCUMULO_INSTANCE_NAME --password $ACCUMULO_ROOT_PASSWORD --zk-hosts $ACCUMULO_ZOOKEEPERS

内容的提问来源于stack exchange,提问作者Luigi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:45:01