scala akka wordcount程序

4 篇文章 1 订阅

Message.scala:

package com.hupu.dace.messages

sealed case class Result()

sealed case class WordCount(word: String, count: Int)

sealed case class MapData(data: List[WordCount])

sealed case class ReduceData(data: List[WordCount])


MasterActor:

package com.hupu.dace.actors

import akka.actor.{Actor, Props}
import com.hupu.dace.messages.Result

/**
 * Created by xiaojun on 2015/10/12.
 */
class MasterActor extends Actor {
  val aggregateActor = context.actorOf(Props[AggregateActor], name = "agg")
  val reduceActor = context.actorOf(Props(classOf[ReduceActor], aggregateActor), name = "reduce")
  val mapActor = context.actorOf(Props(classOf[MapActor], reduceActor), name = "map")

  override def receive: Receive = {
    case msg: String =>
      mapActor ! msg
    case Result() =>
      aggregateActor ! Result()
    case _ =>
  }
}


MapActor:

package com.hupu.dace.actors

import java.util.StringTokenizer

import akka.actor.{Actor, ActorRef}
import com.hupu.dace.messages.{MapData, WordCount}

import scala.collection.mutable.ArrayBuffer

/**
 * Created by xiaojun on 2015/10/12.
 */
class MapActor(reduceActor: ActorRef) extends Actor {


  override def receive: Receive = {
    case msg: String =>
      val mapData = getMapData(msg)
      reduceActor ! mapData
    case msg => unhandled(msg)
  }

  private def getMapData(msg: String): MapData = {

    val list = ArrayBuffer[WordCount]()
    val tokenizer: StringTokenizer = new StringTokenizer(msg)
    while (tokenizer.hasMoreTokens) {
      val word: String = tokenizer.nextToken.toLowerCase
      list += WordCount(word, 1)
    }
    MapData(list.toList)
  }


}

ReduceActor:

package com.hupu.dace.actors

import akka.actor.{Actor, ActorRef}
import com.hupu.dace.messages.{MapData, ReduceData, WordCount}

/**
 * Created by xiaojun on 2015/10/12.
 */
class ReduceActor(aggregateActor: ActorRef) extends Actor {
  override def receive: Receive = {
    case MapData(data) =>
      val list = data.groupBy(_.word).map {
        case (word, list) => WordCount(word, list.foldLeft(0)((count, wc) => count + wc.count))
      }.toList
      aggregateActor ! ReduceData(list)
    case msg => unhandled(msg)
  }


}

AggregateActor:

package com.hupu.dace.actors

import akka.actor.Actor
import com.hupu.dace.messages.{Result, ReduceData}

import scala.collection.mutable

/**
 * Created by xiaojun on 2015/10/12.
 */
class AggregateActor extends Actor {
  val finalData = mutable.HashMap[String, Int]()

  override def receive: Receive = {
    case ReduceData(data) =>
      data.foreach(wc => {
        finalData.put(wc.word, finalData.getOrElse(wc.word, 0) + wc.count)
      })
    case Result() =>
      println(finalData)
    case msg => unhandled(msg)
  }
}


HelloAkka程序入口:

package com.hupu.dace

import akka.actor.{ActorSystem, Props}
import com.hupu.dace.actors.MasterActor
import com.hupu.dace.messages.Result

/**
 * Created by xiaojun on 2015/10/10.
 */
object HelloAkka {
  def main(args: Array[String]) {
    val _system = ActorSystem("HelloAkka")
    val master = _system.actorOf(Props[MasterActor],"master")
    master ! "hello world hadoop"
    master ! "hello hadoop"
    master ! " hello spark world"
    Thread.sleep(1000)
    master ! Result()
    Thread.sleep(1000)
    _system.shutdown()
  }
}


ReduceActor做本地聚合类似HADOOP wordcount的combiner,然后全部发送给AggregateActor做全局聚合获得最终结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值