hadoop - Docker Swarm 上的 Hadoop 访问 DataNode 的问题
问题描述
我目前正在四台机器上设置一个 Hadoop 集群。我有一个名称节点和四个数据节点正在运行,它们通过 docker swarm 覆盖网络进行通信。
现在来解决问题:当尝试从名称节点外部写入 HDFS 时,会委托给数据节点,因此 HDFS 客户端会尝试访问这些节点。但是 namenode 提供的数据节点的地址来自 docker swarm 覆盖网络的接口(在我的情况下为 10.0.7.0/24),因此无法从外部访问它们。
有没有办法让名称节点返回可从外部访问的数据节点的地址?例如,使用运行数据节点的服务器的公共 IP?
提前致谢!
解决方案
覆盖网络(默认)中的VIP模式似乎是一个问题,显然,由于具有负载平衡的覆盖网络行为(源) ,使得主节点的主机名指向另一个 IP 而不是相应的 IP 。
阅读网络文档中的这一部分,我已经解决了将路由网格更改endpoint_mode
为dnsrr
阻止路由网格的问题。
请注意,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
推荐阅读
- postgresql - 如何在 Postgres 中实现 PRAGMA EXCEPTION_INIT?
- java - Spring Boot & Postgres:关系“sub_comment”不存在
- java - 如何根据节点的数量对一组节点进行加权除法
- python - T-SNE 内存错误
- postgresql - Azure Database for PostgreSQL 基本计划和调试
- r - 将 R Shiny 部署到 IBM Cloud 服务器
- perl - 如何在 perl 中验证多维散列的值?
- javascript - 关于 JavaScript 中包含的 String 方法?
- neo4j - Neo4j APOC 验证触发器已存在
- angular - 如何以编程方式将引导弹出窗口添加到 Angular 中的 html 元素