2012-10-03 3 views
4

나는 다음과 같은 코드를 사용하여 분산 캐시에 파일을 추가하고에 제대로 넣지 :파일은 분산 캐시

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를 완전히 사용하고 있습니다.

답변

14
작업 구성

일반적인 실수 :

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

당신이를 만든 후 당신이 당신의 작업 개체를 만들고,이 작업은 그것의 복사본을 만들면서 구성 객체를 철수해야하고, 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); 

또한 분산 캐시에있는 파일의 수를 확인해야합니다, 거기에 아마 더 이상 그리고 당신은 당신이보고있는 값을주고있다 임의의 파일을 여는 것입니다.

나는 로컬 작업 디렉토리에있는 파일을 사용할 수 있도록합니다 심볼릭 링크를 사용하여 알려진 이름으로 제안 :

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")); 
+0

좋은! 고맙습니다! 이제 완벽하게 작동합니다. – user1717071

관련 문제