【问题标题】:Wrong HDFS Configured Capacity in Docker StackDocker Stack 中错误的 HDFS 配置容量
【发布时间】:2022-01-01 20:14:53
【问题描述】:

我正在使用一个 Docker 堆栈,该堆栈在同一台机器上实现了一个 Hadoop Namenode、两个 Datanode、两个节点管理器、一个资源管理器、一个历史服务器和其他技术。 p>

我遇到了与 HDFS UI 中显示的 HDFS 配置容量相关的问题。

我正在使用一台容量为 256GB 的机器,并且我正在使用上面提到的两个 datanodes 实现。 HDFS 不是在两个节点之间分配总容量,而是通过为每个数据节点分配 226.87GB 来复制整个机器的容量。 As you can see here.

关于如何让 HDFS 显示正确的容量有什么想法吗?

这是实现上述 hadoop 技术的 docker compose 部分。

    services:
  # Hadoop master
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: namenode
    ports:
      - 9870:9870
      - 8020:8020
    volumes:
      - ./namenode/home/${ADMIN_NAME:?err}:/home/${ADMIN_NAME:?err}
      - ./namenode/hadoop-data:/hadoop-data
      - ./namenode/entrypoint.sh:/entrypoint.sh
      - hadoop-namenode:/hadoop/dfs/name
    env_file:
      - ./hadoop.env
      - .env
    networks:
      - hadoop

  resourcemanager:
    restart: always
    image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8
    container_name: resourcemanager
    ports:
      - 8088:8088
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode1:9864"
    env_file:
      - ./hadoop.env
    networks:
      - hadoop

  # Hadoop slave 1
  datanode1:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: datanode1
    volumes:
      - hadoop-datanode-1:/hadoop/dfs/data
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
    env_file:
      - ./hadoop.env
    networks:
      - hadoop

  nodemanager1:
    image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
    container_name: nodemanager1
    volumes:
      - ./nodemanagers/entrypoint.sh:/entrypoint.sh
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode1:9864 resourcemanager:8088"
    env_file:
      - ./hadoop.env
      - .env
    networks:
      - hadoop

  # Hadoop slave 2
  datanode2:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: datanode2
    volumes:
      - hadoop-datanode-2:/hadoop/dfs/data
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
    env_file:
      - ./hadoop.env
    networks:
      - hadoop

  nodemanager2:
    image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
    container_name: nodemanager2
    volumes:
      - ./nodemanagers/entrypoint.sh:/entrypoint.sh
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode2:9864 resourcemanager:8088"
    env_file:
      - ./hadoop.env
      - .env
    networks:
      - hadoop

  historyserver:
    image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8
    container_name: historyserver
    ports:
      - 8188:8188
    environment:
      SERVICE_PRECONDITION: "namenode:9870 datanode1:9864 datanode2:9864 resourcemanager:8088"
    volumes:
      - hadoop-historyserver:/hadoop/yarn/timeline
    env_file:
      - ./hadoop.env
    networks:
      - hadoop

【问题讨论】:

    标签: docker hadoop docker-compose hdfs storage


    【解决方案1】:

    您需要创建具有适合您机器的已定义大小的 docker 卷,然后要求每个 DN 使用该卷。然后当 DN 检查其卷的大小时,它应该返回卷的大小而不是整个机器的容量并将其用于容量。

    【讨论】:

    • 感谢您的回复。不幸的是,我尝试编辑我的 docker-compose,以便按照您的建议为每个 DN 已经在使用的卷(hadoop-datanode-1 和 hadoop-datanode-2)定义特定大小,但是没有成功,您能显示我是一个如何做的简单例子,我在任何地方都找不到。
    • 令人惊讶的是(对我来说),在 docker 中设置卷大小似乎是不可能的,至少使用默认存储驱动程序是不可能的。例如stackoverflow.com/questions/52089499/…,但进一步搜索并没有给我任何其他暗示这是可能的。一个选项似乎是使用 LVM 并在您的主机上创建一系列所需大小的挂载,然后将它们用于卷。但是,这会为每个 DN 完全保留您的空间,并且会降低您的设置在其他机器上的可移植性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2018-06-14
    • 2014-12-18
    • 2017-07-05
    相关资源
    最近更新 更多