0

Amazon Elastic MapReduce 시스템에서 hadoop 프로그램을 실행하려고합니다. 내 프로그램은 프로그램을 실행하는 데 필요한 매개 변수가 들어있는 로컬 파일 시스템의 입력 파일을 사용합니다. 그러나 파일이 정상적으로 로컬 파일 시스템에서 FileInputStream으로 읽혀지기 때문에 AWS 환경에서 매개 변수 파일을 찾을 수 없다는 오류가 발생하면 작업이 실패합니다. 이미 Amazon S3에 파일을 업로드했음을 유의하십시오. 이 문제를 어떻게 해결할 수 있습니까? 감사. 아래는 내가 공용 미터 파일을 읽고 결과적으로 파일의 매개 변수를 읽는 데 사용하는 코드입니다. 로컬 파일 시스템에서 파일을 읽을해야하는 경우Amazon Elastic MapReduce 및 S3의 매개 변수 파일에서 읽기

FileInputStream fstream = new FileInputStream(path); 
      FileInputStream os = new FileInputStream(fstream); 
      DataInputStream datain = new DataInputStream(os); 
      BufferedReader br = new BufferedReader(new InputStreamReader(datain)); 

      String[] args = new String[7]; 

      int i = 0; 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
       args[i++] = strLine; 
      } 
+2

당신이 무슨 짓을 드디어? – Amar

+0

DataInputStream을 사용하여 텍스트를 읽지 마십시오. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

답변

1

, 당신은 boostrap action 실행하기 위해 EMR 작업을 구성 할 수 있습니다. 이 작업을 수행하려면 s3cmd 또는 유사 항목을 사용하여 S3에서 로컬 파일로 파일을 복사하기 만하면됩니다.

또한 Hadoop FileSystem 클래스를 통해 파일을 읽을 수 있습니다. EMR이 이와 같은 직접 액세스를 지원한다고 확신하기 때문에 파일을 읽을 수 있습니다. 예 :

FileSystem fs = FileSystem.get(new URI("s3://my.bucket.name/"), conf); 
DataInputStream in = fs.open(new Path("/my/parameter/file")); 
0

Amazon Elastic은 아직 시도하지 않았지만 분산 캐시의 전형적인 응용 프로그램처럼 보입니다. -files 옵션 (Tool/ToolRunner을 구현하는 경우) 또는 job.addCacheFile(URI uri) 메서드를 사용하여 파일 할 캐시를 추가하고 로컬로 존재하는 것처럼 액세스하십시오. 다음과 같이

0

당신은 분산 캐시에이 파일을 추가 할 수 있습니다

... 
String s3FilePath = args[0]; 
DistributedCache.addCacheFile(new URI(s3FilePath), conf); 
... 

나중에 구성에서() 당신의 매퍼/감속기, 당신은 다음을 수행 할 수 있습니다

... 
Path s3FilePath; 
@Override 
public void configure(JobConf job) { 
s3FilePath = DistributedCache.getLocalCacheFiles(job)[0]; 
FileInputStream fstream = new FileInputStream(s3FilePath.toString()); 
... 
} 
+0

답변 해 주셔서 감사합니다. 하지만 DistributedCache를 사용할 필요는 없습니다. 필자는 파일의 매개 변수를 읽은 다음 MapReduce 작업을 실행하기 만하면됩니다. – Ahmedov

+0

그런 다음 어떻게하셨습니까? – Amar