【问题标题】:Are directories handled by Hadoop cache symlinks?目录是否由 Hadoop 缓存符号链接处理?
【发布时间】:2015-10-07 15:44:51
【问题描述】:

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

  • 在分布式模式下运行良好
  • 在本地模式下失败
  • Javadoc / 文档非常稀少,对此只字不提

短版

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

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

详细要求

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

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

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

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

有待回答的问题

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

【问题讨论】:

    标签: java hadoop mapreduce distributed-cache


    【解决方案1】:

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

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

    人们如何将 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);
    

    【讨论】:

    • 1- 您可以在LocalDistributedCacheManager.setup() 中放置一个断点,以查看即使在本地模式下也配置了分布式缓存(可能是 Pig 限制?)。 2- 故意使用 SortedKeyValueFile,而不是使用内存中的集合。在每次尝试开始时,我都可以自己明确地将这两个文件复制到本地文件系统上。但它破坏了分布式缓存的有效性,并且需要额外的代码来清理本地混乱中的混乱。
    • 它没有办法处理这个问题而不是说它是一个限制。当我们在本地模式下运行作业时,它不会创建任何本地数据目录,因此没有缓存文件的位置。这就是文档(developer.yahoo.com/hadoop/tutorial/module5.html#auxdata)所说的“作为警告:如果您在 Hadoop 中使用本地 JobRunner(即,如果您在没有或为空的 hadoop-conf 的程序中调用 JobClient.runJob() 会发生什么情况。 xml 可访问),则不创建本地数据目录; getLocalCacheFiles() 调用将返回一组空结果。'
    • 确实,在本地模式下不会创建尝试目录。但是,分布式缓存有一段时间支持符号链接(必须在 MR1 上启用,在 MR2 上默认启用)。在当前目录中为每个文件创建一个符号链接。默认情况下,它与源文件同名;但是向 URI 添加一个片段允许您更改它(以及 AFAIU 它的相对路径)。在本地模式下,CWD 是您启动 JVM 的位置,bit.ly/1NnyyHc 创建符号链接。但是,分布式模式支持“#/foo/name”,但本地模式不支持(在 ln 之前需要一些 mkdir)。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2013-02-12
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多