2012-12-06 20 views
8

Desidero utilizzare la cache distribuita per consentire ai miei mappatori di accedere ai dati. In main, sto usando il comandoAccesso ai file nella cache distribuita hadoop

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

Dove/user/Peter/CacheFile/testCache1 è un file che esiste in HDFS

Poi, la mia funzione di configurazione è simile al seguente:

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

Tuttavia, questo array localFiles è sempre nullo.

Inizialmente ero in esecuzione su un cluster host singolo per il test, ma ho letto che questo impedirà il funzionamento della cache distribuita. Ho provato con uno pseudo-distribuita, ma che non ha funzionato neanche

sto utilizzando Hadoop 1.0.3

grazie Peter

+0

possibile duplicato del [file non messo correttamente nella cache distribuita] (http://stackoverflow.com/questions/12708947/ files-not-put-correct-into-distributed-cache) – kabuko

risposta

35

problema qui era che stavo facendo la seguente:

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

Poiché il costruttore di lavoro esegue una copia interna dell'istanza conf, l'aggiunta del file di cache in seguito non influisce sulle cose. Invece, dovrei fare questo:

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

E ora funziona. Grazie a Harsh sulla lista degli utenti di hadoop per l'aiuto.

+0

Harsh è davvero una manna dal cielo! .. Ho perso un bel numero di ore con lo stesso. Grazie! – Shatu

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

Si può anche fare in questo modo.

4

Una volta che il lavoro è assegnato a un oggetto di configurazione, cioè Configuration conf = new Configuration();

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

E poi se accordo con attributi di conf come illustrato di seguito, per esempio

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

o

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

Tali modifiche non si rifletterebbero in uno pseudo cluste r o cluster come mai funzionerebbe con l'ambiente locale.

2

Questa versione di codice (che è leggermente diversa dai costrutti sopra menzionati) ha sempre funzionato per me.

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

non ho visto la funzione setup completo() nel codice 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

Grazie @Somum, ha funzionato per me. Ho controllato con hadoop 1.2.1 –

Problemi correlati