복붙노트

[HADOOP] hadoop map reduce-아카이브의 압축을 풀지 않는 아카이브

HADOOP

hadoop map reduce-아카이브의 압축을 풀지 않는 아카이브

당신이 나를 도울 수 있기를 바랍니다. hadoop map-reduce와 관련하여 헤드 스크래칭 문제가 있습니다. hadoop 버전 1.0.3의 맵 축소에서 "-files"옵션을 성공적으로 사용하고 있습니다. 그러나 "아카이브"옵션을 사용하면 파일이 복사되지만 압축이 풀리지 않습니다. 내가 무엇을 놓치고 있습니까? 문서에는 "아카이브 (zip, tar 및 tgz / tar.gz 파일)가 슬레이브 노드에 보관되지 않습니다"라고 나와 있지만 이것이 내가보고있는 것은 아닙니다.

텍스트 파일 "alice.txt", 압축 파일 "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

그런 다음 문제가있는 파일의 존재에 대해 매퍼 테스트를 수행합니다. 여기서 'lineNumber'는 매퍼에 전달 된 키입니다.

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);
}

구아바 'Joiner'클래스 사용 매퍼의 출력 값은 다음과 같습니다.

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

따라서 아카이브 파일이 있지만 압축이 풀리지 않은 문제가 있습니다. 내가 무엇을 놓치고 있습니까? -archives를 사용하는 대신 DistributedCache.addCacheArchive ()를 사용해 보았지만 여전히 문제가 있습니다.

해결법

  1. ==============================

    1.분산 캐시는 아카이브 파일을 작업의 로컬 작업 디렉토리에 압축 해제하지 않습니다. 각 작업 추적기에는 전체 작업 위치가 있으며 압축이 풀립니다.

    분산 캐시는 아카이브 파일을 작업의 로컬 작업 디렉토리에 압축 해제하지 않습니다. 각 작업 추적기에는 전체 작업 위치가 있으며 압축이 풀립니다.

    이 위치를 찾고 해당 파일을 찾으려면 DistributedCache를 확인해야합니다. DistributedCache 용 Javadocs는이 정보를 가져 오는 맵퍼 예제를 보여줍니다.

    -files 및 -archives 일반 옵션을 정의 할 때 심볼릭 링크를 사용할 수 있으며 맵의 로컬 작업 디렉토리에 심볼릭 링크가 만들어지고 작업이 더 쉬워집니다.

    hadoop jar myJar myClass -files ./etc/alice.txt#file1.txt \
        -archives ./etc/bob.zip#bob,./etc/claire.tar#claire
    

    그런 다음 아카이브에서 파일을 열려고 할 때 매퍼에서 조각 이름을 사용할 수 있습니다.

    new File("bob").isDirectory() == true
    
  2. from https://stackoverflow.com/questions/18343371/hadoop-map-reduce-archives-not-unpacking-archives by cc-by-sa and MIT license