0

我試圖在Amazon Elastic MapReduce系統中運行我的hadoop程序。我的程序從本地文件系統獲取輸入文件,其中包含程序運行所需的參數。但是,由於通常從FileInputStream的本地文件系統讀取該文件,因此在AWS環境中執行任務時失敗,並顯示找不到參數文件。請注意,我已將該文件上傳到Amazon S3。我該如何解決這個問題?謝謝。下面是我用來讀取參數文件的代碼,因此讀取文件中的參數。閱讀亞馬遜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

如果你必須閱讀從本地文件系統中的文件,你可以配置你的EMR的工作,與boostrap action運行。在該操作中,只需使用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