我想知道是否有人能解释分布式缓存在hadoop中是如何工作的。我多次运行一个作业,每次运行之后,我注意到每个节点上的本地分布式缓存文件夹的大小都在增长。
有没有办法让多个作业重用分布式缓存中的同一个文件?或者分布式缓存只对任何单个作业的生存期有效?
我感到困惑的原因是hadoop文档提到“distributedcache跟踪缓存文件的修改时间戳”,因此我认为如果时间戳没有改变,那么就不需要重新缓存或将文件复制到节点。
我正在使用以下方法将文件成功添加到分布式缓存:
DistributedCache.addFileToClassPath(hdfsPath, conf);
3条答案
按热度按时间abithluo1#
distributedcache使用引用计数来管理缓存。
org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
负责清理引用计数为0的cachedir。它将每分钟检查一次(默认时间段为1分钟,您可以通过“mapreduce.tasktracker.distributedcache.checkperiod”进行设置)。当作业完成或失败时,jobtracker将发送
org.apache.hadoop.mapred.KillJobAction
任务追踪者。然后,如果tasktracker收到killjobaction,它会将该操作放入taskstocleanup。在tasktracker中,有一个名为taskcleanupthread的后台线程,它从taskstocleanup执行操作并执行清理工作。对于killjobaction,它将调用purgejob来清理作业。在此方法中,它将减少此作业使用的引用计数(rjob.distCacheMgr.release();
).以上分析基于
hadoop-core-2.0.0-mr1-cdh4.2.1-sources.jar
. 我还检查了hadoop-core-0.20.2-cdh3u1-sources.jar
发现这两个版本有点不同。例如,没有org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
在0.20.2-cdh3u1
. 初始化作业时,trackerdistributedcachemanager将检查是否有足够的空间放置此作业的新缓存文件。否则,它将删除引用计数为0的缓存。如果您使用的是cdh4.2.1,那么可以增加“mapreduce.tasktracker.distributedcache.checkperiod”以使清理工作延迟。然后,多个作业使用同一分布式缓存的概率增加。
如果您使用的是cdh3u1,则可以增加缓存大小的限制(“local.cache.size”,默认值为10g)和缓存的最大目录数(“mapreduce.tasktracker.cache.local.numberdirectories”,默认值为10000)。这也适用于cdh4.2.1。
erhoui1w2#
如果仔细看看这本书的内容,就会发现分布式缓存中存储的内容是有限的。默认情况下是10gb(可配置)。群集中可以同时运行多个不同的作业。此外,hadoop在某种程度上保证了文件在缓存中对单个作业可用,因为它是由tasktracker为访问缓存中文件的不同任务执行的引用计数来维护的。在您的情况下,对于后续作业,文件可能不在那里,因为它们已经标记为删除。
如果你有任何不同意见,请纠正我。我很乐意进一步讨论这个问题。
lzfw57am3#
据此:http://www.datasalt.com/2011/05/handling-dependencies-and-configuration-in-java-hadoop-projects-efficiently/
您应该能够通过distributedcache api而不是“-libjars”来实现这一点