Flink中的派生数据流(Derived DataStream)是从现有的数据流中派生出来的新的数据流。它与源数据流共享相同的数据,但具有不同的属性,如并行度、分区方式、数据类型等。
派生数据流的主要作用是:
- 调整数据流的并行度以优化资源利用率;
- 改变数据流的分区策略以实现更均衡的负载分布;
- 改变数据流的数据类型以便后续的操作。
Flink通过以下方式派生新的数据流:
- setParallelism:调整数据流并行度,产生新的并行度的数据流。
- rebalance:重新分区数据流,产生新的分区策略的数据流。
- map:使用map变换数据类型,产生新的类型的数据流。
- flatMap:使用flatMap变换数据类型,产生新的类型的数据流。
下面通过例子来说明几种派生数据流的方式:
setParallelism:
DataStream<String> stream = env.readTextFile("input");
DataStream<String> result = stream.setParallelism(5); // 设置并行度为5
rebalance:
DataStream<Tuple2<String, Integer>> stream = ...
DataStream<Tuple2<String, Integer>> result = stream.rebalance();
// 重新分区, 分区策略由系统决定
map:
DataStream<Integer> stream = env.fromElements(1, 2, 3);
DataStream<String> result = stream.map(x -> x.toString());
// 映射为字符串类型
flatMap:
DataStream<Integer> stream = env.fromElements(1, 2, 3);
DataStream<String> result = stream.flatMap(x -> Collections.nCopies(x, "a"));
// 映射为字符串类型
派生数据流是Flink优化程序性能的一种有效手段。
派生数据流机制为我们提供了调整和优化Flink程序的灵活手段。
setParallelism、rebalance、map和flatMap是Flink中派生新数据流的四种主要方式。