1.Flink中的KeyBy
在Flink中,KeyBy作为我们常用的一个聚合类型算子,它可以按照相同的Key对数据进行重新分区,分区之后分配到对应的子任务当中去。
源码解析
keyBy 得到的结果将不再是 DataStream,而是会将 DataStream 转换为 KeyedStream(键控流),KeyedStream 可以认为是“分区流”或者“键控流”,它是对 DataStream 按照 key 的一个逻辑分区。
所以泛型有两个类型:除去当前流中的元素类型外,还需要指定 key 的类型。
KeyBy是如何实现分区的呢
Flink中的KeyBy底层其实就是通过Hash实现的,通过对Key的值进行Hash,再做一次murmurHash,取模运算。
再通过Job的并行度,就能获取每个Key应该分配到那个子任务中了。
2.分组和分区在Flink中的区别
分区:分区(Partitioning)是将数据流划分为多个子集,这些子集可以在不同的任务实例上进行处理,以实现数据的并行处理。
数据具体去往哪个分区,是通过指定的 key 值先进行一次 hash 再进行一次 murmurHash,通过上述计算得到的值再与并行度进行相应的计算得到。
分组:分组(Grouping)是将具有相同键值的数据元素归类到一起,以便进行后续操作(如聚合、窗口计算等)。
key值相同的数据将进入同一个分组中。
注意:数据如果具有相同的key将一定去往同一个分组和分区,但是同一分区中的数据不一定属于同一组。
3.代码示例
package com.flink.DataStream.Aggregation; import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; public class FlinkKeyByDemo { public static void main(String[] args) throws Exception { //TODO 创建Flink上下文执行环境 StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment(); //设置并行度为1 streamExecutionEnvironment.setParallelism(1); //设置执行模式为批处理 streamExecutionEnvironment.setRuntimeMode(RuntimeExecutionMode.BATCH); //TODO source 从集合中创建数据源 DataStreamSourcedataStreamSource = streamExecutionEnvironment.fromElements("hello word", "hello flink"); //TODO 方式一 匿名实现类 SingleOutputStreamOperator > outputStreamOperator1 = dataStreamSource .flatMap(new FlatMapFunction () { @Override public void flatMap(String s, Collector collector) throws Exception { String[] s1 = s.split(" "); for (String word : s1) { collector.collect(word); } } }) .map(new MapFunction >() { @Override public Tuple2 map(String s) throws Exception { Tuple2 aa = Tuple2.of(s, 1); return aa; } }) /** * keyBy 得到的结果将不再是 DataStream,而是会将 DataStream 转换为 KeyedStream(键控流) * KeyedStream 可以认为是“分区流”或者“键控流”,它是对 DataStream 按照 key 的一个逻辑分区 * 所以泛型有两个类型:除去当前流中的元素类型外,还需要指定 key 的类型。 * */ /** * 分组和分区在Flink 中具有不同的含义和作用: * 分区:分区(Partitioning)是将数据流划分为多个子集,这些子集可以在不同的任务实例上进行处理,以实现数据的并行处理。 * 数据具体去往哪个分区,是通过指定的 key 值先进行一次 hash 再进行一次 murmurHash,通过上述计算得到的值再与并行度进行相应的计算得到。 * 分组:分组(Grouping)是将具有相同键值的数据元素归类到一起,以便进行后续操作 (如聚合、窗口计算等)。 * key 值相同的数据将进入同一个分组中。 * 注意:数据如果具有相同的key将一定去往同一个分组和分区,但是同一分区中的数据不一定属于同一组。 * */ .keyBy(new KeySelector , String>() { @Override public String getKey(Tuple2 stringIntegerTuple2) throws Exception { return stringIntegerTuple2.f0; } }) .sum(1); //TODO 方式二 Lamda表达式实现 SingleOutputStreamOperator > outputStreamOperator2 = dataStreamSource .flatMap((String s, Collector collector) -> { String[] s1 = s.split(" "); for (String word : s1) { collector.collect(word); } }) .returns(Types.STRING) .map((String word) -> { return Tuple2.of(word, 1); }) //Java中lamda表达式存在类型擦除 .returns(Types.TUPLE(Types.STRING, Types.INT)) .keyBy((Tuple2 s) -> { return s.f0; }) .sum(1); //TODO sink outputStreamOperator1.print("方式一"); outputStreamOperator2.print("方式二"); //TODO 执行 streamExecutionEnvironment.execute("Flink KeyBy Demo"); } }
猜你喜欢
- 11天前(兰州旅游文化产业发展有限公司)甘肃省兰州市2023年乡村旅游暨A级旅游景区管理工作培训班开班
- 11天前(2020海丝之路文化博览会)2023海丝之路文化和旅游博览会开幕
- 11天前(哈弗h9优惠9万是真的吗)热浪来袭,哈弗H9超值补贴火热加码
- 11天前(中旅酒店 维景)中旅酒店首次AI数字人直播亮相南京维景
- 11天前(艾美酒店连锁)艾美酒店全球夏日计划回归,联手Wishbone主厨推出创新冰饮
- 11天前(纳米比亚旅游报价)纳米比亚旅游局2024年中国推介会圆满落幕
- 11天前(“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行)“百场黄梅唱响百家景区”示范演出活动在黄山风景区举行
- 11天前(泛舟诗海觅春迹什么意思)泛舟觅桃源,又一头部机构下场文旅赛道
- 11天前(芜宣机场国际航班)新华丝路:芜宣机场开通至越南首都河内的国际货运航线
- 11天前(海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章