Spark2.0 StructuredStreaming

流式计算的现状

大多数的流式计算引擎(比如storm、spark streaming等)都仅仅关注流数据的计算方面:比如使用一个map函数对一个流中每条数据都进行转换,或者是用reduce函数对一批数据进行聚合。但是,实际上在大部分的流式计算应用中,远远不只是需要一个流式计算引擎那么简单。相反的,流式计算仅仅在流式应用中占据一个部分而已。因此现在出现了一个新的名词,叫做持续计算/应用,continuous application。比如以下一些持续应用的例子:

1、更新需要以服务形式实时提供出去的数据:例如,我们可能需要更新一份数据,然后其他用户会通过web应用来实时查询这些数据。这种情况下,一个技术难题就是实时计算应用如何与实时数据服务进行交互,比如说,当实时计算应用在更新数据的时候,如果用户通过实时数据服务来进行查询,此时该如何处理?因此为了处理这种场景下的技术难题,就必须以一个完整的持续计算应用的方式来构建整个系统,而不是站在实时计算的角度,仅仅考虑实时更新数据。
2、实时ETL(Extract、Transform和Load):实时计算领域一个常见的应用就是,将一个存储系统中的数据转换后迁移至另外一个存储系统。例如说,将JSON格式的日志数据迁移到Hive表中。这种场景下的技术难题就在于,如何与两边的存储系统进行交互,从而保证数据不会丢失,同时也不会发生重复。这种协调逻辑是非常复杂的。
3、为一个已经存在的批量计算作业开发一个对应的实时计算作业:这个场景的技术难题在于,大多数的流式计算引擎都无法保证说,它们计算出的结果是与离线计算结果相匹配的。例如说,有些企业会通过实时计算应用来构建实时更新的dashboard,然后通过批量计算应用来构建每天的数据报表,此时很多用户就会发现并且抱怨,离线报表与实时dashboard的指标是不一致的。
4、在线机器学习:这类持续计算应用,通常都包含了大型的静态数据集以及批处理作业,还有实时数据流以及实时预测服务等各个组件。

Spark 2.0中,引入的structured streaming,就是为了实现上述所说的continuous application,也就是持续计算的。首先,structured streaming是一种比spark更高阶的api,主要是基于spark的批处理中的高阶api,比如dataset/dataframe。此外,structured streaming也提供很多其他流式计算应用所无法提供的功能:

1、保证与批处理作业的强一致性:开发人员可以通过dataset/dataframe api以开发批处理作业的方式来开发流式处理作业,进而structured streaming可以以增量的方式来运行这些计算操作。在任何时刻,流式处理作业的计算结果,都与处理同一份batch数据的批处理作业的计算结果,是完全一致的。而大多数的流式计算引擎,比如storm、kafka stream、flink等,是无法提供这种保证的。
2、与存储系统进行事务性的整合:structured streaming在设计时就考虑到了,要能够基于存储系统保证数据被处理一次且仅一次,同时能够以事务的方式来操作存储系统,这样的话,对外提供服务的实时数据才能在任何时刻都保持一致性。
3、与spark的其他部分进行无缝整合:structured steaming在未来将支持基于spark sql和jdbc来对streaming state进行实时查询,同时提供与mllib进行整合。
除了这些独一无二的特性以外,structured streaming还会提供其他feature来简化流式应用的开发,例如对event time的支持,从而可以自动处理延迟到达的数据,以及对滑动窗口和会话的更多的支持。

你可能感兴趣的:(实战,spark)