一文秒懂大数据流实时处理框架Flink与Spark的异同点

一文秒懂大数据流实时处理框架Flink与Spark的异同点阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。

大家好,欢迎来到IT知识分享网。

一文秒懂大数据流实时处理框架Flink与Spark的异同点

阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。

01 简介

一文秒懂大数据流实时处理框架Flink与Spark的异同点

Spark Streaming是目前相对流行的实时流处理框架,但准确来说spark底层是通过一个微批处理来模拟实时处理,相对来说,某些场景下实时性欠缺,无法对应一些实时性要求很高的流处理场景,譬如双十一场景下的销售额统计等。

这是因为 Spark的流处理是基于所谓微批处理( Micro- batch processing)的思想,即它把流处理看作是批处理的一种特殊形式,每次接收到一个时间间隔的数据才会去处理,底层微批设计导致很难在表层实时数据处理上有质的提升。

虽然Spark2.3中提出了连续处理模型( Continuous Processing Model),但目前只支持很有限的功能,并不能在大的项目中使用,业界也无成熟的应用案例。Spark还需要做出很大的努力才能改进现有的准实时流处理模型。想要在流处理的实时性上提升,就不能继续用微批处理的模式,而要想办法实现真正的流处理即每当有一条数据输入就立刻处理,不做等待。

一文秒懂大数据流实时处理框架Flink与Spark的异同点

Flink最核心的数据结构是Stream,它代表一个运行在多分区上的并行流。在 Stream 上同样可以进行各种转换操作(Transformation)。与 Spark 的 RDD 不同的是,Stream 代表一个数据流而不是静态数据的集合。

所以,它包含的数据是随着时间增长而变化的。而且 Stream 上的转换操作都是逐条进行的,即每当有新的数据进来,整个流程都会被执行并更新结果。这样的基本处理模式决定了 Flink 会比 Spark Streaming 有更低的流处理延迟性。

02 Spark与Flink的异同点

(1)相同点

Spark和Flink都支持批处理和流处理,两者在数据处理框架上具有一定的一致性。

1)都基于内存计算;

2)都有统一的批处理和流处理APl,都支持类似SQL的编程接口;

3)都支持很多相同的转换操作,编程都是用类似于Scala Collection APl的函数式编程模式;

4)都有完善的错误恢复机制;

5)都支持Exactly once的语义一致性。

(2)不同点

在具体实时处理细节上,两者仍存在一定的差异。从流处理的角度来讲,Spark基于微批量处理,把流数据看成是一个个小的批处理数据块分别处理,所以延迟性只能做到秒级。而Flink基于每个事件处理,每当有新的数据输入都会立刻处理,是真正的流式计算,支持毫秒级计算。由于相同的原因,Spark只支持基于时间的窗口操作(处理时间或者事件时间),而Flink支持的窗口操作则非常灵活,不仅支持时间窗口,还支持基于数据本身的窗口(另外还支持基于time、count、session,以及data-driven的窗口操作),更是支持基于数据时间及水位线的窗口设置,自由度更大,时间窗口变量考量更充分,开发者可以自由定义想要的窗口操作。

一文秒懂大数据流实时处理框架Flink与Spark的异同点

03 Flink功能特征

(1)处理特征

Flink具有如下的处理特征:

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、排序等昂贵操作,中间结果有必要进行缓存

(2)数据处理API

Flink主要支持如下的两个数据处理API:

1)DataStream API (流处理)

2)DataSet API(批处理)

(3)场景支持

Flink的主要使用场景如下:

1)支持机器学习(FlinkML)

2)支持图分析(Gelly)

3)支持关系数据处理(Table)

4)支持复杂事件处理(CEP)

一文秒懂大数据流实时处理框架Flink与Spark的异同点

04 Flink简要安装使用示例

1)要运行Flink,要求必须安装好Java 8.x。 使用如下命令检查Java是否已经正确安装:

一文秒懂大数据流实时处理框架Flink与Spark的异同点

2)下载Flink安装包,可以选择任何喜欢的Scala组合,如下所示

一文秒懂大数据流实时处理框架Flink与Spark的异同点

3)将安装包下载到指定目录,解压缩后进入Flink应用目录

1. nbsp;tar -xzf flink-1.12.0-bin-scala_2.12.tgz  
2. nbsp;cd flink-1.12.0-bin-scala_2.12  

4)以本地模式启动Flink

1. nbsp;./bin/start-cluster.sh  
2. Starting cluster.  
3. Starting standalonesession daemon on host.  
4. Starting taskexecutor daemon on host.  

5)浏览器中访问8081端口,查看Flink WebUI,如下图所示

