首页 > 解决方案 > Docker Swarm 上的 Hadoop 访问 DataNode 的问题

问题描述

我目前正在四台机器上设置一个 Hadoop 集群。我有一个名称节点和四个数据节点正在运行,它们通过 docker swarm 覆盖网络进行通信。

现在来解决问题:当尝试从名称节点外部写入 HDFS 时,会委托给数据节点,因此 HDFS 客户端会尝试访问这些节点。但是 namenode 提供的数据节点的地址来自 docker swarm 覆盖网络的接口(在我的情况下为 10.0.7.0/24),因此无法从外部访问它们。

有没有办法让名称节点返回可从外部访问的数据节点的地址?例如,使用运行数据节点的服务器的公共 IP?

提前致谢!

标签: hadoophdfsdocker-swarm

解决方案


覆盖网络(默认)中的VIP模式似乎是一个问题,显然,由于具有负载平衡的覆盖网络行为() ,使得主节点的主机名指向另一个 IP 而不是相应的 IP 。

阅读网络文档中的这一部分,我已经解决了将路由网格更改endpoint_modednsrr阻止路由网格的问题。

请注意,dnsrr模式不支持入口模式,因此您需要按照本节的说明指定主机模式下的所有端口。请记住以下警告:

如果您希望在每个节点上运行多个服务任务(例如当您有 5 个节点但运行 10 个副本时),则不能指定静态目标端口。要么允许 Docker 分配一个随机的高编号端口(通过保留已发布的端口),要么通过使用全局服务而不是复制的服务,或使用放置来确保在给定节点上只有一个服务实例运行约束。

mode: global这就是为什么您在部署时也需要添加设置的原因。docker-compose.yml这是我准备在 Docker Swarm 中运行的最终文件:

version: "3.6"
services:
  # Master
  master-node:
    [...] # Extra config
    ports:
      - target: 8088
        published: 8088
        protocol: tcp
        mode: host
      - target: 8080
        published: 8080
        protocol: tcp
        mode: host
      [...] # Extra ports
    deploy:
      endpoint_mode: dnsrr
      mode: global # Required by Docker Swarm to make published ports work

  # Workers (here it's not necessary to change the endpoint mode)
  worker:
    [...] # Extra config

推荐阅读