千机游戏提供最新游戏下载和手游攻略!

阿里、腾讯、华为纷纷追逐的新一代大数据引擎Flink到底有多厉害?引擎数据为空

发布时间:2024-06-09浏览:50

为什么我们需要流式计算?批处理与流式计算

在详细介绍Flink之前,有必要先为还不熟悉该领域的朋友简单普及一下批计算和流计算的概念。

批量,顾名思义就是对一批数据进行计算。批量计算在我们身边随处可见。批量计算最简单的例子有:微信运动每天晚上都会有一个批量任务,统计用户好友一天走了多少步,给出一个排名结果,并推送给用户;银行信用卡中心在每月结算日都会有一个批量任务,统计一个月的总消费,出具月度账单,并发送给用户;国家统计局每个季度都会统计一次经济数据,公布季度GDP增长率。可以看出,批量任务一般都是在一段时间的数据汇总之后进行处理的。对于海量数据的应用,比如微信运动、银行信用卡等,一段时间的数据总量非常大,计算起来非常耗时。

批量计算的历史可以追溯到计算机刚刚起步的20世纪60年代,目前最为广泛的应用是数据仓库中的ETL(Extract Transform Load)数据转换工作,例如以Oracle为代表的商业数据仓库,以及以Hadoop/Spark为代表的开源数据仓库。

流媒体

但数据其实是以流的形式不断产生的。我们的体育数据会时刻积累在手机传感器上,金融交易随时随地都会发生,用户无时无刻不在用着手机APP并产生用户行为,微观和宏观的经济行为也不断发生。个人用户觉得每晚查一次微信体育排行榜是比较舒服的节奏,但对于商业世界来说,时间就是金钱,而且是以百万、千万、甚至数亿美元计算的!获取实时信息是非常必要的。比如双十一电商大促期间,管理者需要在秒级查看自己的实时销售业绩、库存信息以及与竞品的对比结果,获得更多的决策时间和空间;库存交易要以毫秒为单位响应新信息;风控要快速处理每一笔欺诈交易,减少不必要的损失;网络运营商要快速发现网络和数据中心故障等等。以上场景,一旦发生故障,就会造成服务延迟,损失难以估计。 因此响应速度越快,越能减少损失,增加收益。物联网和5G通信的兴起,将为数据生成提供更完善的底层技术基础,海量数据将在物联网设备上采集、生成,并通过更高速的5G通道传输到服务器,更大规模的实时数据流将激增,实时处理的需求必将爆发式增长。

实时数据不断生成

为什么我们需要一个可靠的流式计算引擎?

处理实时流的平台通常被称为流式计算平台或实时计算平台。我们用下面的例子来解释为什么要使用可靠的流式计算引擎。

业务场景:股票交易

我们都知道股票交易非常依赖各种信息,2015年Flink官网就提供了一个股票价格和Twitter实时微博关联分析的案例。在特朗普当政的今天,建立这样的系统是非常有必要的,他关于贸易战的推文,可能会引起全球股市的剧烈震荡。作为人类,我们不可能24小时盯着特朗普的推特,如果有一个自动化的系统来做一些分析预警,会为决策者争取更多的时间。

假设我们有几条股票交易数据流,我们可以用这些数据流计算 10 秒时间窗口内的股价波动情况,选取变化率超过 5% 的股票,并把这些股票与 Twitter 的实时文本数据进行关联分析,判断 Twitter 上哪些讨论影响了股价。当关联分析的结果足够有说服力时,就可以将系统部署到生产环境,实时处理股票和 Twitter 数据,生成分析报告,发送给股票交易员。那么,我们如何构建一个可靠的程序来解决上述业务场景问题呢?

生产者消费者模型

生产者消费者模型

“生产者-消费者”模型一般用于处理流式数据。一个或多个生产者产生数据并将数据发送到一个缓存区域,一个或多个消费者从缓存区域消费数据。这里我们不关心生产者如何生产数据和数据缓存,我们只关心如何实现消费者。

问题

引擎数据为空什么意思_引擎数据为空_大数据引擎

在实现消费者时,我们可以启动一个进程,统计 10 秒窗口内数据流中的交易,并找出波动最大的股票。同时,程序还会分析新输入的 Twitter 文本。这个逻辑看似很容易实现,但深入挖掘后,我们会发现很多问题。

