2013-08-20 3 views
3

espérons que vous pouvez m'aider. J'ai un problème de grattage avec hadoop map-reduce. J'ai utilisé l'option "-files" avec succès sur une map-reduce, avec hadoop version 1.0.3. Cependant, lorsque j'utilise l'option "-archives", il copie les fichiers, mais ne les décompresse pas. Qu'est-ce que je rate? La documentation dit "Archives (zip, tar and tgz/tar.gz files) are un-archived at the slave nodes"", mais ce n'est pas ce que je voiscarte hadoop réduire -archives ne pas déballer les archives

J'ai créé 3 fichiers - un fichier texte "alice.txt", un fichier zip "bob.zip" (contenant b1.txt et bdir/b2.txt) et un (contenant c1.txt « claire.tar » fichier tar et cdir/c2.txt). J'Invoquez ensuite le travail de Hadoop via

hadoop jar myJar myClass -files ./etc/alice.txt -archives ./etc/bob.zip,./etc/claire.tar <input_path> <output_path> 

les fichiers sont en effet là et bien formé :

% ls -l etc/alice.txt etc/bob.zip etc/claire.tar 
-rw-rw-r-- 1 hadoop hadoop  6 Aug 20 18:44 etc/alice.txt 
-rw-rw-r-- 1 hadoop hadoop 282 Aug 20 18:44 etc/bob.zip 
-rw-rw-r-- 1 hadoop hadoop 10240 Aug 20 18:44 etc/claire.tar 
% tar tf etc/claire.tar 
c1.txt 
cdir/c2.txt 

J'ai alors mon test de mappeur pour l'existence des fichiers en question, comme si, où « lineNumber » est le clé passée dans le mappeur:

String key = Long.toString(lineNumber.get()); 
String [] files = { 
    "alice.txt", 
    "bob.zip", 
    "claire.tar", 
    "bdir", 
    "cdir", 
    "b1.txt", 
    "b2.txt", 
    "bdir/b2.txt", 
    "c1.txt", 
    "c2.txt", 
    "cdir/c2.txt" 
}; 
String fName = files[ (int) (lineNumber.get() % files.length)]; 
String val = codeFile(fName); 
output.collect(new Text(key), new Text(val)); 

La routine support 'CodeFile' est:

private String codeFile(String fName) { 
    Vector<String> clauses = new Vector<String>(); 
    clauses.add(fName); 
    File f = new File(fName); 

    if (!f.exists()) { 
     clauses.add("nonexistent"); 
    } else { 
     if (f.canRead()) clauses.add("readable"); 
     if (f.canWrite()) clauses.add("writable"); 
     if (f.canExecute()) clauses.add("executable"); 
     if (f.isDirectory()) clauses.add("dir"); 
     if (f.isFile()) clauses.add("file"); 
    } 
    return Joiner.on(',').join(clauses); 
} 

En utilisant la classe 'Joiner la goyave. Les valeurs de sortie du regard mappeur comme ceci:

alice.txt,readable,writable,executable,file 
bob.zip,readable,writable,executable,dir 
claire.tar,readable,writable,executable,dir 
bdir,nonexistent 
b1.txt,nonexistent 
b2.txt,nonexistent 
bdir/b2.txt,nonexistent 
cdir,nonexistent 
c1.txt,nonexistent 
c2.txt,nonexistent 
cdir/c2.txt,nonexistent 

Vous voyez le problème - les fichiers d'archive sont là, mais ils ne sont pas déballés. Qu'est-ce que je rate? J'ai également essayé d'utiliser DistributedCache.addCacheArchive() au lieu d'utiliser -archives, mais le problème est toujours là.

Répondre

0

le cache distribué ne décompresse pas les fichiers d'archives dans le répertoire de travail local de votre tâche - il y a un emplacement sur chaque traqueur de tâche pour le travail dans son ensemble, et il est décompacté là.

Vous aurez besoin de vérifier le DistributedCache pour trouver cet emplacement et y rechercher les fichiers. Les Javadocs pour DistributedCache montrent un mappeur d'exemple tirant cette information.

Vous pouvez utiliser la liaison symbolique lors de la définition des -files et -Politique options génériques et un lien symbolique sera créé dans le répertoire de travail local de la carte/réduire les tâches de faciliter cette tâche:

hadoop jar myJar myClass -files ./etc/alice.txt#file1.txt \ 
    -archives ./etc/bob.zip#bob,./etc/claire.tar#claire 

Et vous pouvez utiliser les noms de fragments dans votre mappeur lorsque vous essayez d'ouvrir des fichiers dans l'archive:

new File("bob").isDirectory() == true 
+0

Merci beaucoup pour la réponse! J'ai de mauvaises nouvelles et de bonnes nouvelles à partager. Les mauvaises nouvelles - ce que vous suggérez n'a aucun effet - ni "bob" ni "claire" n'apparaissent dans le système de fichiers local. Les bonnes nouvelles - quand j'ai regardé de plus près le système de fichiers local, il _does_ décompresser bob.zip et claire.tar - dans DIRECTORIES nommé "bob.zip" et "claire.tar". En fait, le RÉPERTOIRE "bob.zip" contient le fichier "bob.zip", ainsi que "b1.txt" et "bdir/b2.txt" - de même, le répertoire "claire.tar" contient le fichier "claire" .tar ", ainsi que" c1.txt "et cdir/c2.txt. déroutant mais vrai. – user2701105

+1

Si j'avais regardé de plus près l'exemple dans http://hadoop.apache.org/docs/current/api/org/apache/hadoop/filecache/DistributedCache.html, il montre ceci: "Fichier f = nouveau fichier ("./map.zip/some/file/in/zip.txt"); " - Notez que "map.zip", le fichier zip, est décompressé dans un répertoire nommé map.zip. – user2701105