Flink流处理引擎系统学习(四)

Flink流处理引擎系统学习(四),第1张

前言

       想用公司的时间做提升,那肯定是build your dream。入职这家公司已经3年了,没有公司的培养培训,都是自己捣腾。何况我们还不是什么大厂,早上领导已经发话要切进项目看这么引入flink做改造了。不管咋样,学习是自己的事情,这个必须学出一定高度,博友们监督,哈哈。


一、分层架构

       之前在开篇就有整体介绍,现在进入具体一点的讲解。首先,我说下个人的理解,分层架构我认为是轮子、语法的关系,底层的语法可以造出很多轮子,上层可以不管轮子怎么做出来的。比如一个车企,可以自己生产轮子,也可以直接用通用的轮子。其实底层就更接近源码,这应该要到达一定高度了,可以自己造更多好轮子给别人用。。。
分层图:

       要想用高层的语法,那就得熟悉底层,不然那就是瞎写。当然,很多业务场景如果特殊,那肯定用底层的处理更贴合。
各层介绍:



结论:
       灵活性高写法就复杂,写法简单需要深入理解。

二、DataFlow&基本套路


编码基本套路

       上面的基本套路是没有指定并行度的,如果指定并行度,那就是并行的DataFlow

  • 并行度设置:parallelism
  • 并行的交叉处理:
    如果source[1]出现a,source[2]也出现a,如果分别发给2个map,如果继续分开处理统计的就会有问题,所以做Shuffle(洗牌)。有些发map[1]、有些发map[2]是根据key来的。
    根据key发同一个map处理,这种交叉处理的方式叫洗牌Shuffle。
    算子间数据传递模式

    broadcast:广播,就是都发一份。

三、核心概念介绍

1、windows

2、Time

  • eventTime:事件时间
  • IngestionTime:摄取时间
  • processingTime:处理时间
    3、有状态的 *** 作

    4、备份


四、补充

A、那些需要指定键
• 哪些 *** 作需要指定key(join, coGroup, keyBy, groupBy,Reduce, GroupReduce,
Aggregate, Windows)
• Flink编程模型的key是虚拟的,不需要你创建键值对
DataSet<…> input = // […]
DataSet<…> reduced = input
.groupBy(/define key here/)
.reduceGroup(/do something/)

B、为Tuple定义键
• 按照指定属性分组
DataStream> input = // […]
KeyedStream,Tuple> keyed = input.keyBy(0)
• 按照组合键进行分组
DataStream> input = // […]
KeyedStream,Tuple> keyed = input.keyBy(0,1)
• 特殊情况:嵌套Tuple
DataStream,String,Long>> input = // […]
KeyedStream,Tuple> keyed = input.keyBy(0)
注意:这里使用KeyBy(0)指定键,系统将会使用整个Tuple2作为键(整型和浮点型的)。如果想使用Tuple2内部字段作为键,你可以使用字段来表示键。

C、Rich Function丰富的功能
非常有用的四个方法:open,close,getRuntimeContext和setRuntimecontext
这些功能在参数化函数、创建和确定本地状态、获取广播变量、获取运行时信息(例如
累加器和计数器)和迭代信息时非常有帮助。

D、Flink支持的数据类型
• Flink支持Java和Scala所有的基本数据类型,比如 Integer,String,和Double
• Flink对DataSet和DataStream中可使用的元素类型添加了一些约束。原因是系统可以通过分析这些类
型来确定有效的执行策略和选择不同的序列化方式。有7中不同的数据类型:
 Java Tuple 和 Scala Case类;
 Java POJO;
 基本类型;
 通用类;
 值;
 Hadoop Writables;
 特殊类型

E、累加器和计数器
•计数器是最简单的累加器
•内置累加器:
IntCounter, LongCounter 和 DoubleCounter
Histogram

F、如何使用累加器
• 第一步:在自定义的转换 *** 作里创建累加器对象:
private IntCounter numLines = new IntCounter();
• 第二步:注册累加器对象,通常是在rich function的open()方法中。这里你还需要定义累加器的名字
getRuntimeContext().addAccumulator(“num-lines”, this.numLines);
• 第三步:在operator函数的任何地方使用累加器,包括在open()和close()方法中
this.numLines.add(1);
• 第四步:结果存储在JobExecutionResult里:
JobExecutionResult JobExecutionResult =env.execute(“Flink Batch Java API Skeleton”)
myJobExecutionResult.getAccumulatorResult(“num-lines”)

G、自定义累加器
• 实现Accumulator或者SimpleAccumulator


总结

1、分层架构,一定要理解清楚,方便后期结合业务场景选对api
2、核心概念要理解,一般面试应该会问
3、DataFlow的基本套路要自己发散
就写到这里,跟大家一起up。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/725657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存