Tech Notes

Apache Flinkを試してみての感想

| Comments

しばらくApache Flinkを試してみたので、感想を書いておこうと思う.

試したこと

  • standalone modeでのクラスタ構築
  • ストリーミングジョブを書いてみる
    • TumblingTimeWindowやSlidingTimeWindowでの集計
    • Kafka SourceとElasticsearch Sinkの利用
    • 必要だったので、カスタムトリガは書いた
  • 幾つかのジョブで性能測定
  • 社内の本番fluentdからKafka経由でFlinkにストリームを投入し、ジョブを十数日くらい連続稼働してみる
  • state backendをHDFSやRocksDBにしてみる
  • JobManager HA
  • TaskManagerやJobManagerを落としてみる
  • Flink on YARN (ジョブを起動してみただけ)

試してないこと

  • DataSet APIの利用
  • savepoint, savepointからの復旧
  • event timeやingenstion timeの利用(processing timeしか使ってない)
  • 複数ジョブの相乗り
  • 高トラフィックかつ複数ジョブでの連続稼働
  • Flink on YARNをもうちょっと色々使ってみる
  • (多分他にも色々)

所感

全体としてはすごく良く出来ていると思う. プロセスが落ちたりしても勝手に復旧するし、性能も出るし、WebUIやREST APIで色々情報取れるので運用もしやすそう. 今後は本番に入れていこうと思っている.

  • ちゃんと動く?
    • 期待通りに動かなくて、MLで聞いたらBugだ、って言われて直してくれたのが2件
    • ContinuousProcessingTimeTriggerは期待通りの動作をしなかったので、修正版を書く必要があった
    • 後は、上記の範囲では特に問題なく動いている
  • 処理の書きやすさ
    • APIがハイレベルなので、割と少ないコードで処理を書くことができて良い
    • 状態の保存とか、windowとか、自分で書くのは大変なのでその辺の面倒はFlinkが見てくれる
  • 性能
    • もちろん処理によるが、単純なものであれば1CPUで10万records/sec以上は普通に処理できそう
  • 耐障害性
    • ジョブ実行中にJobManagerやTaskManagerを落としてみたが、勝手に復旧された. すごい.
    • HDFS障害でどう振る舞うか?はまだ試せてないけど気になるところ
  • 運用
    • WebUIやREST APIで色々取れる. WebUIで大抵のものは見える印象.
    • スロット数とかはもちろん、ジョブ内のオペレータ単位で処理レコード数とか取れる
    • チェックポイントの所要時間やサイズも取れる
  • 不安なところ
    • チェックポイントのサイズには注意がいりそう. FsStateBackendの場合、状態は全て各TaskManagerのメモリに持ち、チェックポイントでHDFSに書き出される. 差分スナップショット的なものはないので、状態が大きくなってくるとスナップショットに時間がかかり、性能劣化する. キー(keyByで指定する奴)の数が大きいケースでは、RocksDBを使うことで改善されるらしいが、まだそれが有効なケースに出会ってない.
    • FlinkジョブをYARNで動かす場合を除いて、各TaskManagerは1プロセスで、その中で複数ジョブがスレッドとして動く形になっているのでisolationの部分は不安. あるジョブに引きづられてTaskManagerが固まるとかありそう.
    • ストリーム処理のプロダクトはいくつかあるし、Facebook, Twitter, Likedinみたいな大御所がバックにいるわけではないので、生き残っていくのだろうか

まとめ

ということで、自分がしばらく試しての所感を書いてみた. 実績の少ないプロダクトという意味での不安感はあるけど、性能、拡張性、耐障害性、APIの使いやすさは素晴らしいと思うので、使っていきたい. これ以上は使ってみないとわからないと思うし. あと、Flink on YARNの場合はYARNが動くクラスタがあれば、別途サーバを用意しなくてもFlinkジョブを動かすことができるので、既にHadoop環境がある場合なんかは、とりあえず試してみると良いんじゃないかと思う.

Comments