前言
???????想用公司的时间做提升,那肯定是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<Tuple3<Integer,String,Long>> input = // […] KeyedStream<Tuple3<Integer,String,Long>,Tuple> keyed = input.keyBy(0) ? 按照组合键进行分组 DataStream<Tuple3<Integer,String,Long>> input = // […] KeyedStream<Tuple3<Integer,String,Long>,Tuple> keyed = input.keyBy(0,1) ? 特殊情况:嵌套Tuple DataStream<Tuple3<Tuple2<Integer, Float>,String,Long>> input = // […] KeyedStream<Tuple3<Integer,String,Long>,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。
|