在Hadoop MapReduce应用程序中,从其他文件系统中访问文件以及HDFS文件



我知道我们可以从普通的Java应用程序中调用MAP-REDUCE作业。现在,在我的情况下,MAP-REDUCE作业必须处理HDFS上的文件以及其他文件系统上的文件。在Hadoop中,我们可以同时使用HDFS上的文件时从其他文件系统访问文件。这可能吗?

基本上我的意图是我有一个大文件,我想将其放入HDFS以进行并行计算,然后将该文件的块与其他一些文件进行比较(我不想将其放入HDFS COZ中,要一次作为全长文件访问。

就像其他任何任务一样,应该可以从映射器/还原任务访问非HDFS文件系统。要注意的一件事是,如果有1k映射器,并且每个映射器都会尝试打开非HDFS文件,则可能会根据外部文件系统的类型导致瓶颈。同样适用于映射器从数据库中摘下数据。

您可以使用分布式缓存将文件分配给您的映射器,他们可以打开并在其configure()方法中读取文件(不要在map()中读取它们,因为它将被称为许多时间。)

编辑

为了从地图中的本地文件系统访问文件减少作业,您可以在设置作业配置时将这些文件添加到分布式缓存中。

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.
}

完成工作后删除文件。

最新更新