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 }) } ``` # 詰まっている所 * 公式のサンプルコードを動かそうとすると型エラーが発生する * コンパニオンオブジェクトの書き方があまり理解できていない