文章目录
Flink和Spark各自优劣
底层机制
Spark
Spark的数据模型是弹性分布式数据集 RDD,这个内存数据结构使得spark可以通过固定内存做大批量计算。初期的Spark Streaming是通过将数据流转成批(micro-batches),即收集一段时间(time-window)内到达的所有数据,并在其上进行常规批处,所以严格意义上,还不能算作流式处理。但是Spark从2.x版本开始推出基于 Continuous Processing Mode的 Structured Streaming,支持按事件时间处理和端到端的一致性,但是在功能上还有一些缺陷,比如对端到端的exactly-once语义的支持
Spark DAG示意图
Flink
Flink是统一的流和批处理框架,基本数据模型是数据流,以及事件(Event)的序列,Flink从设计之初秉持了一个观点:批是流的特例。每一条数据都可以触发计算逻辑,那么Flink的流特性已经在延迟方面占得天然优势。
Flink workflow示意图
运用
API | Spark | Flink |
---|---|---|
底层api | RDD | Process Function |
核心api | DataStream/DataSet/Structured Stream | DataStream/DataSet |
SQL | Spark SQL | Table Api&SQL |
机器学习 | MLlib | FlinkML |
图计算 | Graph | Gelly |
其他 | CEP |
支持语言
支持语言 | Spark | Flink |
---|---|---|
java | √ | √ |
scala | √ | √ |
python | √ | √ |
R | √ | ×(需要第三方) |
SQL | √ | √ |
Flink运行代码
主要分成三部分
- 1、source模块
- 2、transform模块
- 3、sink模块
maven配置
<properties>
<scala.version>2.11.8</scala.version>
<scala.binary.version>2.11</scala.binary.version>
<flink.version>1.10.0</flink.version>
<hbase.version>2.0.2</hbase.version>
</properties>
<dependencies>
<!--flink-->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>${flink.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<!-- <dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-sql-client_2.11</artifactId>
<version>${f