Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Apache Beam Go SDK 触ってみた話

apstndb
March 25, 2018

Apache Beam Go SDK 触ってみた話

Open Go Friday #2 で話した資料
2018年3月時点の master ブランチを触ってみた話です。

apstndb

March 25, 2018
Tweet

More Decks by apstndb

Other Decks in Programming

Transcript

  1. Apache Beam
    Go SDK
    触ってみた話
    apstndb

    View full-size slide

  2. Apache Beam とは
    ● Google 発のバッチ処理とストリーミング処理の統一モデルである Dataflow モデル
    を扱う OSS
    ● フルマネージドなデータ処理サービス Google Cloud Dataflow 実行可能
    ○ そもそも Apache 寄贈前は Dataflow SDK
    ○ 他の Runner 上でも実行可能(Spark, Flink, etc...)
    ● 2.4.0 では Java と Python の SDK が含まれる
    ○ 2018年3月現在開発が進んでいる目玉は Streaming SQL と Go SDK
    ● Go でもクラウドで分散データ処理が可能になる?

    View full-size slide

  3. Apache Beam Go SDK のステータス(2018/3現在)
    - 設計資料 https://s.apache.org/beam-go-sdk-design-rfc
    - JIRA の sdk-go コンポーネントとして管理されている
    - 開発状況
    - 長い間 go-sdk ブランチで開発
    - Apache Beam 2.4 ブランチが切られてから master にマージ済
    - 2.5 でリリース予定?
    https://github.com/apache/beam/blob/master/sdks/go/README.md

    View full-size slide

  4. Apache Beam Go SDK のステータス

    View full-size slide

  5. 構成要素
    - PCollection
    - Beam 上でのデータセット
    - リストのようなもの
    - PTransform
    - PCollection から PCollection を作る操作
    - 複数入出力でマージ(JOIN) や分岐も可能
    - ParDo は map / flatMap 相当
    - 他にも Combine, GroupByKey, Flatten, Partition 等

    View full-size slide

  6. ソースコードの実例
    var input beam.PCollection = beam.Create(s, 1, 2, 3, 4)
    var square beam.PCollection = beam.ParDo(s, func(x int) int {
    return x * x
    }, input) // int to int
    var strings beam.PCollection = beam.ParDo(s, strconv.Itoa, square)
    textio.Write(s, *output, strings)
    値の型がない!

    View full-size slide

  7. Go SDK での実行におけるフェーズ
    ● Compile
    ○ 通常の Go のプログラムとしてコンパイルする
    ○ 型チェックが行われるがジェネリクスがないため大部分は検査できない
    ● Pipeline Construction
    ○ Go のプログラム実行時に Beam の実行グラフを生成する
    ○ リフレクションでパイプラインの型チェックをする
    ■ panic するか err で受け取るかは選択可能
    ● Runtime
    ○ 実行グラフを元に Runner 上で実行する
    ■ Cloud Dataflow のジョブ内での処理に対応
    ○ 型チェック済なので安全

    View full-size slide

  8. 実行時に管理される型情報
    stringList := beam.CreateList(s, []string{"a", "b", "c"})
    fmt.Println("stringList:", stringList.Type()) // stringList: string
    intList := beam.CreateList(s, []int{1, 2, 3})
    fmt.Println("intList:", intList.Type()) // intList: int
    convList := beam.ParDo(s, strconv.Itoa, intList)
    fmt.Println("convList:", convList.Type()) // convList: string
    convList2 := beam.ParDo(s, strconv.Itoa, stringList)
    fmt.Println("convList2:", convList2.Type()) // panic

    View full-size slide

  9. Direct Runnerでの実行
    ● ローカルで実行可能
    ● パイプラインのグラフのにおける型情報がデバッグ出力される
    ● 実装済の機能は動く

    View full-size slide

  10. Cloud Dataflow での実行
    ● ジョブを発行可能
    ○ グラフが見える
    ● 2018/3 現在の master は機能せず
    ● 途中から詰まったままになる
    ● 実行状況の詳細も取れない
    ○ Currently unsupported らしい

    View full-size slide

  11. まとめ
    - Go にも分散処理が来る日は近そう
    - 脱 Java したい!
    - エディタでの対応が望まれる(型チェック・補完)
    - Go にもやっぱりジェネリクスは欲しいのでは?

    View full-size slide