流式数据处理

什么是流数据?

流数据是指由数千个数据源持续生成的数据,通常也同时以数据记录的形式发送,规模较小(约几千字节)。流数据包括多种数据,例如客户使用您的移动或 Web 应用程序生成的日志文件、网购数据、游戏内玩家活动、社交网站信息、金融交易大厅或地理空间服务,以及来自数据中心内所连接设备或仪器的遥测数据。

此类数据需要按记录或根据滑动时间窗口按顺序进行递增式处理,可用于多种分析,包括关联、聚合、筛选和取样。借助此类分析得出的信息,公司得以深入了解其业务和客户活动的方方面面,例如服务使用情况(用于计量/计费)、服务器活动、网站点击量以及设备、人员和实物的地理位置,从而迅速对新情况做出响应。例如,公司可以持续分析社交媒体流,从而跟踪公众对其品牌和产品的看法的变化,并在必要时及时做出反应。

流数据的优势

对于持续生成动态新数据的大多数场景,采用流数据处理是有利的。这种处理方法适用于大多数行业和大数据使用案例。通常情况下,各公司一开始都是从简单的应用程序开始,例如收集系统日志以及进行滚动计算最小值-最大值等初级处理。然后,这些应用程序逐渐发展为需要完成更加复杂的近实时处理。最初,应用程序可能通过处理数据流生成简单的报告,然后再执行一些简单的响应操作,例如在关键指标超出一定阀值时发出警报。最终,这些应用程序会执行形式更加复杂的数据分析,如应用机器学习算法,还会从数据中提取更深入的信息。经过一段时间后,开始应用复杂的流事件处理算法,如利用时间窗口衰减算法查找最近的热门电影,进一步丰富了信息内容。

流数据示例

  • 交通工具、工业设备和农业机械上的传感器将数据发送到流处理应用程序。该应用程序再监控性能,提前检测任何潜在缺陷,自动订购备用部件,从而防止设备停机。
  • 一家金融机构实时跟踪股市波动,计算风险价值,然后根据股票价格变动自动重新平衡投资组合。
  • 一家房地产网站跟踪客户移动设备中的一部分数据,然后根据其地理位置实时建议应走访的房产。
  • 一家太阳能发电公司必须维持可满足客户需求的发电量,否则就要支付罚金。该公司实施了一个流数据应用程序,用以监控电力系统中的所有电池板,并实时调度服务,从而最大限度缩短了每个电池板的低产能期,也因此减少了相关的罚款支出。
  • 一家媒体出版商对数十亿的在线内容点击流记录进行流处理,利用有关用户的人口统计信息汇总和丰富数据,并优化网站上的内容投放,从而实现关联性并为受众提供更佳的体验。
  • 一家网络游戏公司收集关于玩家与游戏间互动的流数据,并将这些数据提供给游戏平台,然后再对这些数据进行实时分析,并提供各种激励措施和动态体验来吸引玩家。

比较批处理与流处理

在讨论流数据之前,有必要比较一下流处理和批处理。批处理可用于计算对不同数据集的任意查询。它一般用于计算从所含的所有数据得到的结果,并实现对大数据集的深入分析。例如,Amazon EMR 等基于 MapReduce 的系统就是支持批处理任务的平台。相反,流处理则需要摄取一个数据序列,增量式更新指标、报告和汇总统计结果,以响应每个到达的数据记录。这种处理方法更适合实时监控和响应函数。

使用流数据所面临的挑战

在对实时流数据进行摄取与处理时,必须在可扩展性、可靠性及低延迟等方面建立严格保障,才能实际支持各类应用。常见的应用场景包括活动跟踪、交易订单处理、点击流分析、数据清洗、指标生成、日志过滤、索引编制、社交媒体分析、物联网设备遥测与计量等等。这些应用场景随时可能出现资源需求峰值,每秒事件处理量快速提升至数千之巨。 借助AWS,您可以直接使用Amazon Kinesis提供的托管流数据服务,也可以在Amazon EC2实例当中部署并管理自己的流数据解决方案。

