복붙노트

[HADOOP] hadoop 분산 캐시에서 파일 액세스하기

HADOOP

hadoop 분산 캐시에서 파일 액세스하기

내 맵퍼가 데이터에 액세스 할 수 있도록 분산 캐시를 사용하고 싶습니다. 주에서는, 나는 명령을 사용하고있다.

DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf);

여기서 / user / peter / cacheFile / testCache1은 hdfs에있는 파일입니다.

그런 다음, 내 설정 기능은 다음과 같습니다.

public void setup(Context context) throws IOException, InterruptedException{
    Configuration conf = context.getConfiguration();
    Path[] localFiles = DistributedCache.getLocalCacheFiles(conf);
    //etc
}

그러나이 localFiles 배열은 항상 null입니다.

처음에는 테스트를 위해 단일 호스트 클러스터에서 실행 중이었지만 분산 캐시가 작동하지 않도록 읽었습니다. 나는 pseudo-distributed로 시도했지만 그 중 하나는 작동하지 않았다.

나 hadoop 1.0.3을 사용하고있다.

감사 베드로

해결법

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

    1.문제는 내가 다음을하고 있다는 것이었다.

    문제는 내가 다음을하고 있다는 것이었다.

    Configuration conf = new Configuration();
    Job job = new Job(conf, "wordcount");
    DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf);
    

    Job 생성자가 conf 인스턴스의 내부 복사본을 만들기 때문에 나중에 캐시 파일을 추가해도 사안에 영향을 미치지 않습니다. 대신, 나는 이것을해야한다.

    Configuration conf = new Configuration();
    DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf);
    Job job = new Job(conf, "wordcount");
    

    그리고 이제 작동합니다. Harsh의 도움말에 대한 hadoop 사용자 목록에 감사드립니다.

  2. ==============================

    2.

    Configuration conf = new Configuration();  
    Job job = new Job(conf, "wordcount");
    DistributedCache.addCacheFile(new URI("/userpetercacheFiletestCache1"),job.getConfiguration());
    

    이 방법으로도 할 수 있습니다.

  3. ==============================

    3.작업이 구성 객체로 할당되면, 즉, 구성 conf = new Configuration ();

    작업이 구성 객체로 할당되면, 즉, 구성 conf = new Configuration ();

    Job job = new Job(conf, "wordcount");
    

    다음과 같이 conf의 속성을 처리하면

    conf.set("demiliter","|");
    

    또는

    DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf);
    

    이러한 변경 사항은 의사 클러스터 또는 클러스터에서 로컬 환경과 함께 작동하는 방식에 반영되지 않습니다.

  4. ==============================

    4.이 코드는 (위의 구문과 약간 다릅니다) 항상 저에게 도움이되었습니다.

    이 코드는 (위의 구문과 약간 다릅니다) 항상 저에게 도움이되었습니다.

    //in main(String [] args)
    Job job = new Job(conf,"Word Count"); 
    ...
    DistributedCache.addCacheFile(new URI(/user/peter/cacheFile/testCache1), job.getConfiguration());
    

    나는 Mapper 코드에서 완전한 setup () 함수를 보지 않았다.

    public void setup(Context context) throws IOException, InterruptedException {
    
        Configuration conf = context.getConfiguration();
        FileSystem fs = FileSystem.getLocal(conf);
    
        Path[] dataFile = DistributedCache.getLocalCacheFiles(conf);
    
        // [0] because we added just one file.
        BufferedReader cacheReader = new BufferedReader(new InputStreamReader(fs.open(dataFile[0])));
        // now one can use BufferedReader's readLine() to read data
    
    }
    
  5. from https://stackoverflow.com/questions/13746561/accessing-files-in-hadoop-distributed-cache by cc-by-sa and MIT license