我的map任务需要一些配置数据,我希望通过分布式缓存分发这些数据。
hadoop mapreduce教程展示了distributedcache类的用法,大致如下所示:
// In the driver
JobConf conf = new JobConf(getConf(), WordCount.class);
...
DistributedCache.addCacheFile(new Path(filename).toUri(), conf);
// In the mapper
Path[] myCacheFiles = DistributedCache.getLocalCacheFiles(job);
...
然而, DistributedCache
在hadoop 2.2.0中标记为已弃用。
实现这一目标的首选新方法是什么?是否有一个最新的例子或教程介绍这个api?
6条答案
按热度按时间bvjxkvbb1#
要扩展@jtravaglini,使用
DistributedCache
对于Yarn/mapreduce 2,如下所示:在驱动程序中,使用
Job.addCacheFile()
```public int run(String[] args) throws Exception {
Configuration conf = getConf();
}
@Override
protected void setup(
Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
if (context.getCacheFiles() != null
&& context.getCacheFiles().length > 0) {
}
f45qwnt82#
分布式缓存的api可以在作业类本身中找到。请在此处查看文档:http://hadoop.apache.org/docs/stable2/api/org/apache/hadoop/mapreduce/job.html 代码应该是
在Map程序代码中:
relj7zay3#
上面提到的解决方案都不完全适合我。可能是因为hadoop版本一直在变化,所以我使用的是hadoop2.6.4。实际上,distributedcache是不推荐使用的,所以我不想使用它。然而,正如一些帖子建议我们使用addcachefile()一样,它有了一些变化。这就是它对我的作用
这里x.x.x.x可以是主ip地址或本地主机。englishstop.txt存储在hdfs的/location中。
输出为
有趣但方便的是,#englishstop.txt意味着现在我们可以在mapper中以“englishstop.txt”的形式访问它。这是相同的代码
这对我来说很管用。您可以从hdfs中存储的文件中读取行
rnmwe5a24#
我也有同样的问题。不仅distributedcach被弃用,getlocalcachefiles和“newjob”也被弃用。因此,对我起作用的是:
司机:
在mapper/reducer设置中:
yv5phkfx5#
我没有使用job.addcachefile()。相反,我像以前一样使用了-files选项,比如“-files/path/to/myfile.txt#myfile”。然后在mapper或reducer代码中使用以下方法:
然后在mapper/reducer中:
请注意,如果我直接使用“-files/path/to/myfile.txt”,那么我需要使用“myfile.txt”来访问该文件,因为这是默认的符号链接名称。
z0qdvdin6#
用于yarn/mr2的新distributedcacheapi在
org.apache.hadoop.mapreduce.Job
班级。不幸的是,到目前为止,还没有很多综合教程风格的例子。
http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/job.html#addcachefile%28java.net.uri%29