对于负责实时摄取并连续处理流数据的管道时,我们需要在设计过程中考虑如下特点。

  • 可扩展:对于实时分析,您需要规划一套具备极强适应性的基础设施,以适应流数据的速率变化。规模伸缩通常由负责监控分片及分区数据处理指标的管理应用负责执行。我们希望管理应用能够自动发现新添加的分片或分区,并将其公平分配给所有可用工作节点进行处理。

  • 持久性:实时流数据系统应提供高可用性与数据持久性。例如,Amazon Kinesis Data Streams可跨三个可用区进行数据复制,从而提供流数据应用所需要的高持久性。

  • 可重播读取:流处理系统应提供按序记录,并能够以相同的顺序支持多个消费程序实现记录读取或重播。

  • 容错性、检查点与重播:检查点是指记录着流数据中已使用及已处理数据记录的最近节点。如果应用程序崩溃,系统应该能够通过检查点恢复流数据读取(而非从头开始)。

  • 并行启用多个处理应用:作为流处理系统的基本特征,其必须支持多个应用程序同时使用同一流数据。例如,您的某一应用负责更新实时仪表板,另一应用则将数据归档至Amazon Redshift。在这类场景下,我们需要两款应用能够同时并各自独立地使用同一流数据中的数据。

  • 消息语义:在分布式消息系统当中,各个组件有可能发生独立故障。一旦出现此类故障,不同消息收发系统会在生产程序与消费程序之间实现不同的语义保证。下面来看几种最常见的消息交付保证实现:

    • 最多一次:消息无法重新发送,或者因丢失而永远无法重新发送。
    • 至少一次:消息可能向消费程序发送多次。
    • 发送一次:消息只被发送一次。 根据实际应用需求,您还要选择一套支持必要语义的消息收发系统。
  • 安全性:在默认情况下,流数据的摄取与处理系统必须具备安全保障。您需要限制对流API及基础设施的访问操作,并对静态及传输中的数据进行加密。使用Kinesis Data Streams,我们可以确保只有账户及流数据的所有者能够访问他们创建的Kinesis资源。Kinesis还支持用户身份验证机制,借此控制对数据的访问活动。您可以通过AWS IAM策略有选择地向用户及用户组授予权限,也可以使用HTPPS协议通过SSL端点面向Kinesis安全地存放/获取数据。在运行Apache Kafka的情况下,为了保证Kafka集群的安全性,您还须部署HTTPS、维护证书颁发机构并配置Kafka实例以使用SSL对传输数据进行加密。

