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() | 最常用的按 key 类型发送,key 的类型数量往往远大于算子并发实例数 |
global() | 全部发往第一个 task |
broadcast() | 广播,适用于数据量小的情况 |
forward() | 上下游并发度一致时一对一发送 |
shuffle() | 随机均匀分配 |
rebalance() | Round-Robin (轮流分配) |
rescale() | Local Round-Robin (本地轮流分配) |
partitionCustomer() | 自定义单播 () |