我知道我们可以从普通的java应用程序中调用map-reduce作业。现在,我的情况下map-reduce作业必须处理hdfs上的文件以及其他文件系统上的文件。在hadoop中我们是否可以在使用hdfs上的文件的同时从其他文件系统访问文件。这可能吗?
所以基本上我的意图是我有一个大文件,我想把它放在HDFS中用于并行计算,然后比较这个文件的块和其他一些文件(我不想把它放在HDFS中,因为他们需要一次作为全长文件访问。
答案 0 :(得分:2)
应该可以像任何其他任务一样从mapper / reducer任务访问非HDFS文件系统。需要注意的一点是,如果有一个说1K映射器,并且每个都会尝试打开非HDFS文件,这可能会导致基于外部文件系统类型的瓶颈。同样适用于映射器也从数据库中提取数据。
答案 1 :(得分:1)
您可以使用distributed cache将文件分发给地图制作者,他们可以使用configure()
方法打开和阅读文件(不要在map()
中阅读它们,因为它会被多次打电话。)
修改强>
要从map reduce作业中的本地文件系统访问文件,可以在设置作业配置时将这些文件添加到分布式缓存中。
JobConf job = new JobConf();
DistributedCache.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"), job);
MapReduce框架将确保您的地图制作者可以访问这些文件。
public void configure(JobConf job) {
// Get the cached archives/files
Path[] localFiles = DistributedCache.getLocalCacheFiles(job);
// open, read and store for use in the map phase.
}
并在作业完成后删除文件。