【发布时间】:2022-01-02 23:49:15
【问题描述】:
重新审视 Spark on Kubernetes 的数据本地化问题:如果 Spark pod 与 HDFS 数据节点 pod 位于相同的节点上,那么数据本地化是否有效?
这里的问答环节:https://www.youtube.com/watch?v=5-4X3HylQQo 似乎表明它没有。
【问题讨论】:
标签: apache-spark hadoop kubernetes hdfs
重新审视 Spark on Kubernetes 的数据本地化问题:如果 Spark pod 与 HDFS 数据节点 pod 位于相同的节点上,那么数据本地化是否有效?
这里的问答环节:https://www.youtube.com/watch?v=5-4X3HylQQo 似乎表明它没有。
【问题讨论】:
标签: apache-spark hadoop kubernetes hdfs
局部性是 Kubernetes 上的 Spark 问题。如果 Kubernetes 提供者提供了解析数据在哪里以及 spark 节点应该在哪里运行所需的网络拓扑插件,则基本数据局部性确实有效。 并且您已经构建了 kubernetes 以包含 code here
有一种方法可以测试this data locality。为了完整起见,我在这里复制了它:
这是检查名称节点中的数据局部性是否有效的方法。
启动一个 HDFS 客户端 pod 并进入该 pod。
$ kubectl run -i --tty hadoop --image=uhopper/hadoop:2.7.2
--generator="run-pod/v1" --command -- /bin/bash
在 pod 中,在 HDFS 上创建一个简单的文本文件。
$ hadoop fs
-fs hdfs://hdfs-namenode-0.hdfs-namenode.default.svc.cluster.local
-cp file:/etc/hosts /hosts
将文件的副本数设置为集群节点数。这可确保在您的客户端 pod 正在运行的集群节点中存在该文件的副本。等待一段时间,直到发生这种情况。
`$ hadoop fs -setrep NUM-REPLICAS /hosts`
运行以下 hdfs cat 命令。从调试消息中,查看正在使用的数据节点。确保它是您的本地数据节点。 (您可以从 $ kubectl get pods hadoop -o json | grep hostIP 获取此信息。在 pod 外执行此操作)
$ hadoop --loglevel DEBUG fs
-fs hdfs://hdfs-namenode-0.hdfs-namenode.default.svc.cluster.local
-cat /hosts ... 17/04/24 20:51:28 DEBUG hdfs.DFSClient: Connecting to datanode 10.128.0.4:50010 ...
如果没有,您应该检查您的本地数据节点是否在上面的调试消息列表中。如果不是,那么这是因为步骤(3)还没有完成。再等等。 (如果可能,您可以使用较小的集群进行此测试)
`17/04/24 20:51:28 DEBUG hdfs.DFSClient: newInfo = LocatedBlocks{ fileLength=199 underConstruction=false blocks=[LocatedBlock{BP-347555225-10.128.0.2-1493066928989:blk_1073741825_1001; getBlockSize()=199; corrupt=false; offset=0; locs=[DatanodeInfoWithStorage[10.128.0.4:50010,DS-d2de9d29-6962-4435-a4b4-aadf4ea67e46,DISK], DatanodeInfoWithStorage[10.128.0.3:50010,DS-0728ffcf-f400-4919-86bf-af0f9af36685,DISK], DatanodeInfoWithStorage[10.128.0.2:50010,DS-3a881114-af08-47de-89cf-37dec051c5c2,DISK]]}] lastLocatedBlock=LocatedBlock{BP-347555225-10.128.0.2-1493066928989:blk_1073741825_1001;`
多次重复 hdfs cat 命令。检查是否始终使用相同的数据节点。
【讨论】: