【问题标题】:How to make HDFS work in docker swarm如何使 HDFS 在 docker swarm 中工作
【发布时间】:2019-10-09 05:16:01
【问题描述】:

我的 HDFS 设置无法在 docker swarm 中运行。 为了理解这个问题,我已将我的设置减少到最低限度:

  • 1 台物理机
  • 1 个名称节点
  • 1 个数据节点

此设置在 docker-compose 上运行良好,但在 docker-swarm 上失败,使用相同的 compose 文件。

这是撰写文件:

version: '3'
services:
  namenode:
      image: uhopper/hadoop-namenode
      hostname: namenode
      ports:
        - "50070:50070"
        - "8020:8020"
      volumes:
        - /userdata/namenode:/hadoop/dfs/name
      environment:
        - CLUSTER_NAME=hadoop-cluster

  datanode:
    image: uhopper/hadoop-datanode
    depends_on:
      - namenode
    volumes:
      - /userdata/datanode:/hadoop/dfs/data
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://namenode:8020

为了测试它,我在我的主机(物理)机器上安装了一个 hadoop 客户端,只有 core-site.xml 中的这个简单配置:

<configuration>
  <property><name>fs.defaultFS</name><value>hdfs://0.0.0.0:8020</value></property>
</configuration>

然后我运行以下命令:

hdfs dfs -put test.txt /test.txt

使用 docker-compose(只是运行 docker-compose up)它可以工作,并且文件是用 HDFS 编写的。

使用 docker-swarm,我正在运行:

docker swarm init 
docker stack deploy --compose-file docker-compose.yml hadoop

然后,当所有服务都启动时,我将文件放在 HDFS 上,它会像这样失败:

INFO hdfs.DataStreamer: Exception in createBlockOutputStream
org.apache.hadoop.net.ConnectTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/x.x.x.x:50010]
        at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:534)
        at org.apache.hadoop.hdfs.DataStreamer.createSocketForPipeline(DataStreamer.java:259)
        at org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1692)
        at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1648)
        at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:704)
18/06/14 17:29:41 WARN hdfs.DataStreamer: Abandoning BP-1801474405-10.0.0.4-1528990089179:blk_1073741825_1001
18/06/14 17:29:41 WARN hdfs.DataStreamer: Excluding datanode DatanodeInfoWithStorage[10.0.0.6:50010,DS-d7d71735-7099-4aa9-8394-c9eccc325806,DISK]
18/06/14 17:29:41 WARN hdfs.DataStreamer: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /test.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and 1 node(s) are excluded in this operation.

如果我查看 Web UI,datanode 似乎已启动并且没有报告任何问题...

更新:swarm似乎忽略了dependsOn,但这似乎不是我的问题的原因:当namenode启动时我已经重新启动了datanode,但它没有更好地工作。

感谢您的帮助:)

【问题讨论】:

  • 如果你看datanode和namenode的日志,他们在通信吗? 1 node(s) are excluded in this operation 好像说他们不是
  • 是的,他们似乎是有联系的。
  • 你在单台机器上运行 swarm 有什么原因吗?我有一个非常相似的 compose 文件,它似乎在没有 swarm 的情况下运行良好
  • @cricket_007 它应该在 3 台机器上运行。但是为了理解这个问题,我已经将我的设置减少到最低限度并在一台机器上重现它。
  • @Bierbarbar 从未找到解决方案,如果有请告诉我:)

标签: docker hadoop hdfs docker-swarm


【解决方案1】:

整个混乱源于使用覆盖网络的 docker swarm 之间的交互以及 HDFS 名称节点如何跟踪其数据节点。名称节点根据数据节点的覆盖网络 IP 记录数据节点 IP/主机名。当 HDFS 客户端请求直接在数据节点上进行读/写操作时,名称节点会根据覆盖网络报告数据节点的 IP/主机名。由于外部客户端无法访问覆盖网络,因此任何 rw 操作都将失败。

我使用的最终解决方案(经过大量努力使覆盖网络正常工作)是让 HDFS 服务使用主机网络。这是 compose 文件中的一个 sn-p:

version: '3.7'

x-deploy_default: &deploy_default
  mode: replicated
  replicas: 1
  placement:
    constraints:
      - node.role == manager
  restart_policy:
    condition: any
    delay: 5s

services:
  hdfs_namenode:
    deploy:
      <<: *deploy_default
    networks:
      hostnet: {}
    volumes:
      - hdfs_namenode:/hadoop-3.2.0/var/name_node
    command:
      namenode -fs hdfs://${PRIMARY_HOST}:9000
    image: hadoop:3.2.0

  hdfs_datanode:
    deploy:
      mode: global
    networks:
      hostnet: {}
    volumes:
      - hdfs_datanode:/hadoop-3.2.0/var/data_node
    command:
      datanode -fs hdfs://${PRIMARY_HOST}:9000
    image: hadoop:3.2.0
volumes:
  hdfs_namenode:
  hdfs_datanode:

networks:
  hostnet:
    external: true
    name: host

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多