Akka 使用系列之四: Future

这篇文章介绍 Akka 的同步机制,以及 Spark 和 Akka 的恩怨情仇。

1 Akka 中的 Future

Akka 中的 Actor 发送和接收消息默认都是异步的。为了说明异步性,我们实行下面的数学老师和历史老师的 Actor:

class MathTeacherActor extends Actor with ActorLogging {
  def receive = {
    case "1+1等于多少?"           => {
      Thread.sleep(1)
      sender ! "1+1等于2"
    }
  }
}

class HistoryTeacherActor extends Actor with ActorLogging {
  def receive = {
    case "历史上规模最大的众筹行动是什么?" => {
      Thread.sleep(1)
      sender ! "历史上规模最大的众筹行动是 +1s"
    }
  }
}

如果我们在询问历史老师之后访问答案(如下面代码所示),我们发现并不能获取正确答案。原因就在于 Akka 是异步非阻塞的。

val res = historyteacher ? "历史上规模最大的众筹行动是什么?"
println(res)

实质上, historyteacher ? “历史上规模最大的众筹行动是什么?” 返回的根本不是答案,而是一个 Future。在Akka中, 一个Future是用来获取某个并发操作的结果的数据结构。有了 Future,我们可以以同步(阻塞)或异步(非阻塞)的方式访问结果。下面是简单地以同步(阻塞)方式访问结果的示例。

class StudentActor(mathteacher:ActorRef,historyteacher:ActorRef) 
extends Actor with ActorLogging{

  def receive = {
    case res:String => {
        val future1 = historyteacher ? "历史上规模最大的众筹行动是什么?"
        val future2 = mathteacher ? "1+1等于多少?"

        val res1    = Await.result(future1,10 second)
        val res2    = Await.result(future2,10 second)

        println(res1)
        println(res2)

    }
  }
}

2 Akka 和 Spark

Spark 一开始使用 Akka 作为内部通信部件。在 Spark 1.3 年代,为了解决大块数据(如Shuffle)的传输问题,Spark引入了Netty通信框架。到了 Spark 1.6, Spark 可以配置使用 Akka 或者 Netty 了,这意味着 Netty 可以完全替代 Akka 了。再到 Spark 2, Spark 已经完全抛弃 Akka 了,全部使用 Netty 了。Sad。

为什么 Spark 无情地有步骤有预谋地抛弃 Akka 呢?Spark 官方倒是给了一个说法:https://issues.apache.org/jira/browse/SPARK-5293

A lot of Spark user applications are using (or want to use) Akka. Akka as a whole can contribute great architectural simplicity and uniformity. However, because Spark depends on Akka, it is not possible for users to rely on different versions, and we have received many requests in the past asking for help about this specific issue. For example, Spark Streaming might be used as the receiver of Akka messages – but our dependency on Akka requires the upstream Akka actors to also use the identical version of Akka. Since our usage of Akka is limited (mainly for RPC and single-threaded event loop), we can replace it with alternative RPC implementations and a common event loop in Spark.

大意就是很多 Spark 用户在使用 Spark 之后,就必须使用 Spark 依赖的那个版本的 Akka。Spark 主要用了 Akka 的 RPC 和 单线程 event-loop,因此 Spark 没有必要依赖完全的 Akka。最终 Spark 用 netty 实现下简易版本的 Akka。真爱啊。

3 总结

到这里,Akka 使用系列就结束了。这个系列简单地过了一下 Akka 的基础知识,介绍其梗概。如果需要深入了解,还需要详细阅读官方文档。完整代码已经上传至 Github

最近在 GitHub 上开发了一个 Side Project – RoomAI。这个 Side Project 目标是提供一些非完整信息游戏环境,让算法人员开发非完整信息游戏 AI, 目前已经支持德州和梭哈。欢迎大家使用和反馈。我后续会基于这个项目写一些文章介绍非完整信息游戏的算法。

Akka 系列系列文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏叁金大数据

漫谈未来的HDFS

前面我们提到的HDFS,了解了HDFS的特性和架构。HDFS能够存储TB甚至PB规模的数据是有前提的,首先数据要以大文件为主,其次NameNode的内存要足够大...

1183
来自专栏about云

适合小白入门Spark的全面教程

1.实时分析 在我们开始之前,让我们来看看美国社交媒体比较有名的企业每分钟产生的数据量。

862
来自专栏Albert陈凯

值得拥有 不容错过的Hive精华汇总

Hive作为Hadoop家族的重要一员,具有学习成本低,开发者可通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用。在攒...

1833
来自专栏Spark学习技巧

干货 | 如何成为大数据Spark高手

Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,从多迭代批量处理出发,兼收并蓄数据仓库、流处理和...

2608
来自专栏技术专栏

慕课网Spark SQL日志分析 - 1.Hadoop概述

http://hadoop.apache.org/ 对于Apache项目来说,projectname.apache.org Hadoop:hadoop.ap...

1474
来自专栏企鹅号快讯

什么是 Apache Spark?大数据分析平台详解

自从 Apache Spark 2009 年在 U.C. Berkeley 的 AMPLab 默默诞生以来,它已经成为这个世界上最重要的分布式大数据框架之一。S...

2056
来自专栏Albert陈凯

1.1.2 Spark生态

1.1.2 Spark生态 Spark大数据计算平台包含许多子模块,构成了整个Spark的生态系统,其中Spark为核心。 伯克利将整个Spark的生态系统称...

3305
来自专栏加米谷大数据

什么是 Apache Spark?大数据分析平台详解

自从 Apache Spark 2009 年在 U.C. Berkeley 的 AMPLab 默默诞生以来,它已经成为这个世界上最重要的分布式大数据框架之一。S...

1183
来自专栏Albert陈凯

Spark生态系统BDAS介绍

1.2 Spark生态系统BDAS 目前,Spark已经发展成为包含众多子项目的大数据计算平台。伯克利将Spark的整个生态系统称为伯克利数据分析栈(BDAS...

3565
来自专栏Albert陈凯

Impala 与Hive

Impala 与Hive都是构建在Hadoop之上的数据查询工具,但是各有不同侧重,那么我们为什么要同时使用这两个工具呢?单独使用Hive或者Impala不可以...

3606

扫码关注云+社区