作者:再见WhoWho | 来源:互联网 | 2023-08-29 10:39
我正在尝试使用Docker Swarm作为堆栈部署在小型集群上设置Spark + HDFS部署。我可以正常使用它,但是遇到一个阻止Spark利用数据局部性的问题。
为了启用数据局部性,我在每个服务器上都制作了一个单独的“ worker node”容器,该容器同时包含Spark worker和HDFS datanode。这里的想法是,由于它们在同一容器中运行,因此它们在堆栈的覆盖网络上都应具有相同的IP地址。但是,他们没有。看来容器在覆盖网络上获得了一个VIP,而堆栈使用的撰写文件中定义的服务又获得了另一个VIP。
事实证明,HDFS datanode进程绑定到容器VIP,Spark worker进程绑定到服务的VIP(据我所知)。结果,Spark不知道Spark工作者和HDFS数据节点实际上在同一台计算机上,仅调度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
Hadoop HDFS-site.xml
配置如下:
dfs.datanode.data.dir
/data/hdfs/datanode
dfs.namenode.name.dir
/data/hdfs/namenode
dfs.replication
2
The default replication factor of files on HDFS
dfs.webhdfs.enabled
true
dfs.block.size
64m
The default block size in bytes of data saved to HDFS
dfs.namenode.datanode.registration.ip-hostname-check
false
dfs.client.use.datanode.hostname
true
dfs.datanode.use.datanode.hostname
true
dfs.namenode.rpc-bind-host
0.0.0.0
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
dfs.namenode.servicerpc-bind-host
0.0.0.0
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
dfs.namenode.http-bind-host
0.0.0.0
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
dfs.namenode.https-bind-host
0.0.0.0
controls what IP address the NameNode binds to.
0.0.0.0 means all available.
我的完整设置可以为viewed here on GitHub。
有没有人知道我在做什么错,这会阻止同一Docker容器中的Spark worker和HDFS datanode进程绑定到同一IP地址?
是不是跟这个的使用有关:
dfs.client.use.datanode.hostname
true
如果我是对的,使用主机名意味着绑定到容器而不是服务本身。