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)
}
}