我正在尝试使用Docker Swarm作为堆栈部署在小型集群上设置Spark + HDFS部署。我可以正常使用它,但是遇到了一个问题,该问题阻止了Spark利用数据局部性。
为了启用数据局部性,我在每个服务器上都制作了一个单一的“工作节点”容器,该容器同时包含Spark工作程序和HDFS数据节点。这里的想法是,由于它们在同一容器中运行,因此它们在堆栈的覆盖网络上都应具有相同的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.
我的完整设置可以在GitHub上查看。
有谁知道我在做什么错,这是防止同一个Docker容器中的Spark worker和HDFS datanode进程绑定到相同的IP地址吗?