对 Flink ⽽⾔,其所要处理的主要场景就是流数据,批数据只是流数据的⼀个极限特例⽽已,因此 Flink 也是⼀款真正的流批统⼀的计算引擎redis
无界流与有界流编程
有状态的计算:每次进行数据计算的时候基于以前数据的计算结果(状态)作计算,而且每次计算结果 都会保存到存储介质中,计算关联上下文context
基于有状态的计算不须要将历史数据从新计算,提升了计算效率
无状态的计算:每次进行数据计算只是考虑当前数据,不会使用以前数据的计算结果缓存
1) 支持高吞吐、低延迟、高性能的流处理
2) 支持带有事件时间的窗口(Window)操做
3) 支持有状态计算的Exactly-once语义
4) 支持高度灵活的窗口(Window)操做,支持基于time、count、session,以及data-driven的窗口操做
5) 支持具备Backpressure功能的持续流模型
6) 支持基于轻量级分布式快照(Snapshot)实现的容错
7) 一个运行时同时支持Batch on Streaming处理和Streaming处理
8) Flink在JVM内部实现了本身的内存管理
9) 支持迭代计算
10) 支持程序自动优化:避免特定状况下Shuffle、排序等昂贵操做,中间结果有必要进行缓存session
处理批数据机器学习
处理流数据分布式
支持机器学习(FlinkML)
支持图分析(Gelly)
支持关系数据处理(Table)
支持复琐事件处理(CEP)ide
支持Flink on YARN
支持HDFS
支持来自Kafka的输入数据
支持Apache HBase
支持Hadoop程序
支持Tachyon
支持ElasticSearch
支持RabbitMQ
支持Apache Storm
支持S3
支持XtreemFSoop
在Flink的世界观中,一切都是数据流,因此对于批计算来讲,那只是流计算的一个特例而已
Flink Dataflows是由三部分组成,分别是:source、transformation、sink结束
source数据源会源源不断的产生数据,transformation将产生的数据进行各类业务逻辑的数据处理,最 终由sink输出到外部(console、kafka、redis、DB......)
基于Flink开发的程序都可以映射成一个Dataflows性能
当source数据源的数量比较大或计算逻辑相对比较复杂的状况下,须要提升并行度来处理数据,采用并 行数据流
经过设置不一样算子的并行度 source并行度设置为2,map也是2.... 表明会启动多个并行的线程来处理数据学习
为了更高效地分布式执行,Flink会尽量地将operator的subtask连接(chain)在一块儿造成task。每一个 task在一个线程中执行。将operators连接成task是很是有效的优化:它能减小线程之间的切换,减小 消息的序列化/反序列化,减小数据在缓冲区的交换,减小了延迟的同时提升总体的吞吐量
若是要将程序打包提交到集群运行,打包的时候不须要包含这些依赖,由于集群环境已经包含这些依赖,此时依赖的做用域应该设置为provided provided
Flink 应用在 IntelliJ IDEA 中运行,这些 Flink 核心依赖的做用域须要设置为 compile 而不是 provided 。 不然 IntelliJ 不会添加这些依赖到 classpath,会致使应用运行时抛出 NoClassDefFountError异常