流媒体数据记录通常很小,仅以千字节为单位,但流媒体往往会一直持续下去,从未停止过。许多管理、存储和分析流数据的最佳平台是Apache开源项目。
流数据,也叫事件流处理,通常在大数据的背景下讨论。它是连续产生的数据,通常由成千上万的数据源产生,如传感器或服务器日志。流媒体数据记录通常很小,也许每条记录只有几千字节,但是有很多,而且在很多情况下,流媒体一直在进行,从未停止过。
另一方面,历史数据在进入分析数据库(如数据仓库、数据湖或数据湖库)之前,通常要经过一个批量ETL(提取、转换和加载)过程。如果你不着急的话,这很好。另一方面,通常需要快速处理流数据,以便在尽可能接近实时的情况下对结果采取行动。
流媒体数据处理软件通常对数据进行增量分析,并进行实时聚合和关联、过滤或采样。数据流通常也会被存储起来,这样它就可以为历史记录作出贡献。增量处理可以在逐条记录的基础上进行,也可以在滑动的时间窗口上进行。
通过实时分析数据流,你可以发现不寻常的事件、与正常值的重大偏差以及发展的趋势。这可以为实时反应提供信息,例如在田地干涸时打开灌溉系统,或在股票交易低于目标值时买入股票。流媒体数据的来源包括以下内容。
- 传感器,如工业机器、车辆和农业机械中的传感器
- 来自证券交易所的股票交易定价数据
- 移动设备的位置数据
- 网络属性上的点击量
- 游戏互动
- 服务器日志
- 数据库交易
处理流媒体数据的方法
有三种方法来处理流媒体数据:以几小时到几天的时间间隔进行批处理,实时处理流媒体,或者在混合过程中同时进行。
批量处理的优点是能够进行深度分析,包括机器学习,缺点是有高延迟。流处理的优点是低延迟,缺点是只能进行简单的分析,如计算一个时间窗口的平均值和标记与预期值的偏差。
混合处理结合了这两种方法,并获得了两者的好处。一般来说,数据是作为一个流来处理的,并同时分支到存储,以便以后进行批量处理。举个例子,考虑一个附属于工业机器的声学监测器。流处理器可以检测到异常的吱吱声并发出警报;批处理程序可以调用一个模型,根据吱吱声的发展来预测故障发生的时间,并在机器发生故障前很久就为其安排维修。
处理流数据的软件
亚马逊Kinesis可以让你大规模地收集、处理和分析实时、流式数据。Kinesis有三个数据服务(数据流、数据火线和数据分析)和一个媒体服务(视频流)。
Kinesis数据流是一种摄取服务,每秒可以从数十万个来源连续捕获数千亿字节的数据。Kinesis数据分析可以用SQL或Apache Flink实时处理数据流。Kinesis Data Firehose可以捕获、转换和加载数据流到AWS数据存储中,以便用现有的商业智能工具进行近乎实时的分析。如果你希望用程序而不是用SQL或Flink来处理数据流,你可以使用AWS Lambda无服务器函数来代替Kinesis Data Analytics。
Apache Flink是一个开源的Java/Scala/Python框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计成可以在所有常见的集群环境中运行,并以内存速度和任何规模进行计算。它与所有常见的集群资源管理器集成,如Hadoop YARN、Apache Mesos和Kubernetes,但也可以作为一个独立的集群运行。
Apache Kafka是一个开源的、分布式的、Java/Scala事件流平台,用于高性能数据管道、流分析、数据集成和关键任务应用。Kafka事件被组织并持久地存储在主题中。Kafka最初是由LinkedIn开发的。它有五个核心API。
- 管理API用于管理和检查主题、经纪人和其他Kafka对象。
- 生产者API用于发布(写)事件流到一个或多个Kafka主题。
- 消费者API可以订阅(读取)一个或多个主题,并处理向它们产生的事件流。
- Kafka流API用于实现流处理应用程序和微服务。流API提供更高级别的功能来处理事件流,包括转换、有状态的操作,如聚合和连接、窗口化、基于事件时间的处理等等。从一个或多个主题读取输入,以生成输出到一个或多个主题,有效地将输入流转换为输出流。
- Kafka Connect API用于构建和运行可重用的数据导入/导出连接器,这些连接器从外部系统和应用程序中消费(读)或产生(写)事件流,以便它们能够与Kafka集成。例如,一个连接到关系型数据库(如PostgreSQL)的连接器可能会捕获一组表的每一个变化。然而,在实践中,你通常不需要实现自己的连接器,因为Kafka社区已经提供了数百个现成的连接器。
Apache Pulsar是一个开源的、分布式的、Java/C++/Python、发布和订阅的消息和流媒体平台。Pulsar最初是在雅虎开发的。它的特点包括。
- 原生支持一个Pulsar实例中的多个集群,并在集群间实现消息的无缝地理复制。
- 极低的发布和端到端延迟。
- 可无缝扩展至超过一百万个主题。
- 一个简单的客户端API,与Java、Go、Python和C++的绑定。
- 主题的多种订阅模式(独占、共享和故障转移)。
- 通过Apache BookKeeper提供的持久性信息存储,保证了信息的传递。
- 无服务器计算框架Pulsar Functions提供了流原生数据处理的能力。
- 建立在Pulsar Functions基础上的无服务器连接器框架Pulsar IO,使数据进出Apache Pulsar更加容易。
- 分层存储在数据老化时将数据从热/热存储卸载到长期存储(如Amazon S3和谷歌云存储)。
Apache Samza是一个开源的、分布式的、Scala/Java流处理框架,最初在LinkedIn与Apache Kafka一起开发。Samza允许你建立有状态的应用程序,实时处理来自多个来源的数据,包括Apache Kafka。Samza的特点包括。
- 一个统一的API,允许你以独立于数据源的方式描述你的应用逻辑。同一API可以处理批处理和流式数据。
- 能够处理和转换来自云和内部资源的数据。Samza提供与Apache Kafka、AWS Kinesis、Azure Event Hubs(Azure原生Kafka即服务)、Elasticsearch和Apache Hadoop的内置集成。
- 与现有的应用程序轻松整合,不需要为流处理旋转和操作一个单独的集群。Samza可以作为一个轻量级客户端库嵌入到Java/Scala应用程序中。
- 灵活的部署选项,允许你在任何地方运行应用程序,从公共云到容器化环境到裸机硬件。
- 通过与Apache YARN等流行的集群管理器集成,能够将流处理作为一种管理服务运行。
- 容错性,在发生故障时透明地迁移任务及其相关状态。Samza支持主机亲和性和增量检查点,能够从故障中快速恢复。
- 大规模的可扩展性。Samza在使用数兆字节的状态并在数千个内核上运行的应用中经过了实战检验。它为包括LinkedIn、Uber、TripAdvisor和Slack在内的多家大公司提供动力。
Apache Spark是一个开源的多语言引擎,主要用Scala编写,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。它可以处理批处理数据和实时流数据。Spark起源于加州大学伯克利分校,Spark的作者创立了Databricks。
Apache Storm是一个开源的分布式流处理计算框架,主要是用Clojure编写。在Storm中,流是一个无界的图元序列,以分布式的方式并行处理和创建。拓扑结构是一个用流分组连接的喷口和螺栓的图;拓扑结构定义了处理流的逻辑。一个喷口是拓扑中的流的来源。拓扑中的所有处理都在螺栓中完成。Storm与许多其他系统和库集成,包括Kafka、Cassandra、Redis和Kinesis。
Azure Stream Analytics是一个实时分析和复杂事件处理引擎,旨在同时分析和处理来自多个来源的大量快速流数据。从一些输入源(包括设备、传感器、点击流、社交媒体资料和应用程序)提取的信息中可以识别出模式和关系。这些模式可用于触发行动和启动工作流程,如创建警报、向报告工具提供信息,或存储转换后的数据供以后使用。
Confluent是Apache Kafka的商业化改编,由Kafka的原创作者提供,可用于企业内部或云端部署。Confluent云从头到尾都是作为一个无服务器、有弹性、有成本效益和完全可管理的云原生服务而重建的,并在AWS、微软Azure和谷歌云平台上运行。
谷歌云Dataflow是一个完全管理的、无服务器的、统一的流和批处理数据服务,基于Apache Beam。Apache Beam是一个统一的SDK,最初来自谷歌,用于Dataflow、Flink、Spark和Hazelcast Jet。
Ververica是一个企业流处理平台,由Apache Flink的原创作者开发。它为Apache Flink提供了多租户、认证、基于角色的访问控制和自动扩展。
总而言之,流媒体数据是不断产生的,通常由成千上万的数据源产生。通常情况下,每条记录只有几千字节的数据。通常情况下,人们更倾向于采用一种混合方案,既能实时快速分析记录,又能额外存储数据进行深入分析。事件流平台有很多不错的选择,其中有几个是免费的、开源的、Apache项目,还有几个是Apache项目的商业改进。