2012-12-06 3 views
8

Je veux utiliser le cache distribué pour permettre à mes cartographes d'accéder aux données. En principal, j'utilise la commandeaccès aux fichiers dans le cache distribué Hadoop

DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

Où/user/Peter/cachefile/testCache1 est un fichier qui existe dans HDFS

Ensuite, ma fonction de configuration ressemble à ceci:

public void setup(Context context) throws IOException, InterruptedException{ 
    Configuration conf = context.getConfiguration(); 
    Path[] localFiles = DistributedCache.getLocalCacheFiles(conf); 
    //etc 
} 

Cependant, ce tableau LocalFiles est toujours nulle.

je courais d'abord sur un cluster hôte unique pour les tests, mais je lis que cela empêchera le cache distribué de travailler. J'ai essayé avec un pseudo-distribué, mais cela ne fonctionne pas non plus

J'utilise Hadoop 1.0.3

grâce Peter

+0

double possible de [Fichiers pas correctement mis en cache distribué] (http://stackoverflow.com/questions/12708947/ fichiers-pas-mettre-correctement-dans-distribué-cache) – kabuko

Répondre

35

problème ici est que je faisais ce qui suit:

Configuration conf = new Configuration(); 
Job job = new Job(conf, "wordcount"); 
DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

Depuis le constructeur d'emploi fait une copie interne de l'instance de conf, en ajoutant le fichier cache ne pas les choses après affecte. Au lieu de cela, je devrais faire ceci:

Configuration conf = new Configuration(); 
DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 
Job job = new Job(conf, "wordcount"); 

Et maintenant cela fonctionne. Merci à Harsh sur hadoop liste d'utilisateurs pour l'aide.

+0

Harsh est en effet une aubaine! .. Wasted un certain nombre d'heures avec le même. Merci! – Shatu

11
Configuration conf = new Configuration(); 
Job job = new Job(conf, "wordcount"); 
DistributedCache.addCacheFile(new URI("/userpetercacheFiletestCache1"),job.getConfiguration()); 

Vous pouvez également le faire de cette façon.

4

Une fois que le travail est affecté à un objet de configuration, -à-dire Configuration conf = new Configuration();

Job job = new Job(conf, "wordcount"); 

Et si beaucoup avec des attributs de conf comme indiqué ci-dessous, par exemple

conf.set("demiliter","|"); 

ou

DistributedCache.addCacheFile(new URI("/user/peter/cacheFile/testCache1"), conf); 

de tels changements ne seraient pas pris en compte dans un pseudo cluste r ou cluster comment jamais cela fonctionnerait avec l'environnement local.

2

Cette version du code (ce qui est légèrement différent des constructions mentionnées ci-dessus) a toujours travaillé pour moi.

//in main(String [] args) 
Job job = new Job(conf,"Word Count"); 
... 
DistributedCache.addCacheFile(new URI(/user/peter/cacheFile/testCache1), job.getConfiguration()); 

Je na pas voir la fonction configuration complète() dans le code Mapper

public void setup(Context context) throws IOException, InterruptedException { 

    Configuration conf = context.getConfiguration(); 
    FileSystem fs = FileSystem.getLocal(conf); 

    Path[] dataFile = DistributedCache.getLocalCacheFiles(conf); 

    // [0] because we added just one file. 
    BufferedReader cacheReader = new BufferedReader(new InputStreamReader(fs.open(dataFile[0]))); 
    // now one can use BufferedReader's readLine() to read data 

} 
+0

Merci @Somum, cela a fonctionné pour moi. J'ai vérifié avec hadoop 1.2.1 –

Questions connexes