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



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

  • 在分布式模式下工作良好
  • 本地模式失败
  • Javadoc/documentation非常稀疏,什么也没说
<标题>短版

我希望DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf)使/tmp/myfile在当前工作目录下以foo/bar的名称可用。

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

<标题> 详细需求

我想添加一个或几个Avro SortedKeyValueFile到Hadoop分布式缓存。

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

如果我希望能够在分布式缓存中放置至少两个这样的"文件",我不能将这些文件平铺到根目录中。我必须保留/定义一个文件层次结构。

安装:Hadoop 2.6.0/CDH 5.4/Crunch。因为我正在使用Crunch,所以我必须使用已弃用的DistributedCache API,因为Job.addCachefile()没有暴露。

待回答的问题

  • 这是一个bug在本地模式或我滥用分布式缓存?
  • 如何将MapFileSortedKeyValueFile推送到Hadoop缓存中?

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

本地模式下不支持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);

最新更新