可扩展性

在计算节点上写程序应该很容易。但我们知道推特的数据量非常大,每秒几千条消息,每天几亿条消息。一般单个计算机节点无法处理这么大的数据量。这时候就需要多节点并行处理了。如何把数据分成多份,发到多个节点呢?每个节点只处理一部分数据。我们不知道哪笔交易、哪条微博分到哪个节点。每个节点只是整个宏观交易的一个局部视角。我们无法得到宏观的视角,但老板只关心总数。我们是不是也需要跨节点聚合,把各个节点的数据合并到一起?一旦数据量变大,事情就开始变得复杂了。

容错

如果特朗普发了一条关于增加关税的推文,在某一时刻引发了非常激烈的讨论,导致数据突然增加,程序崩溃了。程序重启后,如何恢复之前的计算?如果程序只在单个节点上进行处理,除了数据吞吐量低之外,还存在单点风险,一旦单个节点发生故障,就会影响整个业务。如果程序使用多个节点进行处理,则需要一个故障恢复的机制。

事件混乱

由于网络状况等潜在影响因素,数据流中的时间并不会按照最初发生的时间 100% 到达消费者。比如你想统计上午 11:00:00 到 11:00:10 之间的交易,但是 11:00:05 发生的一笔交易由于网络延迟而迟迟未到达。这时候我们是不是应该直接放弃这笔交易呢?大多数情况下我们都会让程序等待,比如我们会假设数据最迟不会延迟超过 10 分钟,因此程序就会等待 10 分钟。等待的实现是可以接受的,但是如果有多个节点并行处理呢?每个节点都要等待一段时间,最终聚合的节点要等待的时间就更长了。

Apache Flink

Apache Flink 就是为了解决上述问题而诞生的。如果使用 Flink 来解决上面提到的股票建模,只需要设置一个时间窗口,在这个时间窗口内进行一些数据处理操作即可。还可以根据数据量的大小设置并行处理的节点数。有兴趣的朋友可以去 Flink 官网阅读这个案例的代码。

使用Flink计算股票波动:

Flink 不仅提供了大量简单易用的 API,高数据吞吐量、低处理延迟等优势远超其他大数据处理引擎,而且可以适应多节点并行场景,具备很强的可扩展性和容错能力。

在Flink之前,已经有很多流处理引擎,比较著名的有Storm、Spark Streaming,但是它们的一些功能远远不如Flink。

流式计算引擎的演进

第一代被广泛采用的流式计算引擎是Storm,它以数据流中的事件作为计算的最小单位,这一点和Flink是一致的。基于事件的框架的优点是延迟非常低。由于其他地方实现不同,Storm的数据吞吐量和延迟在很多benchmark中远不如Flink。Storm只支持“至少一次”和“最多一次”,即数据流中的事件传递只能保证至少一次或最多一次,而不能保证“仅一次”。对于很多对数据准确性要求很高的应用来说,Storm有一定的劣势。另外Storm不支持​​SQL,也不支持中间状态。

第二代非常流行的流式计算引擎是Spark Streaming。Spark是占据市场主导地位的批量大数据处理引擎。为了适应流式计算的场景,Spark的子项目Spark Streaming采用了mini-batch的思想,每次只处理一小批数据。一小批数据中包含多个事件,从而达到近乎实时的处理效果。由于它每次计算一小批数据,所以总会存在一定的延迟。不过Spark Streaming的优势在于有Spark作为后盾,从Spark迁移到Spark Streaming的成本相对较低,因此可以为用户提供集流式和批式计算于一体的计算引擎。

Flink 是不同于以上两代框架的新一代计算引擎。根据 Flink 官方最新的解释,它是一个支持在有界和无界数据流上进行状态计算的大数据引擎。它同样基于事件,支持 SQL、State、WaterMark 等特性。它支持“exactly once”,即事件传递保证只发生一次,不多不少,这样可以提高数据的准确性。与 Storm 相比,它吞吐量更高、延迟更低、准确性有保证;与 Spark Streaming 相比,它以事件为单位,实现真正意义上的实时计算,并且需要的计算资源相对较少。

前面提到过,数据是以流的形式产生的,数据又分为有界和无界,批处理其实就是有界的数据流,是流处理的一个特例,所以Flink也是一个同时支持流式和批式计算的大数据引擎。

热点资讯