实时数据处理与分析:格式转换、质量检查及云服务应用
1. 实时管道中的消息格式转换
在数据处理中,我们之前讨论过将文件从原始格式转换为二进制格式,如 Avro 和 Parquet。在批处理场景下,Avro 适合作为暂存区的主要文件格式,因为多个数据处理作业可能需要访问它;而 Parquet 作为面向列的存储格式,更适合需要复杂分析和快速性能的生产存储区域。
那么这些理念是否适用于实时系统呢?在实时系统中,没有文件的概念,而是处理单个消息。生产者将消息写入实时系统,消费者读取这些消息。所有现有的云实时系统对消息内容是无感知的,消息只是字节的集合,数据生产者和消费者需要就如何将这些字节解释为有意义的内容达成一致。
在实时系统中,确保数据生产者和消费者就给定的消息模式达成一致非常重要。与批处理框架(如 Spark 可以扫描大量数据并尝试推断模式)不同,实时系统的处理上下文通常是单个消息,推断模式难以高效实现。
开发者常选择 JSON 作为消息格式,这是因为它流行且易于实现。然而,JSON 没有提供任何模式管理功能,并且从性能角度来看并非最优。实时系统是分布式系统,数据在网络中传输,生产者和消费者可能位于全球不同位置,不同机器之间的数据复制也通过网络进行。为了获得最佳性能,单个消息的大小应尽可能小。但 JSON 格式冗长,需要以纯文本形式包含属性名和值,对于具有几十个属性或复杂嵌套数据结构的大消息,这种开销会变得很显著。虽然可以使用压缩来减小 JSON 消息的大小,但压缩算法在处理大量“相似”数据时效果更好,压缩单个消息需要更多处理且可能无法达到预期的大小缩减效果。
使用二进制格式(如 Apache Avro)用于实时消息,与批处理管道具有相同的优