欢迎大家来到IT世界,在知识的湖畔探索吧!
阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。
01 简介
Spark Streaming是目前相对流行的实时流处理框架,但准确来说spark底层是通过一个微批处理来模拟实时处理,相对来说,某些场景下实时性欠缺,无法对应一些实时性要求很高的流处理场景,譬如双十一场景下的销售额统计等。
这是因为 Spark的流处理是基于所谓微批处理( Micro- batch processing)的思想,即它把流处理看作是批处理的一种特殊形式,每次接收到一个时间间隔的数据才会去处理,底层微批设计导致很难在表层实时数据处理上有质的提升。
虽然Spark2.3中提出了连续处理模型( Continuous Processing Model),但目前只支持很有限的功能,并不能在大的项目中使用,业界也无成熟的应用案例。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的窗口操作),更是支持基于数据时间及水位线的窗口设置,自由度更大,时间窗口变量考量更充分,开发者可以自由定义想要的窗口操作。
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)
04 Flink简要安装使用示例
1)要运行Flink,要求必须安装好Java 8.x。 使用如下命令检查Java是否已经正确安装:
2)下载Flink安装包,可以选择任何喜欢的Scala组合,如下所示
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
欢迎大家来到IT世界,在知识的湖畔探索吧!
4)以本地模式启动Flink
欢迎大家来到IT世界,在知识的湖畔探索吧!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,如下图所示
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文件的配置如下
欢迎大家来到IT世界,在知识的湖畔探索吧!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类,打印输出计算结果,如图所示:
05 总结
至此《一文秒懂大数据流实时处理框架Flink与Spark的异同点》就讲完了,有任何问题欢迎大家留言,最后如果喜欢本篇文章不要忘了点赞、关注与转发哦!
-END-
@IT管理局专注计算机领域技术、大学生活、学习方法、求职招聘、职业规划、职场感悟等类型的原创内容。期待与你相遇,和你一同成长。
相关文章:
- 程序员也需了解的主流云计算网络架构
- 程序员必懂的Redis技术实战
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/52025.html