Hadoop 2.x 中的分布式缓存
Posted
技术标签:
【中文标题】Hadoop 2.x 中的分布式缓存【英文标题】:DistributedCache in Hadoop 2.x 【发布时间】:2013-12-10 15:08:47 【问题描述】:我在 Hadoop 2.x 新 API 中的 DistributedCache 中遇到问题,我发现有人正在解决这个问题,但它并没有解决我的问题 example
此解决方案不适用于我,因为我在尝试检索 DistributedCache 中的数据时遇到 NullPointerException
我的配置如下:
驱动程序
public int run(String[] arg) throws Exception
Configuration conf = this.getConf();
Job job= new Job(conf,"job Name");
...
job.addCacheFile(new URI(arg[1]);
设置
protected void setup(Context context)
throws IOException, InterruptedException
Configuration conf = context.getConfiguration();
URI[] cacheFiles = context.getCacheFiles();
BufferedReader dtardr = new BufferedReader(new FileReader(cacheFiles[0].toString()));
在这里,当它开始创建缓冲读取器时,它会抛出 NullPointerException,这是因为 context.getCacheFiles(); 总是返回 NULL。如何解决这个问题,缓存文件存储在哪里(HDFS,或本地文件系统)
【问题讨论】:
【参考方案1】:如果你在 Hadoop 中使用本地 JobRunner(非分布式模式,作为单个 Java 进程),则不会创建本地数据目录; getLocalCacheFiles() 或 getCacheFiles() 调用将返回一个空的结果集。你能确保你在分布式或伪分布式模式下运行你的作业吗?
Hadoop 框架会将分布式缓存中设置的文件复制到作业中每个任务的本地工作目录。 所有缓存文件都有副本,放置在每台工作机器的本地文件系统中。 (它们将位于 mapred.local.dir 的子目录中。)
您能否参考此link 以了解有关 DistributedCache 的更多信息。
【讨论】:
我在非分布式模式下使用 Hadoop 进行测试,我会将其移至完全分布式集群,我已阅读您发送给我的链接,但仍然无法弄清楚像 mapred.local.dir,据我了解,此配置需要在 hadoop-conf.xml 中设置。但是在 hadoop 2.x 中没有这样的文件,或者我应该将此配置添加到 core-site.xml (对吗?) Hi Mahmoud mapred.local.dir 属性包含在 Hadoop 1.x 中的 mapred-site.xml 中。该属性设置 MapReduce 存储中间数据文件的本地目录作业。在 hadoop 2.x 中,与旧名称相同的 peoperty 名称是 mapreduce.cluster.local.dir,它可以在 mapred-site.xml 本身中进行配置。您可以从以下链接:Hadoop Stable mapred-default.xml 你有一个工作示例的链接吗,我似乎误解了什么,原因仍然有 NullPointerException,但我认为你的解决方案是正确的 通过阅读link,我了解到如果您使用的是 Yarn,那么您可以使用您现在正在使用的 API。但是如果您在 MR1 中配置了集群,则必须使用旧的 Deprecated API。你可以这样试试吗。 看来我正在解决一个错误 (issues.apache.org/jira/browse/MAPREDUCE-5385) 我有 hadoop 2.1.0-beta 我会尝试更改版本以上是关于Hadoop 2.x 中的分布式缓存的主要内容,如果未能解决你的问题,请参考以下文章