用scala的Actor模仿MapReduce写一个分布式wordcount

package com.ycit.scala.demo.com.ycit.scala.day_02.com.ycit.scala.actor

import java.io.File


import scala.actors.{Actor, Future}
import scala.collection.mutable
import scala.io.Source

case class SubmitTask(fileName: String)
case object StopTask
case class ResultTask(result: Map[String, Int])

/**
  * author jiang
  * 用scala模仿MapReduce写一个分布式wordcount
  */
class WoldCountTask extends Actor{
  override def act(): Unit = {
    loop {
      react {
        case SubmitTask(fileName)=>{
          val lines = Source.fromFile(new File(fileName)).getLines().toList
            val result = lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).mapValues(_.length)
          sender ! ResultTask(result)
        }
        case StopTask =>{
          exit()
        }
      }
    }
  }
}
object WoldCountTask {
  def main(args: Array[String]): Unit = {
    val files = Array("f://words.txt", "f://words.log")
    val replySet = new mutable.HashSet[Future[Any]]
    val listBuffer = new mutable.ListBuffer[ResultTask]
    for (f<- files) {
      val t  = new WoldCountTask
       t.start()
      val reply =t !! SubmitTask(f)
      replySet += reply
    }

    while (replySet.size>0){
      val toCopute = replySet.filter(_.isSet)
      for (r <- toCopute){
        val ResultList = r.apply().asInstanceOf[ResultTask]
        listBuffer +=ResultList
        replySet.remove(r)
      }
    Thread.sleep(100)
    }
    val finalResult = listBuffer.map(_.result).flatten.groupBy(_._1).mapValues(x =>x.foldLeft(0)(_+_._2))
    println(finalResult)


  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值