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.
E quale dovrebbe essere la firma di riduzione? –
@ DanielC.Sobral: questa è la mia domanda. – rampion