连续应用:发展流在Apache 2.0火花
自发布以来,引发流已经成为使用最广泛的国家之一分布式流媒体引擎,由于其高层API,仅一次语义。然而,随着这些类型的引擎变得普遍,我们发现开发人员常常需要的不仅仅是一个流编程模型构建实时应用程序。在砖,我们曾与成千上万的用户了解如何简化实时应用程序。在这篇文章中,我们提出的想法,连续应用程序通过的,我们已经开始实施结构化流API在Apache 2.0火花。
大多数流引擎关注执行计算流:例如,你可以将流映射到每个记录上运行一个函数,它聚合事件减少,等等。然而,我们与用户合作,我们发现几乎没有的用例流引擎只涉及对一个流进行计算。相反,流处理发生作为一个更大的应用程序的一部分,我们马上打电话叫一个连续应用程序。下面是一些例子:
- 将在实时更新数据。例如,开发人员可能希望更新一个汇总表,用户通过一个web应用程序将查询。在这种情况下,大部分的复杂性是流引擎之间的交互和服务系统:例如,你可以在表上运行查询时流引擎更新吗?“完整的”应用程序是一个实时的服务系统,而不是一个地图或减少在流。
- 提取、转换和加载(ETL)。一个常见的用例是不断移动,将数据从一个存储系统到另一个(例如一个JSON日志Apache蜂巢表)。这需要仔细的与存储系统,以确保没有重复或丢失数据——大部分的逻辑协调工作。
- 创建一个现有的批处理作业的实时版本。这是很困难的,因为许多流系统不保证他们的比赛结果将批处理作业。例如,我们已经看到公司建造现场仪表盘使用流引擎和每日报告使用批处理作业,只有有顾客抱怨他们的日常报告(或更糟的是,比尔!)不匹配的生活指标。
- 在线机器学习。这些连续应用程序通常结合大型静态数据集,使用批处理作业,处理与实时数据和实时预测服务。
这些例子表明,流计算是应用程序的一部分,包括服务、存储、或批处理作业。不幸的是,在目前的系统中,流计算上运行自己的,只关注流在一个引擎。这让开发人员负责与外部系统交互的复杂的任务(例如,管理事务),使其结果符合应用程序的其余部分(例如,批处理作业)。这就是我们想解决与连续应用程序。
连续应用程序
我们定义了一个连续的应用端到端应用程序,对数据进行实时的反应。特别是,我们希望开发人员使用单独的编程接口支持方面的持续应用程序正在处理在单独的系统中,如查询服务或与批处理作业的交互。例如,在这里我们将如何处理上述用例:
- 实时更新数据,将服务。开发人员将编写星星之火应用程序处理更新和服务(例如通过火花的JDBC服务器),或者使用一个API,可以自动执行事务服务系统上更新像MySQL,复述或Apache Cassandra。
- 提取、转换和加载(ETL)。开发人员只会列出所需的转换作为批处理作业,和流媒体系统将处理协调与存储系统来确保只有一次处理。
- 创建一个现有的批处理作业的实时版本。流媒体系统将保证结果总是符合相同的数据的批处理作业。
- 在线机器学习。的机器学习库将设计结合实时培训,定期分批培训,和预测服务相同的API。
下图显示了哪些问题通常是处理流引擎,并需要在连续应用程序:
结构化流
结构化流是我们一个新的高层API为Apache火花2.0支持连续应用。第一,这是一个高级的API比引发流,引进其他结构化的思想火花(DataFrames和数据集)的API——值得注意的是,执行数据库查询优化的一种方法。然而,更重要的是,结构化流也包含了连续应用程序提供一系列的想法没有其他流引擎提供的功能。
- 强大的担保和批处理作业的一致性。用户指定一个流计算通过写一个批处理计算(使用火花DataFrame /数据集API),并自动引擎incrementalizes这个计算(连续运行它)。在任何时候,结构化的输出流的工作相同的运行批处理作业在一个前缀的输入数据。最新的流媒体系统(例如Apache风暴,卡夫卡流,谷歌数据流和Apache Flink)不提供这种“前缀完整性”属性。
- 事务与存储系统的集成。我们有照顾的内部设计以事务的方式来处理数据,然后更新输出下沉,所以服务应用程序总是看到一致的快照数据。而火花2.0版本只支持几个数据源(HDFS和S3),我们计划在未来的版本中添加更多。事务更新是一个顶尖的痛点火花和其他流媒体系统,用户的要求手工工作,所以我们兴奋地让这些核心API的一部分。
- 紧密集成与火花。结构化流媒体服务支持交互式查询流状态火花SQL和JDBC,集成了MLlib。这些集成只是火花2.0开始,但会在将来的版本中。因为结构化流基于DataFrames,许多其他图书馆的火花自然会运行在它(例如,所有功能转换MLlib书面反对DataFrames)。
除了这些独特的特点,结构简化流流有其他新功能,如明确支持“活动时间”总订单数据,和更丰富的支持窗口和会话。容错的方式实现其一致性语义也不是easy-see我们姐姐的博客API和执行模型。
结构化流仍在α在火花2.0中,但我们希望你试试和发送反馈。我们的团队和许多其他社区成员将扩大它在接下来的几个版本。
一个例子
结构化流作为一个简单的例子,下面的代码显示了提取、转换和加载(ETL)工作,将JSON数据转化为Apache拼花。注意结构化流直接使用DataFrame API,所以几乎是相同的一批版本的代码。
(行网格=“是”)
[坳x = " 12 " md =“6”)
//连续读取JSON从S3logsDF=spark.readStream.json (s3: / /日志)//变换与DataFrame API和保存logsDF.select (“用户”,“url”,“日期”).writeStream.parquet (s3: / /)。开始()
[/坳]
[坳x = " 12 " md =“6”)
/ /读取JSON一旦从S3logsDF = spark.read.json (“s3: / /日志”)/ /变换DataFrame API并保存logsDF.select (“用户”,“url”,“日期”).write.parquet (“s3: / /”)
[/坳]
[/行]
虽然表面看来的代码简单,火花在引擎盖下面做了很多工作,如分组数据为拼花的分区,确保每条记录出现在输出完全一次,恢复工作的状态,如果你重新启动它。最后,这个数据交互式地而不是写拼花,我们可以改变writeStream使用(目前α)内存中沉和JDBC客户机连接到火花来查询。
长期愿景
我们的长期愿景流火花雄心勃勃:我们希望每个图书馆火花在结构化流以增量的方式工作。尽管这是一个大目标,Apache火花将实现它。它的库已经建立在普遍,狭窄的api(抽样和DataFrames),和结构化流明确给设计结果符合这些统一的接口。
火花开始以来最大的见解是,开发人员需要统一的接口。例如,批处理计算集群用于需要许多分离系统(MapReduce的ETL、蜂巢的SQL, Giraph图,等等),复杂的开发和运营。火花统一这些工作负载在一个引擎,大大简化这两个任务。相同的见解应用于流媒体。因为流负载通常是一个更大的连续应用程序的一部分,它可能包括服务、存储、和批处理作业,我们希望提供一个统一的API构建端到端连续应用程序和系统。
阅读更多
我们的结构化流模型博客文章中更详细地探讨了流API和执行模型。我们建议你读这篇文章开始使用结构化的流。
此外,以下资源覆盖结构化流: