The world beyond batch Streaming 101
流数据处理对于现今的大数据来说是一件大事,并且有充分的理由。其中: 企业渴望获得更及时的数据,切换到流处理是实现更低延迟的好方法。 现代业务中越来越常见的大量无限数据集使用专为这种永无止境的数据量而设计的系统更容易被驯服。 在数据到达时处理数据,随着时间的推移将工作负载分布得更均匀,从而产生更一致且可预测的资源消耗。 Background 首先,我将介绍一些重要的背景信息,这些信息将有助于构思我想讨论的其他主题。我们将在三个特定的部分完成此操作: Terminology: 精确地谈论复杂的话题需要对术语进行精确的定义。对于一些在当前使用中已经超负荷解释的术语,我会尽力确定我说的时候的意思。 Capabilities: 我会谈谈流媒体系统的常识缺点。我还会提出我认为数据处理系统制造商需要采用的思维框架,以满足现代数据用户的需求。 Time domains: 我将介绍与数据处理相关的两个主要时间领域,展示它们之间的关系,并指出这两个领域带来的一些困难。 Terminology: What is streaming? 问题的症结在于许多应该由它们所描述的东西(例如,无限数据处理,近似结果等)已经通过它们历史上已经完成的方式来口头描述(即,通过流式传输执行引擎)。术语精确度的缺乏决定了流传输的真正含义,并且在某些情况下,流传输系统本身的负担会加重,这意味着它们的能力限于经常被描述为 “流” 的特性,如近似或推测性结果。鉴于精心设计的流媒体系统与任何现有的批量引擎一样能够(技术上更加如此)产生正确,一致,可重复的结果,因此我更愿意将术语 “流” 分离为一个非常具体的含义:一种数据处理引擎设计时考虑了无限的数据集。而已。 (为了完整性,或许值得一提的是,这个定义包括真正的流媒体和微批量实现。) 这里有几个我经常听到的,每个都有更精确的描述性术语: Unbounded data: 一种不断增长的,实质上无限的数据集。这些通常被称为 “流数据”。然而,流应用或批处理术语在应用于数据集时存在问题,因为如上所述,它们意味着使用某种类型的执行引擎来处理这些数据集。所讨论的两类数据集之间的关键区别实际上是它们的有限性,因此最好用描述它们的术语来描述它们。因此,我将把无限的 “流式” 数据集称为无界数据,将有限的 “批处理” 数据集称为有界数据。 Unbounded data processing: 一种持续的数据处理模式,适用于上述类型的无界数据。尽管我个人喜欢使用术语流来描述这种类型的数据处理,但在这种情况下它的使用又意味着使用流式执行引擎,这充其量是误导性的; 由于批量系统首先被构想出来(相反,设计良好的流式系统不仅能够处理超过有界数据的 “批量” 工作负载),所以批处理引擎的重复运行已用于处理无界数据。因此,为了清楚起见,我将简单地称之为无限数据处理。 Low-latency, approximate, and/or speculative results: 这些类型的结果通常与流引擎相关联。事实上,批处理系统传统上没有考虑到低延迟或推测性结果,这是一个历史人为因素,仅此而已。当然,批量发动机如果有指导,完全可以产生近似的结果。因此,与上述条款一样,将这些结果描述为它们(低延迟,近似和 / 或推测)比通过历史流式(通过流式引擎)如何表现要好得多。 从这里开始,任何时候我使用术语 “streaming”,你都可以安全地假设我的意思是一个为无界数据集设计的执行引擎,仅此而已。当我指上述任何其他术语时,我将明确地说出无限数据,无限数据处理或低延迟 / 近似 / 推测结果。这些是我们在 Cloud Dataflow 中采用的术语,我鼓励其他人采取类似的立场。 On the greatly exaggerated limitations of streaming: 接下来,让我们谈一谈流式系统可以做什么和不可以做什么,重点放在能做的上; 我想在这些帖子中看到的最重要的事情之一就是设计良好的流式传输系统的性能如何。流式传输系统长期以来一直处于一个提供低延迟,不准确 / 推测结果的利基市场,通常与更强大的批处理系统相结合以提供最终的正确结果,即 Lambda 架构。 对于那些还不熟悉 Lambda Architecture 的人来说,其基本思想是,您可以在批处理系统旁边运行流式处理系统,两者执行基本相同的计算。流式传输系统为您提供低延迟,不准确的结果(或者因为使用近似算法,或者因为流式传输系统本身不能提供正确性),并且一段时间后,批处理系统会一路滚动并为您提供正确的输出。最初由 Twitter 的 Nathan Marz(Storm 的创始人)提出,它最终取得了相当的成功,因为它实际上是一个很棒的想法。流媒体引擎在正确性部门中有点令人失望,批量引擎如你所期望的那样固有地笨重,所以 Lambda 给了你一种方法来让你的谚语蛋糕也吃掉。不幸的是,维护 Lambda 系统非常麻烦:您需要构建,配置和维护两个独立版本的管道,然后以某种方式合并最后两条管道的结果。...