Flink 基礎 - DataStream プログラミング#
ストリーム処理 API の変遷(Storm との比較)#
- Storm の API は抽象レベルが低く、
操作指向であり、コードを通じて自分で DAG を構築することができます。
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 5);
builder.setBolt("split", new SplitSentence(), 8).shuffleGrouping("spout");
builder.setBolt("count", new WordCount(), 12).fieldsGrouping("split", new Fields("word"));
- Flink は
データ指向であり、API を通じて、一連の演算子がデータに対して一連の変換計算を行い、Flink の内部で自動的に DAG を構築生成します。そのため、相対的に抽象レベルが高くなります。
基本使用#
//1、実行環境を設定
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//2、データソースを設定してデータを読み込む
DataStream text = env.readTextFile ("input");
//3、一連の変換を行う
DataStream<Tuple2<String, Integer>> counts = text.flatMap(new Tokenizer()).keyBy(0).sum(1);
//4、データシンクを設定してデータを書き出す
counts.writeAsText("output");
//5、実行を提出
env.execute("Streaming WordCount");
操作の概要#

DataStream の基本変換#

物理的グルーピング方法#
グルーピングを行った後でないと、reduce/sumなどの演算子を呼び出して統計計算を行うことはできません。
| タイプ | 説明 |
|---|---|
| keyBy() | 最も一般的なキータイプによる送信で、キーのタイプ数は演算子の並行インスタンス数を大きく上回ることが多い |
| global() | すべてを最初のタスクに送信 |
| broadcast() | ブロードキャスト、小さなデータ量に適用 |
| forward() | 上下流の並行度が一致する場合に 1 対 1 で送信 |
| shuffle() | ランダムに均等配分 |
| rebalance() | ラウンドロビン(輪番配分) |
| rescale() | ローカルラウンドロビン(ローカル輪番配分) |
| partitionCustomer() | カスタム単播 () |