1. 程式人生 > >Spark:Akka入門初窺

Spark:Akka入門初窺

首先明白下面幾點:

  • ActorSystem是該程序中的Actor的管理者,負責建立和監控所有的actor
  • ActorSystem是單例的
  • Actor負責通訊

如下我們使用Akka實現一個簡單的RPC通訊,首先我們看下他們互動的流程


如下給出Akka相關的Maven包

  <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor_2.10</artifactId>
            <version>2.3.14</version>
        </dependency>

        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-remote_2.10</artifactId>
            <version>2.3.14</version>
        </dependency>

如下是Master端的程式碼
class Master extends Actor {

  println("constructor invoked")

  //該方法在構造器後執行
  override def preStart(): Unit = {
    println("preStart invoked")
  }

  // 用於接收訊息
  override def receive: Receive = {
    case "connect" => {
      println("a client connected")
      sender ! "reply"  //為context.sender(),即Worker連線端的actor
    }

    case "hello" => {
      println("hello")
    }
  }
}

object Master {
  def main(args: Array[String]) {

    val host = args(0)
    val port = args(1).toInt
    // 準備配置
    val configStr =
      s"""
         |akka.actor.provider = "akka.remote.RemoteActorRefProvider"
         |akka.remote.netty.tcp.hostname = "$host"
         |akka.remote.netty.tcp.port = "$port"
       """.stripMargin
    val config = ConfigFactory.parseString(configStr)
    //ActorSystem老大,輔助建立和監控下面的Actor,他是單例的
    val actorSystem = ActorSystem("MasterSystem", config)
    //建立Actor, 起個名字Master,其會在Worker連線Master的時候使用到
    val master = actorSystem.actorOf(Props[Master], "Master")//Master主構造器會執行
    master ! "hello"  //傳送資訊
    actorSystem.awaitTermination()  //讓程序等待著, 先別結束
  }
}

如下是Worker端的程式碼

class Worker(val masterHost: String, val masterPort: Int) extends Actor{

