Scala/Hoop:为Reducer指定上下文



在我开始玩Scoobi或Scrunch之前,我想我应该尝试仅使用Hadoop(0.20.1)的java绑定将WordCount移植到scala(2.9.1)。

最初,我有:

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

它编译得很好,但给了我一个运行时错误:

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

环顾四周后,我发现这是因为我没有定义正确的map方法(应该是由于缺少override而导致的),所以我将其固定为:

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

瞧,没有运行时错误。

但后来我看了看作业输出,意识到我的减速器没有运行。

所以我查看了我的reducer,注意到reduce签名和我的映射器有同样的问题:

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

所以我猜测身份reduce是因为不匹配而被使用的。

但当我试图更正reduce:的签名时

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

我现在得到了一个编译器错误:

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

所以我不确定我做错了什么。

首先,请确保值是java.lang.Iterable,而不是scala-Iterable。导入java.lang.Iterable,或:

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

相关内容

  • 没有找到相关文章

最新更新