第92讲:Akka第一个案例动手实战开发环境的搭建学习笔记
本讲主要讲解如何利用IDEA创建项目。
开发akka最好用IDEA
1.IDEA自动集成了插件,
2.IDEA越用越智能
1)创建maven工程
2)pom.xml配置
第93讲:Akka第一个案例动手实战开发消息实体类学习笔记
mapActor的重要功能就是把收到的消息进行单词切分。
ReduceActor是对mapActor的结果进行统计
AggregateActor是对最后 所有的ReduceActor的进行统计
MasterActor是控制器,给mapActor发具体字符串,要求MapActor进行单词切分等工作。
actor间存在消息传输,用什么表达消息呢?
数据存储是以什么样的方式存储及传递呢?
java中定义的数据的实体是javabeen。
//actors: MapActor,ReduceActor,AggregateActor,MasterActor
package akka.dt.app.java.messages;
public class MapActor{
String[] STOP_WORDS = {"a","is"};
oruvate Kust<String> STOP_WORDS_LIST - Array.asList(STOP_WORDS);
public MapActor(ActorRef inReduceActor) {reduceActor = inReduceActor;}
@Override
public void onReceive(Object message) throws Exception{
if (message instanceof String) {
String work = (String) message;
//map the words in the sentence
MapData data = evaluateExpression(work); //产生MapData实体
//send the result to ReduceActor
reduceActor.tell(data);
} else
unhandled(message);
}
private MapData evaluateExpression(String line){
List<WordCount> dataList = new ArrayList<!>();
StringTokenizer parser = new StringTokenizer(line);
while(parser.hasMoreTokens()) {
String word = parser.nextToken().toLowerCase();
if(!STOP_WORDS_LIST.contains(word)){
dataList.add(new WordCount(word, Integer.valueof(1)));
}
}
return new MapData(dataList);
}
}
public class ReduceActor extends UntypeActor {
private ActorRef aggregateActor = null;
public ReduceActor(ActorRef inAggregateActor) {aggregateActor = inAggregateActor;}
@Override
public void onReceive(Object message) throws Exception{
//AggregateActor收到的消息有两种,一种是ReduceData类型,一种是Result类型
if (message instanceof MapData) {
MapData mapData = (MapData) message;
//reduce the incoming data
ReduceData reduceData = reduce(mapData.gerDataList());
//forward the result to aggregate actor
aggregateActor.tell(reduceData);
} else
unhandled(message);
}
private ReduceData reduce(List<WordCount> dataList){
HashMap<String, Integer> reducedMap = new HashMap<~>();
for (WordCount wordCount : dataList){
if(reduceMap.containsKey(wordCount.getWord())){
Integer value = (Integer) reducedMap.get(wordCount.getWord());
value++;
rduceMap.put(wordCount.getWord(),value);
} else {
reduceMap.put(wordCount.getWord(),Integer.valueOf(1));
}
}
return new ReduceData(reducedMap);
}
}
package akka.dt.app.java.actors;
import ...
public class AggregateActor extends UntypeActor {
private Map<String,Integer> finalReducedMap = new HashMap<~>();
@Override
public void onReceive(Object message) throws Exception{
//AggregateActor收到的消息有两种,一种是ReduceData类型,一种是Result类型
if (message instanceof ReduceData) {
ReduceData reduceData = (ReduceData) message;
aggregateInMemoryReduce(reduceData.getReduceDataList());
} else if (message instanceof Result) {
System.out.prontln(finalReducedMap.toString());
} else
unhandled(message);
}
private void aggreInMemoryReduce(Map<String,Integer> reducedList){
Integer count = nul;
for (String key : reducedList.keySet()) {
if (finalReduceMap.containsKey(key)){
count - reducedList.get(key) + finalReducedMap.get(key);
finalReducedMap.put(key, count);
} else {
finalReducedMap.put(key,reducedList.get(ley));
}
}
}
}
public class MasterActor extends UntypedActor {
private ActorRef aggregaterActor = getContext().actorOf(
new Props(AggregateActor.class), "aggregate");
private ActorRef reduceActor - getContext().actorOf(
new Props((UntypeActorFactory create() → {return new ReduceActor(aggregateActor);}),"map")
@override
public void onReceive(Object message) throws Exception{
if (message instanceof String) {
mapActor.tell(message);
} else if (message instanceof Result) {
aggregateActor.tell(message);
} else
unhandled(message);
}
}
//messages:MapData,ReduceData,Result,WordCount
package akka.dt.app.java.messages;
import java.util.List;
public class MapData { //用来让MapActor处理数据后存储在MapData实体中,
//然后方便把处理结果交给ReduceActor
private List<WordCount> dataList; //私有成员是List,具体类型是WordCount,WordCount也是javabeen
public List<WordCount> getDataList() {return dataList;}
public MapData(List<WordCount> dataList) {this.dataList = dataList;}
}
package akka.dt.app.java.messages;
import java.util.HashMap;
public class ReduceData {
private HashMap<String, Integer> reduceDataList;
public HashMap<String, Integer> getReduceDataList(){return reduceDataList;}
public ReduceData(HashMap<String, Integer> reduceDataList){this.reduceDataList = reduceDataList;}
}
//ReduceData进行本地型统计
package akka.dt.app.java.messages;
public class Result {
}
//传入的字符串先交给MapActor进行切分,然后交给ReduceActor进行本地统计,
//最后交给AggregateActor进行全局的统计,
//想要获得这个结果,通过MasterActor发一个消息Result,Result本身为空,不需要有任何内容。
//这个消息交给MasterActor,MasterActor收到消息时,如果消息是result类型的话转过来会告诉AggregateActor,
//再转发给AggregateActor。
WordCount是纯粹的javabeen,
package akka.dt.app.java.messages;
public class WordCount {
private String word;
private Integer count;
public WordCount(String inWord, Integer inCount){
word = inWord;
count = inCount;
}
public String getWord(){return word;}
public Integer getCount(){return count;}
}
public class HelloAkka {
public static void main(String[] args) throws Exception {
ActorSystem _system = ActorSystem.create("HelloAkka");
ActorRef master = _system.actorOf(new Props(MasterActor.class),"master");
master.tell("Hi! My name is Rocky. I'm so so so so happy to ne here. ");
master.tell("Today, I'm going to read a news article for you. ");
master.tell("I hope I hope you'll like it.")
Thread.sleep(500);
master.tell(new Result());
Thread.sleep(500);
_system.shutdown();
}
}
本讲主要讲解不同Actor间如何协同工作,如何传数据。
以上内容是从王家林老师DT大数据课程第92讲和第93讲的学习笔记。
DT大数据微信公众账号:DT_Spark
王家林老师QQ:1740415547
王家林老师微信号:18610086859
今日【DT大数据梦工厂视频】《第92讲:Akka第一个案例动手实战开发环境的搭建》
56视频:http://www.56.com/u84/v_MTM4Njg1MTY5.html
土豆视频:http://www.tudou.com/programs/view/Te7ACPZRYQY/
(DT大数据梦工厂1至93讲scala的所有视频、PPT和代码在百度云盘的链接:http://url.cn/fSFPjS)