복붙노트

[HADOOP] 파일이 분산 캐시에 올바르게 삽입되지 않음

HADOOP

파일이 분산 캐시에 올바르게 삽입되지 않음

다음 코드를 사용하여 분산 캐시에 파일을 추가하고 있습니다.

Configuration conf2 = new Configuration();      
job = new Job(conf2);
job.setJobName("Join with Cache");
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);

그런 다음 파일을 매퍼로 읽어들입니다.

protected void setup(Context context)throws IOException,InterruptedException{
Configuration conf = context.getConfiguration();

URI[] cacheFile = DistributedCache.getCacheFiles(conf);
FSDataInputStream in = FileSystem.get(conf).open(new Path(cacheFile[0].getPath()));
BufferedReader joinReader = new BufferedReader(new InputStreamReader(in));

String line;
        try {
              while ((line = joinReader.readLine()) != null) {
              s = line.toString().split("\t");
                  do stuff to s
                } finally {
                   joinReader.close();
                }

문제는 내가 한 줄만 읽었고 캐시에 넣은 파일이 아니라는 것입니다. 오히려 cm9vdA == 또는 base64의 루트입니다.

다른 사람이이 문제가 있거나 분산 캐시를 잘못 사용하는 방법을 확인하십시오. 나는 완전히 배포 된 Hadoop 0.20.2를 사용하고 있습니다.

해결법

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

    1.작업 구성의 일반적인 실수 :

    작업 구성의 일반적인 실수 :

    Configuration conf2 = new Configuration();      
    job = new Job(conf2);
    job.setJobName("Join with Cache");
    DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);
    

    Job 객체를 생성 한 후에는 Job이 Job 객체의 복사본을 생성 할 때 Configuration 객체를 되돌려 야하고, 작업을 생성 한 후에는 conf2에 값을 설정해도 작업 자체에는 아무런 영향을 미치지 않습니다. 이 시도:

    job = new Job(new Configuration());
    Configuration conf2 = job.getConfiguration();
    job.setJobName("Join with Cache");
    DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);
    

    또한 분산 캐시에있는 파일 수를 확인해야합니다. 아마도 하나 이상의 파일이 존재하며보고있는 값을 제공하는 임의의 파일을 여는 것입니다.

    필자는 symlinking을 사용하여 로컬 작업 디렉토리에서 알려진 이름으로 파일을 사용할 수있게 할 것을 제안합니다.

    DistributedCache.createSymlink(conf2);
    DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000#myfile"), conf2);
    
    // then in your mapper setup:
    BufferedReader joinReader = new BufferedReader(new FileInputStream("myfile"));
    
  2. from https://stackoverflow.com/questions/12708947/files-not-put-correctly-into-distributed-cache by cc-by-sa and MIT license