  var master : ActorSelection = _
  //建立連線
  override def preStart(): Unit = {
    //在master啟動時會列印下面的那個協議, 可以先用這個做一個標誌, 連線哪個master
    //繼承actor後會有一個context, 可以通過它來連線
    master = context.actorSelection(s"akka.tcp://
[email protected]
$masterHost:$masterPort/user/Master") //需要有/user, Master要和master那邊建立的名字保持一致 master ! "connect" } override def receive: Receive = { case "reply" => { println("a reply form master") } } } object Worker { def main(args: Array[String]) { val host = args(0) val port = args(1).toInt val masterHost = args(2) val masterPort = args(3).toInt // 準備配置 val configStr = s""" |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = "$host" |akka.remote.netty.tcp.port = "$port" """.stripMargin val config = ConfigFactory.parseString(configStr) //ActorSystem老大,輔助建立和監控下面的Actor,他是單例的 val actorSystem = ActorSystem("WorkerSystem", config) actorSystem.actorOf(Props(new Worker(masterHost, masterPort)), "Worker") actorSystem.awaitTermination() } }

程式碼分析:由上面的程式碼可知,其Worker和Master端建立ActorSystem的方法是類似的,Worker端通過context.actorSelection獲得Master端actor的引用,並和其建立連線通訊。而Master又可以在receive方法中獲得Worker端的連線的actor,從而實現二者互動。

相關推薦

SparkAkka入門

首先明白下面幾點: ActorSystem是該程序中的Actor的管理者,負責建立和監控所有的actorActorSystem是單例的Actor負責通訊如下我們使用Akka實現一個簡單的RPC通訊,首先我們看下他們互動的流程 如下給出Akka相關的Maven包

Java-RPC2)NIO入門

Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO APIChannels and Buffers(通道和緩衝區):標準的IO基於位元組流和字元流進行操作的,而NIO是基於通道(Channel)和緩衝區(Bu

《零基礎入門學習Python》第063講論一隻爬蟲的自我修養11Scrapy框架之門徑

上一節課我們好不容易裝好了 Scrapy,今天我們就來學習如何用好它,有些同學可能會有些疑惑,既然我們懂得了Python編寫爬蟲的技巧,那要這個所謂的爬蟲框架又有什麼用呢?其實啊,你懂得Python寫爬蟲的程式碼,好比你懂武功,會打架,但行軍打仗你不行,畢竟敵人是千軍萬馬,縱使你再強,

DCOS實踐分享(4)如何基於DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

lec attribute 種子 bst 均衡器 all connect www pro 這篇文章入選CSDN極客頭條 http://geek.csdn.net/news/detail/71572 當前,要保證業務的市場競爭力,僅靠設計一個可用並且好看的產品,已經完全不

SSM-Spring-08Spring的靜態代理案例

ssp unit text app OS create 創建 test BE ------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑------------- 靜態代理   java的設計模式的代理模式,就是靜態代理   寫在前面的話,靜態代理的優點

轉載Spark中文指南(入門篇)-Spark程式設計模型(一)

原文:https://www.cnblogs.com/miqi1992/p/5621268.html 前言   本章將對Spark做一個簡單的介紹,更多教程請參考: Spark教程 本章知識點概括 Apache Spark簡介 Spark的四種執行模式 Spark基於

JVMJava物件的記憶體結構

物件記憶體結構 Class檔案以位元組碼的形式儲存在方法區當中,用來描述一個類本身的記憶體結構。當使用Class檔案新建物件時,物件例項的記憶體結構又究竟是個什麼樣子呢?   如圖所示,為了表示物件的屬性、方法等資訊,HotSpot VM使用物件頭部的一個指標指向Class區域的方式來

12行簡單的Python程式碼,爬蟲的祕境!小白入門必備!

  往往不少童鞋寫論文苦於資料獲取艱難,輾轉走上爬蟲之路; 許多分析師做輿情監控或者競品分析的時候,也常常使用到爬蟲。 今天,本文將帶領小夥伴們通過12行簡單的Python程式碼,初窺爬蟲的祕境。 進群:943752371即可獲取各類Python入門學習資料!

SparkSpark 程式設計模型及快速入門

Spark程式設計模型SparkContext類和SparkConf類程式碼中初始化我們可通過如下方式呼叫 SparkContext 的簡單建構函式,以預設的引數值來建立相應的物件。val sc = new SparkContext("local[4]", "Test Spa

Redis主從Replication的配置

概述 Redis的replication機制允許slave從master那裡通過網路傳輸拷貝到完整的資料備份。具有以下特點: 非同步複製。從2.8版本開始,slave能不時地從master那裡獲取到資料。允許單個master配置多個slaveslave允許其它slave連線

Scala超程式設計伊甸園

閱讀建議 本文的行文風格不求閱讀意義上的可讀性,而是期望讀者能夠跟著本文的一些探索,自己做一些嘗試,即git clone本文涉及的程式碼閱讀並實踐。 至於Scala超程式設計的一些介紹,請閱讀 @王在祥 的《神奇的Scala Macro之旅系列》: 一, 二, 三, 四。 繞不開的Sbt 我們從Mac

MyBatis自定義TypeHandler處理列舉

TypeHandler簡介 在MyBatis中,StatementHandler負責對需要執行的SQL語句進行預編譯處理,主要完成以下兩項工作:1.呼叫引數處理器(ParameterHandler)來設定需要傳入SQL的引數;2.呼叫結果集處理器(ResultSetHand

JAVA字元編碼

參考書籍:《深入分析Java Web技術內幕(修訂版)》----許令波著 編碼問題一直在困擾著程式開發人員,這在Java中尤其突出,因為Java是跨平臺語言,字元在不同平臺之間進行傳輸時經常需要進行編碼切換。 為什麼要編碼? 眾所周知,計算機其實是很笨的,它只識別數字0和

【深度分析Zigbee】Zstack協議棧(六)協調器的組網過程詳解

這一講我要詳細說一下協調器的組網過程。在Zstack中,網路組網是從ZDApp_Init函式開始的。具體的執行流程為:Main()->osal_init_system()->osalInitTasks()->ZDApp_In it()。進入到ZDApp_I

【Cocos2D-X 】門徑(5)CCAction動作

//移動到,1s, pRole->runAction(CCMoveTo::create(1,ccp(300,300))); //跳躍到,1s,高度50,分為5步 pRole->runAction(CCJumpTo::create(1,ccp(300,300),50,5)); //放

我的Go語言學習之旅二入門體驗 Hello World

好吧,所有的程式設計師們都已經習慣了,學習任何一門語言,我們都會以Hello World例項開始我們的學習,我也不例外。先來一個簡單的例子 開啟編輯器 (可以用記事本,我已經習慣 Notepad++了)輸入以下內容 package main import

Python爬蟲(入門+進階)學習筆記 2-1 爬蟲工程化及Scrapy框架

本章節將會系統地介紹如何通過Scrapy框架把爬蟲工程化。本節主要內容是:簡單介紹Python和爬蟲的關係,以及將要使用的Scrapy框架的工作流程。Python適合做爬蟲的原因語言本身簡單,適合敏捷開發有比較完善的工具鏈足夠靈活,以應對各種突然狀況爬蟲的知識體系前端相關知識:html,css,js;瀏覽器相

【Cocos2D-X 遊戲引擎】門徑(11)CCUserDefault儲存資料

儲存簡單的資料用CCUserDefault和Android中的SharedPreferences一樣,都是以鍵值對儲存的。 //獲取bool型值 bool getBoolForKey(const char* pKey, bool defaultValue = fals

JVM垃圾收集器(一)

參考書籍:《深入理解Java虛擬機器——JVM高階特性與最佳實踐(第2版)》 Java語言出來之前,程式開發更多的是使用C或者C++語言,然而在C或者C++語言中存在一個很大的矛盾:建立物件時要不斷

RedisHash操作常用命令

HGET命令 命令語法:HGET key field命令用途:返回雜湊表鍵 key 中給定域 field 的值。時間複雜度:O(1) 127.0.0.1:6379> exists book (