2012-12-06 17 views
8

Ich möchte den verteilten Cache verwenden, damit meine Mapper auf Daten zugreifen können. Im Haupt verwende ich den BefehlZugriff auf Dateien im verteilten hadoop-Cache

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

Wo/user/Peter/cachefile/testCache1 eine Datei, die

dann in hdfs existiert, meine Setup-Funktion wie folgt aussieht:

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

Dieses LocalFiles-Array ist jedoch immer Null.

Ich lief zunächst auf einem Single-Host-Cluster zum Testen, aber ich lese, dass dies verhindert, dass der verteilte Cache funktioniert. Ich habe versucht, mit einem pseudo-verteilt, aber das ist nicht so oder

I hadoop 1.0.3

dank Peter

+0

möglich Duplikat siehe [Dateien nicht korrekt in verteilten Cache setzen] (http://stackoverflow.com/questions/12708947/ files-not-put-correct-in-verteilte-cache) – kabuko

Antwort

35

Problem hier war ich mit funktionierten, dass ich Sie folgendermaßen vorgehen:

Da der Job-Konstruktor eine interne Kopie der conf-Instanz erstellt, hat das Hinzufügen der Cache-Datei danach keine Auswirkungen. Stattdessen sollte ich das tun:

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

Und jetzt funktioniert es. Danke an Harsh auf hadoop user list für die Hilfe.

+0

Harsh ist in der Tat ein Geschenk des Himmels! .. verschwendet ziemlich viele Stunden mit dem gleichen. Danke! – Shatu

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

Sie können es auch auf diese Weise tun.

4

Sobald der Job mit einem Konfigurationsobjekt zugeordnet ist, dh Configuration conf = new Configuration();

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

Und dann mit Attributen von conf wenn viel wie unten dargestellt, zB

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

oder

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

Solche Änderungen würden sich nicht in einem Pseudocluster widerspiegeln oder Cluster, wie auch immer es mit der lokalen Umgebung funktionieren würde.

2

Diese Version des Codes (die sich etwas von den oben genannten Konstrukten unterscheidet) hat immer für mich funktioniert.

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

ich nicht die komplette Setup() Funktion in Mapper Code

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

Danke @Somum, es hat für mich funktioniert. Ich überprüfte mit Hadoop 1.2.1 –