akka+java实现_java – 使用Akka实现MapReduce

我正在尝试在Akka之上实现MapReduce并且很幸运地找到了本书的代码

Akka Essentials.但是,我发现这个示例实现有两个主要问题,并且两者看起来像基本的并发设计缺陷,顺便说一下,这是非常令人震惊的在一本关于Akka的书中找到:

>完成后,客户端将调用shutdown(),但此时无法保证消息通过WCMapReduceServer.我看到WCMapReduceServer只能随时获取部分客户端消息,然后WCMapReduceServer输出[INFO] [06/25/2013 09:30:01.594] [WCMapReduceApp-5] [ActorSystem(WCMapReduceApp)] REMOTE:RemoteClientShutdown @ akka://ClientApplication@192.168.224.65:2552表示客户端shutdown()发生在客户端实际设法刷新所有挂起的消息之前.在客户端代码line 41中,我们看到shutdown()发生时没有先刷新.在关闭系统之前,Akka是否有办法强制执行刷新出站消息?

>另一个实际上更大的缺陷,我已经修复过,是用于向MapReduce服务器发出EOF信号的方式,主要任务(文字文件)完成,因为所有子任务(文件的每一行)都已完成.他发送一个特殊的字符串消息DISPLAY_LIST,并且此消息排队的优先级最低为see code.这里的一个重大缺陷是即使DISPLAY_LIST具有最低优先级,如果任何Map(或Reduce)任务任意长,DISPLAY_LIST消息将在之前通过所有MapReduce子任务都已完成,因此MapReduce示例的结果是非确定性的,即每次运行都可以得到不同的字典.可以通过用以下内容替换MapActor#onReceive implementation来揭示该问题,即将一个Map步骤任意长:

public void onReceive(Object message) {

System.out.println("MapActor -> onReceive(" + message + ")");

if (message instanceof String) {

String work = (String) message;

// ******** BEGIN SLOW DOWN ONE MAP REQUEST

if ("Thieves! thieves!".equals(work)) {

try {

System.out.println("*** sleeping!");

Thread.sleep(5000);

System.out.println("*** back!");

}

catch (InterruptedException e) {

e.printStackTrace();

}

}

// ******** END SLOW DOWN ONE MAP REQUEST

// perform the work

List list = evaluateExpression(work);

// reply with the result

actor.tell(list);

} else throw new IllegalArgumentException("Unknown message [" + message + "]");

}

进一步阅读这本书后发现:

We have Thread.sleep() because there is no guarantee in which order

the messages are processed. The first Thread.sleep() method ensures

that all the string sentence messages are processed completely before

we send the Result message.

对不起,Thread.sleep()从来就不是确保并发性的方法.因此,难怪这样的书会在他们的例子中充满基本的并发缺陷.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值