【问题标题】:Re-use files in Hadoop Distributed cache在 Hadoop 分布式缓存中重用文件
【发布时间】:2014-08-11 22:16:33
【问题描述】:

我想知道是否有人可以解释分布式缓存在 Hadoop 中的工作原理。我多次运行作业,每次运行后我注意到每个节点上的本地分布式缓存文件夹的大小都在增长。

有没有办法让多个作业重用分布式缓存中的同一个文件?还是分布式缓存仅在任何单个作业的生命周期内有效?

我感到困惑的原因是 Hadoop 文档提到“DistributedCache 跟踪缓存文件的修改时间戳”,所以这让我相信如果时间戳没有改变,那么它应该不需要重新缓存或重新复制文件到节点。

我正在使用以下方法成功地将文件添加到分布式缓存:

DistributedCache.addFileToClassPath(hdfsPath, conf);

【问题讨论】:

    标签: hadoop hdfs distributed-cache


    【解决方案1】:

    DistributedCache 使用引用计数来管理缓存。 org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread负责清理引用计数为0的CacheDirs,每分钟检查一次(默认为1分钟,可以通过“mapreduce.tasktracker.distributedcache.checkperiod”设置)。

    当 Job 完成或失败时,JobTracker 将向 TaskTracker 发送org.apache.hadoop.mapred.KillJobAction。然后,如果 TaskTracker 收到 KillJobAction,它会将操作放入 tasksToCleanup。在 TaskTracker 中,有一个名为 taskCleanupThread 的后台线程,它从 tasksToCleanup 中获取操作并执行清理工作。对于 KillJobAction,它将调用 purgeJob 来清理作业。在这种方法中,它将减少此 Job (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。当初始化一个 Job 时,TrackerDistributedCacheManager 会检查是否有足够的空间来放置这个 Job 的新缓存文件。如果没有,它将删除引用计数为0的缓存。

    如果你使用的是cdh4.2.1,你可以增加“mapreduce.tasktracker.distributedcache.checkperiod”来让清理工作延迟。那么多个 Job 使用同一个分布式缓存的概率就会增加。

    如果你使用的是cdh3u1,你可以增加缓存大小的限制(“local.cache.size”,默认为10G)和缓存的最大目录(“mapreduce.tasktracker.cache.local.numberdirectories”,默认值为 10000)。这也可以应用于 cdh4.2.1。

    【讨论】:

    • 不确定我是否理解这里的答案。如果您处于 2 个版本之间,例如 4.1.2,会发生什么情况?还是5.0.2?有没有可以看的例子?
    • @zsxwing 你能解释一下hadoop 0.20.2会发生什么吗?是在作业完成时删除文件,还是仅在缓存大小溢出时才删除文件?如果我在 HDFS 上获得 5GB 并且缓存设置为 10GB,会发生什么?我可以得到 DSQuotaExceededException 吗?
    【解决方案2】:

    如果您仔细查看this book says,会发现分布式缓存中可以存储的内容是有限制的。默认为 10GB(可配置)。集群中可以同时运行多个不同的作业。此外,Hadoop 可以保证文件在单个作业的缓存中保持可用,因为它是由 tasktracker 为访问缓存中文件的不同任务完成的引用计数来维护的。在您的情况下,对于后续作业,文件可能不存在,因为它们已被标记为删除。

    如果您在任何地方不同意,请纠正我。我很乐意进一步讨论这个问题。

    【讨论】:

    • 你能解释一下在 hadoop 0.20.2 的情况下会发生什么吗?是在作业完成时删除文件,还是仅在缓存大小溢出时才删除文件?如果我在 HDFS 上获得 5GB 并且缓存设置为 10GB,会发生什么?我可以得到 DSQuotaExceededException 吗?
    【解决方案3】:

    据此:http://www.datasalt.com/2011/05/handling-dependencies-and-configuration-in-java-hadoop-projects-efficiently/

    您应该能够通过 DistributedCache API 而不是“-libjars”来做到这一点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多