一文秒懂大数据流实时处理框架Flink与Spark的异同点

6)通过Flink实现单词数的统计(WordCount)的Pom.xml文件配置如下

1. <?xml version="1.0" encoding="UTF-8"?>  
2. <project xmlns="http://maven.apache.org/POM/4.0.0"  
3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0             http://maven.apache.org/xsd/maven-4.0.0.xsd">  
5.     <modelVersion>4.0.0</modelVersion>  
6.     <groupId>helloword</groupId>  
7.     <artifactId>helloword</artifactId>  
8.     <version>1.0-SNAPSHOT</version>  
9.     <dependencies>  
10.         <dependency>  
11.             <groupId>org.apache.flink</groupId>  
12.             <artifactId>flink-clients_2.12</artifactId>  
13.             <version>1.11.2</version>  
14.         </dependency>  
15.         <dependency>  
16.             <groupId>org.apache.flink</groupId>  
17.             <artifactId>flink-connector-kafka-0.11_2.12</artifactId>  
18.             <version>1.11.2</version>  
19.         </dependency>  
20.         <dependency>  
21.             <groupId>org.apache.flink</groupId>  
22.             <artifactId>flink-scala_2.12</artifactId>  
23.             <version>1.11.2</version>  
24.         </dependency>  
25.         <dependency>  
26.             <groupId>org.apache.flink</groupId>  
27.             <artifactId>flink-streaming-scala_2.12</artifactId>  
28.             <version>1.11.2</version>  
29.         </dependency>  
30.         <dependency>  
31.             <groupId>org.slf4j</groupId>  
32.             <artifactId>slf4j-log4j12</artifactId>  
33.             <version>1.7.21</version>  
34.             <scope>test</scope>  
35.         </dependency>  
36.         <dependency>  
37.             <groupId>log4j</groupId>  
38.             <artifactId>log4j</artifactId>  
39.             <version>1.2.17</version>  
40.         </dependency>  
41.     </dependencies>  
42.     <build>  
43.         <plugins>  
44.             <plugin>  
45.                 <groupId>net.alchim31.maven</groupId>  
46.                 <artifactId>scala-maven-plugin</artifactId>  
47.                 <version>4.4.0</version>  
48.                 <executions>  
49.                     <execution>  
50.                         <goals>  
51.                             <goal>compile</goal>  
52.                         </goals>  
53.                     </execution>  
54.                 </executions>  
55.             </plugin>  
56.             <plugin>  
57.                 <groupId>org.apache.maven.plugins</groupId>  
58.                 <artifactId>maven-assembly-plugin</artifactId>  
59.                 <version>3.0.0</version>  
60.                 <configuration>  
61.                     <descriptorRefs>  
62.                         <descriptorRef>jar-with-dependencies</descriptorRef>  
63.                     </descriptorRefs>  
64.                 </configuration>  
65.                 <executions>  
66.                     <execution>  
67.                         <id>make-assembly</id>  
68.                         <phase>package</phase>  
69.                         <goals>  
70.                             <goal>single</goal>  
71.                         </goals>  
72.                     </execution>  
73.                 </executions>  
74.             </plugin>  
75.         </plugins>  
76.     </build>  
77. </project>  

7)实现WordCount的Scala文件的配置如下

1. import org.apache.flink.api.scala._  
2. import org.apache.flink.api.scala.ExecutionEnvironment  
3. object WordCount {  
4.   def main(args: Array[String]): Unit = {  
5.     val env: ExecutionEnvironmentExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment  
6.     val inputPath: String = "E:\\IdeaProjects\\helloword\\src\\main\\resources\\hello.txt"  
7.     val inputDataSet: DataSet[String] = env.readTextFile(inputPath)  
8.     val resultDataSet: DataSet[(String,Int)] = inputDataSet.flatMap(_.split(" "))  
9.       .map((_, 1))  
10.       .groupBy(0)  
11.       .sum(1)  
12.     resultDataSet.print()  
13.   }  
14. }  

8)将测试数据写入hello.txt 文件中,运行WordCount类,打印输出计算结果,如图所示:

一文秒懂大数据流实时处理框架Flink与Spark的异同点

05 总结

至此《一文秒懂大数据流实时处理框架Flink与Spark的异同点》就讲完了,有任何问题欢迎大家留言,最后如果喜欢本篇文章不要忘了点赞、关注与转发哦!

-END-

@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。

相关文章:

  • 程序员也需了解的主流云计算网络架构
  • 程序员必懂的Redis技术实战
一文秒懂大数据流实时处理框架Flink与Spark的异同点

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/62543.html

(0)
上一篇 2024-05-17 09:33
下一篇 2024-05-17 15:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信