(1)Flink是什么 ?
Apache Flink是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算。 可部署在各种集群环境,对各种大小的数据规模进行快速计算。

官网:
https://flink.apache.org
https://data-artisans.com
(2)有限数据流和无限数据流?
有限数据流:有限不会改变的数据集合--批处理、离线运算(直梯)
误区:很多现实中认为是有界或者批量的数据集实际上无限数据流,hdfs目录、kafka
无限数据流:数据流源源不断的--流式计算、流计算(滚梯)
举例:
(a) 点击流(终端手机用户或者web应用的点击流)
(b) 物理传感器采集的测量数据
(c) 金融市场产生的数据(股市、数字货币交易市场)
(d) 服务器上的日志数据
(3)Flink为何受青睐—特性 ?
(3)Flink生态之核心组件栈


(4)Flink未来
(5)Flink应用场景
主要应用场景有三类:









(5)Flink VS Spark 之 社区
Spark 社区在规模和活跃程度上都是领先的,毕竟多了几年发展时间,同时背后的商业公司Databricks 由于本土优势使得Spark在美国的影响力明显优于Flink
而且作为一个德国公司,Data Artisans 想在美国扩大影响力要更难一些。不过 Flink 社区也有一批 稳定的支持者,达到了可持续发展的规模。
在中国情况可能会不一样一些。比起美国公司,中国公司做事情速度更快,更愿意尝试新技术。中国的 一些创新场景也对实时性有更高的需求。这些都对 Flink 更友好一些。
近期 Flink 的中国社区有一系列动作,是了解 Flink 的好机会。
Flink 的中文社区在 http://flink-china.org/
另外,2018 年 12 月 20 日 -21 日在国家会议中心举办的首届 Flink Forward China 峰会(千人规模), 参与者将有机会了解阿里巴巴、腾讯、华为、滴滴、美团、字节跳动等公司为何将 Flink 作为首选的流 处理引擎。
(6) 我的观点
Spark 和 Flink 都是通用的开源大规模处理引擎,目标是在一个系统中支持所有的数据处理以 带来效能的提升。两者都有相对比较成熟的生态系统。是下一代大数据引擎最有力的竞争者。
Spark 的生态总体更完善一些,在机器学习的集成和易用性上暂时领先。
Flink 在流计算上有明显优势,核心架构和模型也更透彻和灵活一些。
在易用性方面两者也都还有一些地方有较大的改进空间。接下来谁能尽快补上短板发挥强项就 有更多的机会。

(1)Flink的四层执行计划

StreamGraph
JobGraph
ExecutionGraph
物理执行图




ExecutionGraph
DataStreamContext
Jar
cmd
• createLocalEnvironment
内置数据源
自定义数据源

DataSink (自定义Sink)
实现SinkFunction 接口
继承RichSinkFunction
(2)流式迭代运算
• 需要通过split/filter转换操作指定流的哪些部分数据反馈给迭代算子,哪些部分数据被转发到 下游DataStream
• 基本套路
基于输入流构建IterativeStream(迭代头)
定义迭代逻辑(map fun等)
定义反馈流逻辑(从迭代过的流中过滤出符合条件的元素组成的部分流反馈给迭代头进行重
复计算的逻辑)
调用IterativeStream的closeWith方法可以关闭一个迭代(也可表述为定义了迭代尾)
定义“终止迭代”的逻辑(符合条件的元素将被分发给下游而不用于进行下一次迭代)
输入一组数据,我们对他们分别进行减1运算,直到等于0为止
(3)Controlling Latency(控制延迟)
默认情况下,流中的元素并不会一个一个的在网络中传输(这会导致不必要的网络流量消耗)
,而是缓存起来,缓存的大小可以在Flink的配置文件、 ExecutionEnvironment、设置某
个算子上进行配置(默认100ms)
如何把握平衡?
( 4 ) Flink提供的调试手段
1、Streaming程序发布之前最好先进行调试,看看是不是能按预期执行
2、为了降低分布式流处理程序调试的难度,Flink提供了一些列方法:












上图中将KeyAggregation和Sink两个operator进行了合并,因为这两个合并后并不会改变整体的拓扑结构







• TaskManger
• TaskManager Slots
• Job
• Task&subtask(线程)
• Operator
• Parallelism
• Chain
• SlotSharingGroup
• CoLocationGroup
• Standalone Cluster
• YARN
• Mesos
• Docker
• Kubernetes
• AWS
• Google Compute Engine
• 用于测试调试代码
• NodeManager
• AppMaster( jobmanger 运行在其上)
• Container(taskamanager 运行在其上)
• YarnSession
• 选择on-Yarn 的理由
提高机器的利用率
Hadoop 开源活跃,且成熟

