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

Posted

技术标签:

【中文标题】目录是不是由 Hadoop 缓存符号链接处理?【英文标题】: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 缓存中?

【问题讨论】:

【参考方案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)。

以上是关于目录是不是由 Hadoop 缓存符号链接处理?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:使用“fs”迭代目录时检查文件是不是为符号链接

如何将符号链接视为Mercurial中的目录?

ios - 找到不支持的资源(不是目录,文件或符号链接) - xcode 7.2

Keras ImageDataGenerator 不处理符号链接文件

如何检查文件是不是是Python中的符号链接?

更改 mingw 的启动目录或创建 mingw 符号链接