潜水到Apache火花流的执行模型
有这么多分布式流处理引擎可用,人们经常问我们的独特的好处Apache火花流。从早期开始,Apache火花本身提供了一个统一的引擎,支持批处理和流媒体的工作负载。这是不同于其他系统,要么只有为流处理引擎设计,或有类似的批处理和流api但内部编译不同的引擎。火花的单一批量执行引擎和统一的编程模型和流导致一些独特的好处超过其他传统流媒体系统。特别是,四个主要方面:
- 从失败中快速恢复和掉队
- 更好的负载平衡和资源使用
- 结合流媒体数据与静态数据集和交互式查询
- 本地集成先进的加工库(SQL、机器学习、图像处理)
在这篇文章中,我们概述火花流的体系结构和解释它如何提供上述好处。我们也讨论一些有趣的正在进行的工作项目,利用执行模型。
流处理架构,旧的和新的
在高级别上,现代分布式流处理管道执行如下:
- 收到流数据从数据源(如生活日志,系统遥测数据,物联网设备数据,等等)到一些数据摄取系统像Apache卡夫卡,亚马逊运动等。
- 过程数据并行集群上。这就是流处理引擎设计,我们将详细讨论。
- 输出结果下游系统像HBase,卡桑德拉,卡夫卡,等等。
处理数据,大多数传统的流处理系统的设计连续操作模式工作如下:
- 有一组的工作节点,每一个都运行一个或多个连续操作。
- 每个连续的操作符处理流数据一次一条记录,并将记录转发给其他运营商的管道。
- 有“源”运营商从摄取系统接收数据,并向下游系统“下沉”操作符输出。
连续操作符是一个简单的和自然模型。然而,今天的趋势更大的规模和更复杂的实时分析,这种传统建筑也遇到了一些挑战。我们设计了火花流满足以下要求:
- 快速失败和流浪者复苏——以更大的规模,有一个更高的集群节点失败的可能性或不可预知的减速(流浪汉)。系统必须能够自动从故障中恢复和流浪汉提供实时的结果。不幸的是,连续的静态分配操作工人节点使它具有挑战性的传统系统从故障快速恢复和掉队。
- 负载平衡——之间的处理负载人员分配不均会导致在连续操作系统瓶颈。这是更可能发生在大型集群和动态工作负载。系统需要能够根据工作负载动态调整资源分配。
- 统一的流,批处理和互动的工作负载——在许多用例,这也是吸引查询流数据交互(毕竟,流媒体系统在内存),或把它与静态数据集(如预先计算模型)。这是困难的在连续操作系统设计的动态引入新运营商特别查询。这需要一个引擎,可以结合批处理,流和交互式查询。
- 先进的分析和机器学习和SQL查询——更复杂的工作负载需要不断学习和更新数据模型,甚至查询流数据的“最新”视图使用SQL查询。再一次,有一个常见的抽象在这些分析任务使开发人员的工作更加容易。
为了解决这些需求,引发流使用一个新的体系结构离散流直接利用丰富的图书馆和容错的火花引擎。
火花流体系结构:离散流
而不是处理流数据一次一条记录,火花流可流数据成小,次秒级micro-batches。换句话说,火花并行流的接收器接受数据和缓冲火花的工人节点的内存。然后latency-optimized引发引擎运行短任务(几十毫秒)过程的批次和输出结果到其他系统。注意,不像传统的连续算子模型,计算静态分配的一个节点,火花任务动态分配给工人们基于数据的局部性和可用资源。这使得更快更好的负载平衡和故障恢复,我们会说明下。
此外,每一批的数据是一个弹性分布式数据集(抽样),这是基本的抽象容错数据集的火花。这使得处理流数据使用任何火花或库代码。
离散流处理的好处
让我们来看看这个架构允许火花流达到我们设定的目标。
动态负载均衡
将数据分成小micro-batches允许细粒度分配计算资源。例如,考虑一个简单的工作负载,输入数据流需要分区键和加工。在传统record-at-a-time大多数其他系统所采取的方式,如果其中一个分区比其他人更多的计算量,分配给进程的节点静态分区将成为一个瓶颈,降低管道。引发流,工作的任务将会自然的工人之间进行负载平衡,一些工人将处理一些任务,其他人将过程更短的任务。
快速失败和流浪者复苏
在节点故障的情况下,传统的系统重新启动失败的另一个节点上连续算子和回放部分数据流验算丢失的信息。请注意,只有一个节点处理重新计算,和管道无法继续进行,直到新节点后回放。在火花,计算已经离散成小,确定性的任务可以在任何地方运行而不影响正确性。所以可以重新启动失败的任务在平行在集群中的所有其他节点,从而均匀分配所有的重新计算在许多节点,和从失败中恢复的速度比传统方法。
统一批、流和交互式分析
火花的关键编程抽象流DStream,或分布式流。每批抽样流数据表示,这是引发一个分布式数据集的概念。因此DStream只是一系列抽样。这个公共表示允许批处理和流负载无缝互操作。用户可以将任意的火花函数应用于每批流数据:例如,它很容易加入一个DStream预先计算的静态数据集(作为一个抽样)。
//创建数据集从Hadoop文件val数据集=sparkContext.hadoopFile(“文件”)//加入每一个批处理在流与数据集kafkaDStream。变换{batchRDD=>batchRDD.join(数据集)。过滤器(…)}
自批流数据存储在火花的工人内存,它可以交互式地查询需求。例如,您可以让所有通过流状态火花SQLJDBC服务器,在下一节中我们将展示。这种统一的批处理,流在火花和互动的工作负载很简单,但很难实现这些工作负载的系统没有一个共同的抽象。
先进的分析和机器学习和交互式SQL
火花互操作性延伸到丰富的图书馆像MLlib(机器学习),SQL, DataFrames, GraphX。让我们探索一些用例:
流+ SQL和DataFrames
抽样由DStreams可以转化成DataFrames(火花SQL编程接口),并与SQL查询。例如,使用SQL的火花JDBC服务器,你可以公开的状态流会谈任何外部应用程序的SQL。
val hiveContext =新HiveContext (sparkContext)/ /……wordCountsDStream。foreachRDD {抽样= >/ /转换随机数字拨号改为DataFrame并注册它作为SQL表val wordCountsDataFrame = rdd.toDF (“单词”,“数”)wordCountsDataFrame.registerTempTable (“word_counts”)}/ /……/ /启动JDBC服务器HiveThriftServer2.startWithContext (hiveContext)
然后你可以交互式地查询不断更新“word_counts”表通过JDBC服务器,使用直线客户机附带火花,或表等工具。
>显示表;+- - - - - - - - - - - - - + - - - - - - - - - - - - - +|的表|isTemporary|+- - - - - - - - - - - - - + - - - - - - - - - - - - - +|word_counts|真正的|+- - - - - - - - - - - - - + - - - - - - - - - - - - - +1行选择(0.102秒)>选择*从word_counts;+- - - - - - - - - - - - - - - - - - - - - - + +|词|数|+- - - - - - - - - - - - - - - - - - - - - - + +|2015年|264年||PDT|264年||21:45:41|27|
流+ MLlib
机器学习模型生成离线MLlib可以应用于流媒体数据。例如,下面的代码列车KMeans聚类模型和一些静态数据,然后使用该模型对事件进行分类在卡夫卡数据流。
/ /离线学习模型= KMeans val模型。火车(数据集,…)/ /应用模型在线val kafkaStream = KafkaUtils.createDStream (…)kafkaStream。{地图事件= >model.predict (featurize(事件)}
我们证明这offline-learning-online-prediction火花峰会2014砖演示。从那时起,我们还添加了流媒体在MLLib机器学习算法,可以从一个标签的数据流持续训练。其他火花库也可以很容易地从引发流。
性能
鉴于火花流的独特设计,运行的速度有多快?在实践中,火花流批处理数据的能力,利用火花会导致类似或引擎更高的吞吐量其他流媒体系统。的延迟,火花流可以实现延迟低至几百毫秒。开发人员有时会问是否micro-batching本质上增加了太多的延迟。在实践中,批处理延迟只是一小部分管道的端到端延迟。例如,许多应用程序计算结果在一个滑动窗口,即使在连续操作系统,这个窗口只是定期更新(如20秒窗口,幻灯片每2秒)。许多管道从多个来源收集记录,等待一段过程推迟或无序的数据。最后,任何自动触发算法往往会等待一段时间触发器。因此,相比,端到端延时,配料很少增加显著的开销。事实上,吞吐量收益DStreams往往意味着需要更少的机器来处理相同的工作负载。
火花流媒体未来的发展方向
火花流是一种最广泛使用的组件在火花,为流媒体用户和有更多。最高优先级的项目我们的团队正在讨论如下。你可以期待在接下来的几个版本的火花:
- 反压力——流工作负载可以经常爆发的数据(如突然激增推在奥斯卡奖)和处理系统必须能够优雅地处理它们。在即将到来的火花1.5版本(下个月),火花将更好的反压力机制,允许添加火花流动态控制摄入率这样的爆发。这个特性代表了我们之间的合作在砖和工程师的类型安全。
- 动态扩展——控制摄入率可能不足以处理时间条件数据速率的变化(如白天推率持续高于晚上)。这样的变化可以由动态扩展集群资源根据加工要求。这是非常容易做到火花串流架构内,由于计算已经分成小任务,他们可以动态地分配给一个更大的集群,如果更多的节点获得集群管理器(纱、便、Amazon EC2等)。我们计划增加支持自动缩放。
- 事件时间和无序的数据——实际上,用户有时有记录的顺序传递,或与一个不同于摄取的时间的时间戳。火花流将支持“事件”,允许用户定义的时间提取功能。这将包括一个松弛时间为晚或无序的数据。
- UI的改进——最后,我们想要方便开发人员调试他们的流媒体应用程序。为此,在火花1.4中,我们添加了新的可视化流火花UI让开发人员密切关注他们的应用程序的性能。在火花1.5中,我们进一步提高通过展示更多输入信息就像卡夫卡补偿在每一批处理。