Akka(一) - akka的wordcount

1. 启动类
object Application extends App{

  val _system = ActorSystem("HelloAkka")  //构建akka容器
  val master:ActorRef = _system.actorOf(Props[MasterActor],name="master")   //akka容器创建actor

  println("master.path ==>\t"+master.path)   //akka://HelloAkka/user/master

  master ! "hi my name is spark, so happy"
  master ! "hi my zsh"
  master ! "xixi"
  Thread.sleep(1000)
  master ! new Result

  Thread.sleep(500)
  _system.terminate
}
2. MasterActor创建map,reduce,aggregate任务的actor
class MasterActor extends Actor{
  val aggregateActor:ActorRef = context.actorOf(Props[AggregateActor],name="aggregate")
  val reduceActor:ActorRef = context.actorOf(Props(new ReduceActor(aggregateActor)),name="reduce")
  val mapActor:ActorRef = context.actorOf(Props(new MapActor(reduceActor)),name="map")

  println("aggregateActor ==>\t"+aggregateActor.path)  //akka://HelloAkka/user/master/aggregate  (master的子actor)
  println("mapActor ==>\t"+mapActor.path)
  println("reduceActor ==>\t"+reduceActor.path)

  override def receive: Receive = {    // Receive用type重命名的PartialFunction
    case msg:String => mapActor ! msg
    case msg:Result => aggregateActor ! msg
    case _ =>
  }
}
3. map任务
class MapActor(var reduceActor: ActorRef)extends Actor{
  val STOP_WORDS = List("is","a")
  override def receive: Receive = {
    case msg:String => reduceActor ! evlExpression(msg)
    case _ =>
  }

  def evlExpression(line:String):MapData = {
    val dataList = new ArrayBuffer[Word]   // scala可变数组
    val parser:StringTokenizer = new StringTokenizer(line)
    while(parser.hasMoreTokens){
      val str: String = parser.nextToken()
      if(!STOP_WORDS.contains(str)){
        dataList += (new Word(str,1))
      }
    }
    new MapData(dataList)
  }
4. reduce任务
class ReduceActor(var aggregateActor: ActorRef) extends Actor{
  override def receive: Receive = {
    case msg: MapData => aggregateActor ! reduce(msg.dataList)
    case _ =>
  }

  def reduce(dataList:ArrayBuffer[Word]) : ReduceData ={
    val map = new HashMap[String,Int]
    for(w:Word <- dataList){
      val str: String = w.word
      map += (str -> map.getOrElse(str,1))
    }
    new ReduceData(map)
  }
}
5. aggregate任务
class AggregateActor extends Actor{

  var finalMap = new HashMap[String,Int]

  override def receive: Receive = {
    case msg:ReduceData => sum(msg.raduceMap)
    case msg:Result => println(finalMap)
  }
  def sum(map:HashMap[String,Int]){  //多个reduceactor会向aggregateactor发送整理好的map
    for(tuple <- map){
      val c = finalMap.getOrElse(tuple._1,0)+tuple._2
      finalMap += (tuple._1 -> c)
    }
  }
}
6. 用到的实体类
class Word(val word:String,val count:Int)

case class Result();

class MapData(val dataList:ArrayBuffer[Word])

class ReduceData(val raduceMap:HashMap[String,Int])

转载于:https://www.cnblogs.com/72808ljup/p/5606461.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值