想用公司的时间做提升,那肯定是build your dream。入职这家公司已经3年了,没有公司的培养培训,都是自己捣腾。何况我们还不是什么大厂,早上领导已经发话要切进项目看这么引入flink做改造了。不管咋样,学习是自己的事情,这个必须学出一定高度,博友们监督,哈哈。
一、分层架构
之前在开篇就有整体介绍,现在进入具体一点的讲解。首先,我说下个人的理解,分层架构我认为是轮子、语法的关系,底层的语法可以造出很多轮子,上层可以不管轮子怎么做出来的。比如一个车企,可以自己生产轮子,也可以直接用通用的轮子。其实底层就更接近源码,这应该要到达一定高度了,可以自己造更多好轮子给别人用。。。
分层图:
要想用高层的语法,那就得熟悉底层,不然那就是瞎写。当然,很多业务场景如果特殊,那肯定用底层的处理更贴合。
各层介绍:
结论:
灵活性高写法就复杂,写法简单需要深入理解。
编码基本套路
上面的基本套路是没有指定并行度的,如果指定并行度,那就是并行的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
KeyedStream
• 按照组合键进行分组
DataStream
KeyedStream
• 特殊情况:嵌套Tuple
DataStream
KeyedStream
注意:这里使用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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)