• 包含重复的、不可变数据集
• DataSet有界、DataStream可以是无界
• 可以从数据源、也可以通过各种转换操作创建
• 加载/创建初始数据集
• 对数据集进行各种转换操作(生成新的数据集)
• 指定将计算的结果放到何处去
• 触发APP执行
• 只有当execute()被显示调用时才会真正执行
• 本地执行还是在集群上执行取决于执行环境的类型
• 好处:用户可以根据业务构建复杂的应用,Flink可以整体进优化并生成执行计划
(1)谁需要指定键
Aggregate, Windows)
DataSet<...> input = // [...]
DataSet<...> reduced = input
.groupBy(/*define key here*/)
.reduceGroup(/*do something*/);(2)为Tuple定义键
DataStream<Tuple3<Integer,String,Long>> input = // [...]
KeyedStream<Tuple3<Integer,String,Long>,Tuple> keyed = input.keyBy()DataStream<Tuple3<Integer,String,Long>> input = // [...]
KeyedStream<Tuple3<Integer,String,Long>,Tuple> keyed = input.keyBy(,1)DataStream<Tuple3<Tuple2<Integer, Float>,String,Long>> input = // [...]
KeyedStream<Tuple3<Integer,String,Long>,Tuple> keyed = input.keyBy()注意:这里使用KeyBy(0)指定键,系统将会使用整个Tuple2作为键(整型和浮点型的)。
如果想使用Tuple2内部字段作为键,你可以使用字段来表示键
(3)使用字段表达式定义键
public class WC {
public String word;
public int count;
}
DataStream<WC> words = // [...]
DataStream<WC> wordCounts = words.keyBy("word").window(/*window specification*/);语法

(4)字段表达式实例-Java

(5)字段表达式实例-Scala

(5)使用键选择器函数定义键(Key Selector Functions)
还有一种定义键的方式叫做“键选择器”函数。键选择器函数需要一个元素作为入参,返
回这个元素的键。这个键可以是任何类型的,也可从指定计算中生成。
class WC(var complex: ComplexNestedClass, var count: Int) {
def this() { this(null, ) }
}
public class WC {public String word; public int count;}
DataStream<WC> words = // [...]
KeyedStream<WC> keyed = words
.keyBy(new KeySelector<WC, String>() {
public String getKey(WC wc) {
return wc.word;
}
});(1)方式1:实现接口
大多数的转换操作需要用户自己定义函数。

(2)方式2:匿名类

(3)方式3:Lambda表达式

(4)方式4:Rich Functions

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



Scala的Case类(以及Scala的Tuple,实际是Case class的特殊类型)是包含了一定数量多种类型字段 的组合类型。Tuple字段通过他们的1-offset名称定位,例如 _1代表第一个字段。Case class 通过字 段名称获得:
case class WordCount(word: String, count: Int)
val input = env.fromElements(
WordCount("hello", 1),
WordCount("world", 2)) // Case Class Data Set
input.keyBy("word")// key by field expression "word"
val input2 = env.fromElements(("hello", 1), ("world", 2)) // Tuple2 Data Set
input2.keyBy(, 1) // key by field positions and 1
public class WordWithCount {
public String word;
public int count;
public WordWithCount() {}
public WordWithCount(String word, int count) { this.word = word; this.count = count; }
}
DataStream<WordWithCount> wordCounts = env.fromElements(
new WordWithCount("hello", 1),
new WordWithCount("world", 2));
wordCounts.keyBy("word");Flink支持Java和Scala所有的基本数据类型,比如 Integer,String,和Double
• Scala的 Either、Option和Try

Flink 的Java API会试图去重建这些被丢弃的类型信息,并将它们明确地存储在数据集以及操作中。
你可以通过DataStream.getType()方法来获取类型,这个方法将返回一个TypeInformation的实例,这 个实例是Flink内部表示类型的方式。

如何使用累加器 ?

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











自定义DataSource
public class SimpleSourceFunction implements ParallelSourceFunction<Long> {
private long num = 0L;
private volatile boolean isRunning = true;
@Override
public void run(SourceContext<Long> sourceContext) throws Exception {
while (isRunning) {
sourceContext.collect(num); num++;
Thread.sleep(10000);
}
}
@Override
public void cancel() {
isRunning = false;
}
}转换(Transformations)

DataSink

简单理解迭代运算
• 不断反复进行某种运算,直到达到某个条件才跳出迭代(是不是想起了递归)
流式迭代运算

流式迭代运算实例

Controlling Latency(控制延迟)

Flink提供的调试手段

本地执行环境-基于线程模拟执行环境

集合数据源(Collection Data Sources)-模拟数据输入

Iterator Data Sink-模拟数据输出

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3119966/ ,如需转载,请注明出处,否则将追究法律责任。