view slides/20180123/slide.md @ 14:deecd8254ba8

rename
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 26 Jan 2018 14:34:14 +0900
parents
children
line wrap: on
line source

title: 分散フレームワークakkaの調査
author: Takahiro Shimizu
profile:
lang: Japanese


# 調査目的
* 先輩の修論の比較材料の為に行う
* 分散フレームワークの1つであるakkaがどのような書き方、及び処理なのかを調査する


# 今週の進捗
* scalaの入門書を斜め読みした
* akkaの公式チュートリアルを行った
* Graphでn入力1出力のアクターモデルが生成出来ることを調べた
    * ドキュメントの例題を実行した

# 調査内容
* akkaのmac osx,ubuntu上の導入
* [公式チュートリアル](https://developer.lightbend.com/guides/akka-quickstart-java/)の例題を行う
* 前回はJavaで実行した
    * scalaで今回再調査を行いました

# scala環境の構築
* brewやaptで導入した
* scalaという名前のパッケージもあるが、sbtで導入する
    * `~/.sbt` 以下のディレクトリにバージョンごと入る為、適切に処理しないと競合する

# akkaでn入力の処理
* [GraphDSL](https://doc.akka.io/docs/akka/current/stream/stream-graphs.html?language=scala#constructing-graphs)系の命令を利用すると実行可能
* [Github上の別のサンプル](https://github.com/pkinsky/akka-streams-example)

# 出力系
* Broadcast[T] 
    * (1input N output) 1入力に対して全てのoutputに渡す
* Balance[T]
    * (1input N outputs) outputを1つ指定して出力をする
* unzipWith[In,A,B..]
    * 関数を受取,20までの各要素に対して実行する
* unZip[A,B]
    * Tupleを分割して、2つのoutputに対して送る

# input系
* Merge[In]
* MergePreferred[In]
* MergePrioritized[In]
* ZipWith[A,B,...,Out]
* Zip[A,B]
* Concat[A]

# チュートリアル

```scala
package merger

import akka.NotUsed
import akka.actor.ActorSystem
import akka.routing.Broadcast
import akka.stream.{ClosedShape, OverflowStrategy}
import akka.stream.scaladsl.{Flow, GraphDSL, Merge, RunnableGraph, Sink, Source}


object merger extends App {
  val system: ActorSystem = ActorSystem("mergeAkka")

  val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
    import GraphDSL.Implicits._
    val in = Source(1 to 10)
    val out = Sink.ignore

    val bcast = builder.add(Broadcast[Int](2))
    val merge = builder.add(Merge[Int](2))

    val f1, f2, f3, f4 = Flow[Int].map(_ + 10)

    in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out
    bcast ~> f4 ~> merge
    ClosedShape
  })

}

```

# 詰まっている所

* 公式のサンプルコードを動かそうとすると型エラーが発生する
* コンパニオンオブジェクトの書き方があまり理解できていない