希望你能帮助我。hadoop map reduce让我头疼。在hadoop版本1.0.3中,我已经在map reduce上成功地使用了“-files”选项。但是,当我使用“-archives”选项时,它会复制文件,但不会解压缩它们。我错过了什么?文档中说“归档文件(zip、tar和tgz/tar.gz文件)在从属节点上是未归档的”,但这不是我看到的。
我已经创建了3个文件:文本文件“alice.txt”,zip文件“bob.zip”(包含b1.txt和bdir/b2.txt),tar文件“claire.tar”(包含c1.txt和cdir/c2.txt)。然后通过调用hadoop作业
hadoop jar myJar myClass -files ./etc/alice.txt -archives ./etc/bob.zip,./etc/claire.tar <input_path> <output_path>
文件确实存在,而且格式良好:
% ls -l etc/alice.txt etc/bob.zip etc/claire.tar
-rw-rw-r-- 1 hadoop hadoop 6 Aug 20 18:44 etc/alice.txt
-rw-rw-r-- 1 hadoop hadoop 282 Aug 20 18:44 etc/bob.zip
-rw-rw-r-- 1 hadoop hadoop 10240 Aug 20 18:44 etc/claire.tar
% tar tf etc/claire.tar
c1.txt
cdir/c2.txt
然后,我对存在问题的文件进行Map器测试,例如,其中“linenumber”是传递到Map器的键:
String key = Long.toString(lineNumber.get());
String [] files = {
"alice.txt",
"bob.zip",
"claire.tar",
"bdir",
"cdir",
"b1.txt",
"b2.txt",
"bdir/b2.txt",
"c1.txt",
"c2.txt",
"cdir/c2.txt"
};
String fName = files[ (int) (lineNumber.get() % files.length)];
String val = codeFile(fName);
output.collect(new Text(key), new Text(val));
支持例程“codefile”是:
private String codeFile(String fName) {
Vector<String> clauses = new Vector<String>();
clauses.add(fName);
File f = new File(fName);
if (!f.exists()) {
clauses.add("nonexistent");
} else {
if (f.canRead()) clauses.add("readable");
if (f.canWrite()) clauses.add("writable");
if (f.canExecute()) clauses.add("executable");
if (f.isDirectory()) clauses.add("dir");
if (f.isFile()) clauses.add("file");
}
return Joiner.on(',').join(clauses);
}
使用Guava'乔伊纳'类。Map器的输出值如下所示:
alice.txt,readable,writable,executable,file
bob.zip,readable,writable,executable,dir
claire.tar,readable,writable,executable,dir
bdir,nonexistent
b1.txt,nonexistent
b2.txt,nonexistent
bdir/b2.txt,nonexistent
cdir,nonexistent
c1.txt,nonexistent
c2.txt,nonexistent
cdir/c2.txt,nonexistent
所以你看到了问题-存档文件在那里,但它们没有被解包。我错过了什么?我也尝试过使用distributedcache.addcachearchive()而不是使用-archives,但问题仍然存在。
1条答案
按热度按时间h5qlskok1#
分布式缓存不会将存档文件解压到任务的本地工作目录中—每个任务跟踪器上都有一个位置作为作业的整体,并且在那里解压。
您需要检查distributedcache以找到此位置并在那里查找文件。distributedcache的javadocs展示了一个获取这些信息的Map器示例。
在定义-files和-archives常规选项时,可以使用符号链接,并且将在map/reduce任务的本地工作目录中创建一个符号链接,从而简化此操作:
然后,在尝试打开存档中的文件时,可以使用Map器中的片段名称: