2012-03-25 3 views
7

Prima di saltare a giocare con Scoobi o Scrunch, ho pensato di provare a eseguire il porting di WordCount su scala (2.9.1) utilizzando solo i collegamenti java di Hadoop (0.20.1).Scala/Hadoop: specificare il contesto per il riduttore

In origine, ho avuto:

class Map extends Mapper[LongWritable, Text, Text, IntWritable] { 
    @throws[classOf[IOException]] 
    @throws[classOf[InterruptedException]] 
    def map(key : LongWritable, value : Text, context : Context) { 
    //... 

che ha compilato bene, ma mi ha dato un errore di runtime:

java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable 

Dopo aver cercato un po ', ho capito che era perché non ero' t definendo il metodo map corretto (dovrebbe essere stato eliminato dalla mancanza di override), quindi ho risolto il problema:

override def map(key : LongWritable, value : Text, 
    context : Mapper[LongWritable, Text, Text, IntWritable]#Context) { 

E voilà, nessun errore di runtime.

Ma poi ho guardato l'output del lavoro, e ho capito che il mio riduttore non stava funzionando.

Così ho guardato il mio riduttore, e notato la firma reduce avuto lo stesso problema come il mio mapper:

class Reduce extends Reducer[Text, IntWritable, Text, IntWritable] { 
    @throws[classOf[IOException]] 
    @throws[classOf[InterruptedException]] 
    def reduce(key : Text, value : Iterable[IntWritable], context : Context) { 
    //... 

Così ho indovinato l'identità reduce era in uso a causa della mancata corrispondenza.

Ma quando ho cercato di correggere la firma del reduce:

override def reduce(key: Text, values : Iterable[IntWritable], 
    context : Reducer[Text, IntWritable, Text, IntWritable]#Context) { 

ora ottenuto un errore di compilazione:

[ERROR] /path/to/src/main/scala/WordCount.scala:32: error: method reduce overrides nothing 
[INFO]  override def reduce(key: Text, values : Iterable[IntWritable], 

, quindi non sono sicuro di quello che sto facendo male.

+0

E quale dovrebbe essere la firma di riduzione? –

+0

@ DanielC.Sobral: questa è la mia domanda. – rampion

risposta

11

A prima vista, assicurarsi che i valori siano java.lang.Iterable, non scala Iterable. Importa java.lang.Iterable oppure:

override def reduce(key: Text, values : java.lang.Iterable[IntWritable], context : Reducer[Text, IntWritable, Text, IntWritable]#Context) 
+2

questo è esattamente giusto. vedere qui per un esempio: https://bitbucket.org/jasonbaldridge/fogbow/src/6c24fb2afda4/src/main/scala/fogbow/example/WordCount.scala – dhg