目录是不是由 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 分布式缓存中。
SortedKeyValueFile
s 类似于 Hadoop MapFile
s。它们实际上是一个由两个文件组成的目录:一个索引文件和一个数据文件。这两个文件必须有一个特定的名称(index
和data
)并且必须在同一个目录中。
如果我希望能够将这些“文件”中的至少两个放在分布式缓存中,我无法将文件展平到根目录中。我必须保留/定义文件层次结构。
设置:Hadoop 2.6.0 / CDH 5.4 / Crunch。因为我使用的是 Crunch,所以我必须使用已弃用的 DistributedCache
API,因为 Job.addCachefile()
没有公开。
有待回答的问题
是本地模式的错误还是我滥用了分布式缓存? 人们如何将MapFile
或 SortedKeyValueFile
之类的内容推送到 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”迭代目录时检查文件是不是为符号链接
ios - 找到不支持的资源(不是目录,文件或符号链接) - xcode 7.2