我有一个 4 GB 的文件,我试图通过分布式缓存在所有映射器之间共享。但我观察到地图任务尝试开始的显着延迟。具体来说,在我提交作业(通过 job.waitForCompletion())和第一个地图开始的时间之间存在明显的延迟。
我想知道在 DistributedCache 中有大文件的副作用。分布式缓存上的文件被复制了多少次?集群中的节点数量对此有什么影响吗?
(我的集群有大约 13 个节点在非常强大的机器上运行,每台机器能够托管近 10 个映射槽。)
谢谢
我有一个 4 GB 的文件,我试图通过分布式缓存在所有映射器之间共享。但我观察到地图任务尝试开始的显着延迟。具体来说,在我提交作业(通过 job.waitForCompletion())和第一个地图开始的时间之间存在明显的延迟。
我想知道在 DistributedCache 中有大文件的副作用。分布式缓存上的文件被复制了多少次?集群中的节点数量对此有什么影响吗?
(我的集群有大约 13 个节点在非常强大的机器上运行,每台机器能够托管近 10 个映射槽。)
谢谢
在这种情况下,“缓存”有点误导。您的 4 GB 文件将与 jars 和配置一起分发给每个任务。
对于大于 200mb 的文件,我通常将它们直接放入文件系统并将复制设置为比通常复制更高的值(在您的情况下,我会将其设置为 5-7)。您可以通过常用的 FS 命令直接从每个任务中的分布式文件系统中读取数据,例如:
FileSystem fs = FileSystem.get(config);
fs.open(new Path("/path/to/the/larger/file"));
这样既节省了集群空间,又不应该延迟任务的启动。但是,在非本地 HDFS 读取的情况下,它需要将数据流式传输到可能会占用大量带宽的任务。