Spark on Kubernetes与HDFS Pod共置时data locality是否生效?
Spark on Kubernetes 同节点部署 HDFS DataNode 时的数据本地性生效问题
该场景下 Spark 原生的数据本地性功能默认无法正常生效。
核心原因
- Spark 判断数据本地性的核心逻辑是对比数据块所在节点的 hostname/IP 与 Executor 进程所在节点的 hostname/IP,二者完全一致时才会判定为 NODE_LOCAL 级别的本地性,优先将任务调度到对应 Executor 上执行。
- Kubernetes 集群默认使用独立的 Pod 网络栈,Pod 的 hostname、IP 与所在宿主机的 hostname、IP 完全隔离:HDFS DataNode Pod 上报给 NameNode 的是自身 Pod 的网络地址,Spark Executor Pod 向 Driver 上报的也是自身 Pod 的网络地址,哪怕两个 Pod 部署在同一台宿主机上,二者上报的地址也完全不同,Spark Driver 会判定为数据和 Executor 不在同一节点,不会触发本地性调度。
可选适配方案
如果需要在该架构下实现数据本地性,可以通过以下两种方式修改配置实现,二者均需要结合集群实际网络架构测试验证后再上线:
- 方案1:为 HDFS DataNode Pod 和 Spark Executor Pod 同时配置
hostNetwork: true,让 Pod 直接复用宿主机的网络栈,此时二者上报的地址均为宿主机地址,可直接被 Spark 识别为同节点,触发本地性调度。该方案的弊端是会占用宿主机端口,存在端口冲突风险,仅适合小规模场景使用。 - 方案2:修改 HDFS DataNode 和 Spark 的配置,让二者上报地址时透传所在宿主机的 hostname/IP,而非 Pod 自身的地址。该方案不需要修改网络模式,但需要对 HDFS、Spark 的配置做自定义改造,适配成本较高。
内容的提问来源于stack exchange,提问作者JHI Star
相关产品推荐
相关产品推荐

