docker - 在 Docker Swarm 上部署 Spark 和 HDFS 不会启用数据本地化
问题描述
我正在尝试使用 Docker Swarm 作为堆栈部署在小型集群上设置 Spark + HDFS 部署。我让它通常可以工作,但我遇到了一个问题,它阻止了 Spark 利用数据局部性。
为了启用数据局部性,我在每台服务器上创建了一个“工作节点”容器,其中包含 Spark 工作程序和 HDFS 数据节点。这里的想法是,它们应该在堆栈的覆盖网络上具有相同的 IP 地址,因为它们在同一个容器中运行。但是,他们没有。看起来容器在覆盖网络上获得了一个 VIP,而在堆栈使用的 compose 文件中定义的服务获得了另一个 VIP。
事实证明,HDFS 数据节点进程绑定到容器 VIP,Spark 工作进程绑定到服务的 VIP(据我所知)。因此,Spark 并不知道 Spark worker 和 HDFS datanode 实际上在同一台机器上,并且只调度具有ANY
局部性的任务。
我确定我错过了一些东西,但我(当然)不知道是什么。
我用于定义每个工作节点服务的 Docker 堆栈组合文件条目如下所示:
version: '3.4'
services:
...
worker-node2:
image: master:5000/spark-hdfs-node:latest
hostname: "worker-node2"
networks:
- cluster_network
environment:
- SPARK_PUBLIC_DNS=10.1.1.1
- SPARK_LOG_DIR=/data/spark/logs
depends_on:
- hdfs-namenode
volumes:
- type: bind
source: /mnt/data/hdfs
target: /data/hdfs
- type: bind
source: /mnt/data/spark
target: /data/spark
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.hostname == slave1
resources:
limits:
memory: 56g
...
networks:
cluster_network:
attachable: true
ipam:
driver: default
config:
- subnet: 10.20.30.0/24
HadoopHDFS-site.xml
配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hdfs/datanode</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hdfs/namenode</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>The default replication factor of files on HDFS</description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.block.size</name>
<value>64m</value>
<description>The default block size in bytes of data saved to HDFS</description>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.use.datanode.hostname</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.rpc-bind-host</name>
<value>0.0.0.0</value>
<description>
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
</description>
</property>
<property>
<name>dfs.namenode.servicerpc-bind-host</name>
<value>0.0.0.0</value>
<description>
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
</description>
</property>
<property>
<name>dfs.namenode.http-bind-host</name>
<value>0.0.0.0</value>
<description>
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
</description>
</property>
<property>
<name>dfs.namenode.https-bind-host</name>
<value>0.0.0.0</value>
<description>
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
</description>
</property>
</configuration>
我的完整设置可以在 GitHub 上查看。
有谁知道我做错了什么,阻止同一个 Docker 容器中的 Spark 工作程序和 HDFS 数据节点进程绑定到同一个 IP 地址?
解决方案
它是否与 this 的使用有关:
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
如果我是正确的,使用主机名意味着绑定到容器而不是服务本身。
推荐阅读
- xamarin - 对 Microsoft Visual Studio Xamarin IOS 的 Chilkat 支持
- python - 绘制平均索引条形图?
- python - 删除查询集中的重复项
- python - 应在至少 2 个输入的列表上调用“连接”层
- html - 角度材料 2 表 - 使用 TemplateRef 和 ngTemplateOutlet 定义列
- python - 安装 Matplotlib:命令“python setup.py egg_info”失败,错误代码为 1(建议的解决方案不起作用)
- javascript - 可以改变引导类的方向吗?
- c# - SelectElement 对象在 Selenium C# 中返回 null
- wordpress - 如何更改自定义 WordPress 永久链接?
- spring-boot - 消息选择器骆驼的动态值