参考架构

  1. 数据生产程序:多个生产程序可连续产生同一流数据,并在一天之内生成TB级别的数据总量。生产程序可以使用独立的单一Java软件应用收集数据,并将数据发送至Amazon Kinesis代理(例如Kinesis Data Streams或Amazon Kinesis Data Firehose)。该代理会持续监控一组文件,并将新数据发送至交付流当中。代理还负责处理文件轮替、检查点机制并在发生故障时执行重试与再次发送,保证以可靠、及时且简单的方式处理您的数据。如果您使用的操作系统与Kinesis代理不兼容,也可选择Kinesis Producer Library(简称KPL)以实现对Kinesis流数据的高写入吞吐量。 KPL是一套易于使用且配置灵活度极高的库,可帮助您向Kinesis流数据写入数据。它能够在生产程序应用代码与Kinesis Data Streams API活动之间充当中介。此外,生产程序还可以使用Kafka Producers将消息发送至Kafka集群。
  2. 流摄取:Kinesis Data Sterams与Kinesis Data Firehose能够摄取并处理大规模数据记录流。如果您已经在使用Apach Kafka,请选择Kinesis Data Streams:您可以将Kafka集群部署在Amazon EC2实例中以获得高性能、可扩展的流数据摄取解决方案。AWS提供多种与Kafka部署良好匹配的不同实例类型与存储方案供您选择。此外,您也可以使用Amazon Managed Streaming for Kafka(简称Amazon MSK)在Apache Kafka上构建并运行生产级应用程序,整个流程无需任何专业的Apache Kafka基础设施管理知识。
  3. 流处理:您可以使用各种服务,在依次推进的时间窗口上逐条记录实时流数据、对其进行排序并实现增量处理。 例如,在使用Kinesis Data Analytics时,您可以使用标准SQL以无服务器方式处理并分析流数据。此项服务将帮助您快速编写出面向流数据源运行的SQL代码,借此执行时序分析、建立实时仪表板以及其他实时指标。以此为基础,您可以通过配置将SQL查询结果扇出至外部目标,例如Kinesis Data Firehose或Kinesis Data Streams。凭借快速的持续数据获取与聚合,数据获取与处理将拥有实时级别的响应速度。使用Kinesis Data Firehose(一项全托管流服务),您可以将实时流数据转换并发送至指定的目的地,包括Amazon S3、Amazon Redshift、Amazon Elasticsearch Service(简称Amazon ES)以及Splunk。 在使用Kinesis Data Streams进行数据摄取时,您可以使用Kinesis Client Library(简称KCL)开发出消费程序应用程序。您当然也可以选择Kinesis Data Streams API从Kinesis数据流中获取数据,但我们建议您使用KCL提供的设计模式与代码。与之对应,您可以选择Kinesis Data Streams作为Lambda函数的全托管事件源。 目前另一种主流的流数据处理方法,则是使用Kinesis Data Firehose。Kinesis Data Firhose可以调用Lambda函数对传入的源数据进行转换,并将转换完成后的数据发送至目标处。在创建交付流时,您可以直接启用Kinesis Data Firehose进行数据转换。 如果您在Hadoop环境中工作,则可以使用多种选项(Spark Streaming、Apach Flink或者Structured Streaming等)处理流数据。消费程序可以使用多种流数据摄取解决方案(例如Kinesis Data Streams、Amazon MSK、或者Amazon EC2上启用了Apache Spark Streaming的Apache Kafka)对实时数据流进行可容错流处理,并配合Spark SQL(支持通过Spark代码执行关系查询)构建起同时兼容实时与批量数据处理的单一架构。 Apache Flink是一款流式数据流引擎,可用于对高吞吐量数据源进行实时流处理。Flink还支持乱序事件的事件时间语义、发送一次语义、反压控制以及针对流/批处理应用程序进行优化的API。此外,Flink还提供面向第三方数据源的连接器,可支持Amazon Kinesis、Apache Kafka、Amazon ES、Twitter Streaming以及Cassandra等。Amazon EMR目前以YARN应用的形式支持Flink,您可以对Flink资源与集群内的其他应用资源进行统一管理。Flink-on-YARN还支持用户提交即席Flink作业;或创建一套长时间运行的集群,用于接收多项作业并根据YARN的总体容量配额进行资源分配。 如果将Apache Kafka作为流数据源,您还可以使用Spark Structured Streaming on Amazon EMR。Structured Streaming是一套具备良好容错性的流处理引擎,以Spark SQL为基础构建而成。
  4. 警报、消息扇出与存储:可以将处理后的流数据馈送至实时预测分析系统当中,据此得出推理结论,这些结论又可进一步被Amazon SNS用于触发警报。当然,我们也可以将处理后的消息分发至Kinesis Data Streams、Kinesis Data Firehose、Kinesis Data Analytics或者AWS Lambda,借此生成新的流并完成后续处理。在管道下游,应用程序能够以流数据为基础执行简单的聚合,并将处理后的数据发送至Amazon S3。其他常见使用模式还包括将实时数据存储在Amazon Redshift中以供复杂分析,存储在DynamoDB中以查询事件,或者存储在Amazon ES中以实现全文搜索。
  5. 下游分析:使用流技术完成即时处理的数据可以持久保存,并成为实时分析、机器学习、警报及其他自定义操作的必要素材。