1、Flink介绍
1.1 Flink是什么
Apache官网:
https://flink.apache.org/
Apache Flink® - Stateful Computations over Data Streams 数据流上的有状态计算
Apache Flink是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态计算。Flink被设计用于在所有常见的集群环境中运行,以内存中的速度和任何规模执行计算。
无界:数据流源源不断的,有开头,没有结束
有界:其实就相当于一个批处理,有开头,有结束
和Spark一样也支持批处理和流处理
Spark的实时处理:其实是一个小的迷你Batch,Stream是他的特例
Flink的实时处理:刚好和Spark想法,Flink是实时Stream的,Batch是Stream的特例
所有流式用例:
事件驱动的应用程序
流和批分析
数据管道和ETL
保证正确性:
只有一次状态的一致性
事件时间处理
复杂的后期数据处理
APIs:
SQL on Stream & Batch Data
DataStream API & DataSet API
ProcessFunction (Time & State)
1.2 Flink部署在什么地方
Flink集成了所有常见的集群资源管理器,如Hadoop纱线、Apache Mesos和Kubernetes,但也可以设置为作为独立集群运行。Flink集成了所有常见的集群资源管理器,如Hadoop YARN、Apache Mesos和Kubernetes,也可以设置为stand-alone运行。
1.3 Flink编程模型
- 最低级别抽象只提供有状态流。它通过Process函数嵌入到DataStream API中。它允许用户自由处理来自一个或多个流的事件,并使用一致的容错状态。此外,用户可以注册事件时间和处理时间回调,允许程序实现复杂的计算。
- 实际上,大多数应用程序不需要上面描述的低层抽象,而是根据核心API (DataStream API(有界/无界流)和DataSet API(有界数据集)进行编程。这些连贯api为数据处理提供了常见的构建块,比如用户指定的各种形式的transformations, joins, aggregations, windows, state等。在这些api中处理的数据类型用各自的编程语言表示为类。
- 表API是一个以表为中心的声明性DSL,表可以(在表示流时)动态地更改表。表API遵循(扩展的)关系模型:表有一个附加的模式(类似于关系数据库中的表),而API提供了类似的操作,如select、project、join、group-by、aggregate等。表API程序声明性地定义应该执行什么逻辑操作,而不是确切地指定操作代码的外观。虽然表API可以通过各种类型的用户定义函数进行扩展,但是它比核心API更缺乏表现力,但是使用起来更简洁(编写的代码更少)。此外,表API程序还需要经过一个在执行之前应用优化规则的优化器。
可以在表和DataStream/DataSet之间无缝转换,允许程序混合表API和DataStream和DataSet API。 - Flink提供的最高级抽象是SQL。这种抽象在语义和表达性上都类似于表API,但将程序表示为SQL查询表达式。SQL抽象与表API紧密交互,SQL查询可以在表API中定义的表上执行。
1.4 程序和数据流
Flink程序的基本构建块是流和转换
Spark:input–>transformation–>action–>output
Flink:source–>transformation–>transformation–>sink
Parallel Dataflows并行数据流
Windows窗口
Time时间
Event Time:是创建事件的时间。
Ingestion time:是事件在进入Flink数据流的时间。
Processing Time:是每个执行的时间。
2、Flink搭建
选择和hadoop对应的版本,我这里是hadoop2.6的
3、Maven依赖,写第一个Flink程序WC
IDEA的pom.xml
<flink.version>1.6.4</flink.version>
<scala.binary.version>2.11</scala.binary.version>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
package com.ruozedata.flink
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time
object FlinkSocketWCApp {
def main(args: Array[String]): Unit = {
//create ENV
val env=StreamExecutionEnvironment.getExecutionEnvironment
//source
val lines=env.socketTextStream("192.168.137.130",9999)
//transformation
val results=lines.flatMap(x=>x.split(","))
.map(x=>WC(x,1))
.keyBy("word")
.timeWindow(Time.seconds(4),Time.seconds(2))
.sum("count")
//sink
results.print().setParallelism(1)
//stop
env.execute("FlinkSocketWCApp")
}
case class WC(word:String,count:Long)
}
开启nc
[hadoop@vm01 software]$ nc -lk 9999
a,a,a,a
b,b,b,b
c,c,c,c
开启Flink程序