0

J'essaie d'exécuter mon programme hadoop dans le système Amazon Elastic MapReduce. Mon programme prend un fichier d'entrée du système de fichiers local qui contient les paramètres nécessaires pour le programme à exécuter. Toutefois, étant donné que le fichier est normalement lu à partir du système de fichiers local avec FileInputStream, la tâche échoue lorsqu'elle est exécutée dans l'environnement AWS avec une erreur indiquant que le fichier de paramètres n'a pas été trouvé. Notez que j'ai déjà téléchargé le fichier dans Amazon S3. Comment puis-je résoudre ce problème? Merci. Ci-dessous le code que j'utilise pour lire le fichier de paremeter et lire par conséquent les paramètres dans le fichier.Lecture dans un fichier de paramètres dans Amazon Elastic MapReduce et 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

Qu'est-ce que vous finalement faire? – Amar

+0

S'il vous plaît ne pas utiliser DataInputStream pour lire le texte http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

Répondre

1

Si vous devez lire le fichier à partir du système de fichiers local, vous pouvez configurer votre travail de DME pour fonctionner avec un boostrap action. Dans cette action, il suffit de copier le fichier de S3 dans un fichier local en utilisant s3cmd ou similaire.

Vous pouvez également parcourir la classe Hadoop FileSystem pour lire le fichier, car je suis certain que EMR prend en charge l'accès direct comme celui-ci. Par exemple:

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

Je n'ai pas encore essayé Amazon Elastic, mais cela ressemble à une application classique de cache distribué. Vous ajoutez le cache du fichier en utilisant l'option (si vous implémentez la méthode Tool/ToolRunner) ou la méthode job.addCacheFile(URI uri), et y accédez comme s'il existait localement.

0

Vous pouvez ajouter ce fichier dans le cache distribué comme suit:

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

Plus tard, dans configure() de votre Mapper/réducteur, vous pouvez effectuer les opérations suivantes:

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

Merci pour la réponse. Mais je n'ai pas besoin d'utiliser DistributedCache. J'ai juste besoin de lire les paramètres d'un fichier, puis commencer à exécuter mon travail MapReduce. – Ahmedov

+0

Comment l'avez-vous fait alors? – Amar

Questions connexes