目录是否由Hadoop缓存符号链接处理?

时间:2015-10-07 15:44:51

标签: java hadoop mapreduce distributed-cache

我试图弄清楚Hadoop缓存创建的符号链接是否支持目录。

  • 在分布式模式下运行良好
  • 以本地模式失败
  • Javadoc /文档非常稀疏,对此一无所知

短版

我希望DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf)在名为/tmp/myfile的当前工作目录中提供foo/bar

群集上一切正常,但在本地模式下失败。基本上,LocalDistributedCacheManager.setup尝试使用ln -s /tmp/myfile $cwd/foo/bar创建符号链接但从未创建foo

详细要求

我想在Hadoop分布式缓存中添加一个或多个Avro SortedKeyValueFile

SortedKeyValueFile与Hadoop MapFile类似。它们实际上是由两个文件组成的目录:索引文件和数据文件。这两个文件必须具有特定名称(indexdata),并且必须位于同一目录中。

如果我希望能够将至少两个“文件”放在分布式缓存中,我无法将文件压缩到根目录中。我必须保留/定义文件层次结构。

设置:Hadoop 2.6.0 / CDH 5.4 / Crunch。因为我正在使用Crunch,所以我必须使用已弃用的DistributedCache API,因为Job.addCachefile()未公开。

要回答的问题

  • 这是本地模式中的错误还是我滥用分布式缓存?
  • 人们如何将MapFileSortedKeyValueFile等内容推送到Hadoop缓存中?

1 个答案:

答案 0 :(得分:0)

这是本地模式中的错误还是我滥用分布式缓存?

  

本地模式不支持Distributedcache。它只能在伪分布式模式或集群模式下运行。

人们如何将MapFile或SortedKeyValueFile等内容推送到Hadoop缓存中?

  

您必须将所有内容放入文件并将其放入HDFS中   mapside从文件中读取它并将其放在hashmap中。

如何从分布式缓存中读取:

@Override
        protected void setup(Context context) throws IOException,InterruptedException
        {
            Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration());
            for(Path findlist:filelist)
            {
                if(findlist.getName().toString().trim().equals("mapmainfile.dat"))
                {

                    fetchvalue(findlist,context);
                }
            }

        }
        public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException
        {
            BufferedReader buff=new BufferedReader(new FileReader(realfile.toString()));
           //read the file and put it in hashMap
        }

将文件添加到分布式缓存中:

DistributedCache.addCacheFile(new URI("/user/hduser/test/mapmainfile.dat"),conf);