使用Docker Swarm部署Hadoop时访问DataNodes出现问题

3

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

现在遇到的问题是: 当尝试从namenode外部写入HDFS时,namenode委托datanode执行操作。但是,namenode提供给HDFS客户端的datanode地址是来自docker swarm覆盖网络接口(在我的情况下是10.0.7.0/24),因此无法从外部访问。

是否有一种方法使namenode返回datanode地址,这些地址可以从外部访问?例如使用datanode所在服务器的公共IP地址?

提前感谢!

2个回答

1
似乎在覆盖网络(默认情况下)中使用VIP模式存在问题,这显然会导致主节点的主机名指向另一个IP而不是相应的IP,因为覆盖网络行为与负载均衡有关(source)。
阅读网络文档中的this section后,我通过将endpoint_mode更改为dnsrr来解决了问题,从而防止了路由网格。 请注意,dnsrr模式不支持ingress模式,因此您需要按照this section中所示指定所有端口的主机模式。请记住以下注意事项:
如果您希望在每个节点上运行多个服务任务(例如当您有5个节点但运行10个副本时),则不能指定静态目标端口。要么允许Docker分配随机的高端口(通过省略发布),要么确保仅在给定节点上运行服务的单个实例,方法是使用全局服务而不是复制服务,或使用放置约束条件。这就是为什么在部署时需要添加“mode: global”设置的原因。这是我准备在Docker Swarm中运行的最终“docker-compose.yml”文件。
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

您所说的“master”是指NameNode吗?而“workers”则是指DataNode吗?因为NameNode只需要被复制一次,而不是在所有节点上都需要。只有DataNode需要全局化。 - Snow
是的,正如你所说的一样! :) - Genarito
这段代码中的 mode:global 让我有些困惑。如果这是 namenode,那不应该是 replicated: 1 吗? - Snow
只是补充一下,使用 endpoint_mode: dnsrr 的解决方案对我有效 :) 唯一的区别是我不使用 namenode 的全局模式。 - Snow
mode: global 允许您在主机上公开一些端口,例如 8088 或 8080(Hadoop 和 Spark 的控制面板)。如果您不需要访问这些页面,则可以删除全局命名空间并使用 replicas: 1 - Genarito
我甚至可以在 replicas: 1 的情况下访问它们。我只需要添加 hostname 关键字,就可以正常工作了。 - Snow

0

我无法使用Swarm覆盖网络解决它,所以我切换到使用主机网络。之后,我配置了Hadoop使用namenode和resourcemanager的公共IP,然后它就可以工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接