我想知道是否有人能解释一下Hadoop中的分布式缓存是如何工作的。我多次运行一个作业,每次运行后,我注意到每个节点上的本地分布式缓存文件夹的大小都在增长。
有没有办法让多个作业重用分布式缓存中的同一文件?或者,分布式缓存是否仅在任何单个作业的生命周期内有效?
我感到困惑的原因是Hadoop文档提到"DistributedCache跟踪缓存文件的修改时间戳“,所以这让我相信,如果时间戳没有更改,那么它应该不需要重新缓存或将文件重新复制到节点。
我使用以下命令成功地将文件添加到分布式缓存:
DistributedCache.addFileToClassPath(hdfsPath, conf);
发布于 2013-08-31 17:10:50
DistributedCache使用引用计数来管理缓存。org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
负责清理引用计数为0的CacheDirs。每分钟检查一次(默认周期为1分钟,可按"mapreduce.tasktracker.distributedcache.checkperiod").设置
当作业完成或失败时,JobTracker将向TaskTrackers发送org.apache.hadoop.mapred.KillJobAction
。然后,如果TaskTracker接收到KillJobAction,它会将操作放入tasksToCleanup。在TaskTracker中,有一个名为taskCleanupThread的后台线程,它从tasksToCleanup执行操作并执行清理工作。对于作业,它将调用purgeJob来清理作业。在此方法中,它将减少此作业使用的引用计数(rjob.distCacheMgr.release();
)。
以上分析都是基于hadoop-core-2.0.0-mr1-cdh4.2.1-sources.jar
的。我还检查了hadoop-core-0.20.2-cdh3u1-sources.jar
,发现这两个版本之间有一点不同。例如,0.20.2-cdh3u1
中没有org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
。初始化作业时,TrackerDistributedCacheManager将检查是否有足够的空间来放置此作业的新缓存文件。如果不是,它将删除引用计数为0的缓存。
如果您使用的是cdh4.2.1,您可以增加"mapreduce.tasktracker.distributedcache.checkperiod“,让清理工作延迟。则多个作业使用相同分布式缓存的概率增加。
如果您使用的是cdh3u1,您可以增加缓存大小的限制(“local.cache.size”,默认为10G),caches("mapreduce.tasktracker.cache.local.numberdirectories",的最大目录数默认为10000)。这也可以应用于cdh4.2.1。
发布于 2013-08-31 19:53:28
如果你仔细观察什么是this book says,就会发现分布式缓存中可以存储的内容是有限制的。默认情况下是10 By (可配置)。群集中可以同时运行多个不同的作业。此外,Hadoop在某种程度上保证了单个作业的文件在缓存中保持可用,因为它是由任务跟踪器为访问缓存中的文件的不同任务进行的引用计数来维护的。在您的情况下,对于后续作业,这些文件可能不存在,因为它们已经标记为要删除。
如果你在任何地方不同意,请纠正我。我很乐意进一步讨论这个问题。
发布于 2014-08-11 22:16:34
根据这个:http://www.datasalt.com/2011/05/handling-dependencies-and-configuration-in-java-hadoop-projects-efficiently/
您应该能够通过DistributedCache API而不是"-libjars“来实现这一点。
https://stackoverflow.com/questions/18538280
复制相似问题