谈谈如何构建优化的流数据架构(下)

本文涉及的产品
对象存储 OSS,20GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 流处理最初是一种“特定群体”技术。但随着 SaaS、物联网和机器学习的快速发展,各行各业的组织现在都在试行或全面实施流分析。

四 工具比较:批处理和实时 ETL 工具

在此类别中,可以选择开源工具、托管服务或完全托管的自助服务引擎。

阿帕奇Spark

Spark是一种分布式通用集群计算框架。Spark 引擎在摄取数据时计算并优化有向无环图 (DAG)。(DAG 是一种单向前进的数据流,没有循环)。Spark 的内存数据处理引擎对动态或静止数据执行分析、ETL、机器学习和图形处理。它为某些编程语言提供高级 API:Python、Java、Scala、R 和 SQL。

优点:

  • 具有大型企业应用的成熟产品,已在许多用例的生产中得到验证
  • 随时支持SQL查询。

缺点:

  • 实施和维护复杂且劳动密集
  • 几秒钟的延迟,消除了一些实时分析用例

亚马逊Glue

Amazon Glue 是一种完全托管的 ETL 和数据发现服务,构建于 Apache Spark 之上。Glue 提供了一个无服务器环境,可以使用它自动配置的虚拟资源来运行 Spark ETL 作业。使用 Glue,可以针对 S3 执行 ETL 作业以转换流数据,包括各种转换和转换为 Apache Parquet。

优点

  • 可以减少正在进行的集群管理的麻烦

缺点

  • 仍在作为服务发展
  • 限于 Spark 的批处理性质,这会带来一定的延迟和限制
  • 必须在存储层做很多优化(例如在 S3 上压缩小文件)以提高查询性能 

阿帕奇Flink

还处理批任务的流处理框架。Flink 也是一个声明式引擎。它将批处理视为具有有限边界的数据流。数据通过源进入并通过汇离开。它基于流和转换的概念。

优点:

  • 流优先方法提供低延迟、高吞吐量
  • 真正的逐条处理
  • 不需要对其处理的数据进行手动优化和调整
  • 动态分析和优化任务

缺点:

  • 一些缩放限制
  • 比较新;与其他框架相比,生产中的部署更少

阿帕 Flume

用于聚合、收集和移动大量日志数据的可靠分布式服务。它具有灵活的基本架构。从 Web 服务器捕获流数据到 Hadoop 分布式文件系统 (HDFS)。

33021b0c38056aadc6a46b18f7738298.png

33021b0c38056aadc6a46b18f7738298.png优点:

  • 中央主服务器控制所有节点
  • 容错、故障转移以及高级恢复和可靠性功能

缺点:

  • 难以理解和配置复杂的逻辑/物理映射
  • 占用空间大——>50,000 行 Java 代码

阿帕奇Storm

Apache Storm 处理大量数据并以比许多其他解决方案更低的延迟提供结果。适用于近乎实时的处理工作负载。Storm 是一个组合引擎,开发者预先定义 DAG,然后处理数据。这可能会简化代码。但这也意味着开发人员必须仔细规划他们的架构以避免低效的处理。

Apache Storm 架构建立在 spouts 和 bolts 之上。Spouts 是信息的来源。它们将信息传输到一个或多个螺栓。整个拓扑形成一个DAG。

优点:

  • 非常适合实时处理
  • 使用微批次可以灵活地调整工具以适应不同的用例
  • 广泛的语言支持

缺点:

  • 可能会降低可靠性,因为它不能保证消息的顺序
  • 实施起来非常复杂

阿帕奇Samza

Samza 使用发布-订阅模型来摄取数据流、处理消息并将结果输出到另一个流。这是一个合成引擎。Samza 依赖于 Apache Kafka 消息系统、架构,并保证提供缓冲、容错和状态存储。

优点:

  • 提供复制存储,以低延迟提供可靠的持久性
  • 简单且具有成本效益的多用户模型
  • 可以消除背压,持久化数据供以后处理

缺点:

  • 不支持非常低的延迟
  • 仅支持 JVM 语言
  • 不支持恰好一次语义

亚马逊Kinesis Streams

由 AWS 作为托管服务提供的专有事件流工具。每秒从数十万个来源收集千兆字节的数据。以毫秒为单位捕获实时分析用例的数据。与 Kafka 的 pub-sub 模型非常相似,包括弹性缩放、持久性和低延迟消息传输(根据亚马逊的说法,在 70 毫秒内收集数据)。

优点:

  • 易于设置和维护的托管服务
  • 与亚马逊广泛的大数据工具集集成

缺点:

  • 商业云服务,每个分片按小时收费;处理大量数据时可能会很昂贵
  • 需要牺牲一定程度的控制和定制,以换取易用性和减少对基础设施的关注

五 工具比较——分析引擎

数据从业者使用越来越多的工具从存储和流式数据中获取洞察力和价值。这些工具反过来与商业智能应用程序一起工作,以可视化和探索数据、数据建模和其他用于机器学习和人工智能的预测分析应用程序。

今天使用的常见分析工具包括:

  • 大数据查询引擎:
  • Amazon Athena
  • Presto
  • Trino / Starburst
  • Redshift Spectrum
  • Hive
  • 其他
  • 专用文本搜索引擎
  • ElasticSearch
  • Amazon OpenSearch
  • Apache Solr (open source, based on the same library as ES, but much less prevalent)
  • Kusto – managed MS offering
  • 存储层
  • 数据仓库

大数据查询引擎

顾名思义,这些技术旨在或已经发展为针对从 GB 到 PB 的各种规模的数据源运行交互式分析查询。它们可以搜索任何形式的数据——结构化、半结构化、非结构化——并且可以运行许多同时查询,如果可能的话实时。他们可以查询存储在任何地方的数据,而无需将数据移动到单独的结构化系统中,例如关系数据库或数据仓库。

亚马逊Athena

Athena 是一个分布式查询引擎,使用 S3 作为其底层存储层。它的性能很大程度上取决于数据在 S3 中的组织方式,因为没有数据库可以代替 ETL 工具进行转换。ETL 到 Athena 必须优化 S3 存储以实现快速查询和处理有状态操作。  

Athena 执行全表扫描而不是使用索引。这意味着某些操作(例如大表之间的连接)可能会非常慢。

Presto

Presto(或 PrestoDB)是一个依赖于 Hive 元存储的开源分布式 SQL 查询引擎。它专为对任何数量的数据进行快速分析查询而设计。它是亚马逊基于 Athena 的基础服务。与 Athena 一样,您可以使用 Presto 查询云对象存储中的数据;您不必先将数据移动到单独的分析系统中。查询执行在可扩展的纯内存架构上并行运行。

Presto 具有通过其连接器直接连接 S3 之外的各种数据源的功能,包括 HDFS 数据块和关系数据库。

Trino / Starburst

Trino 是一种分布式 SQL 查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集。Trino 最初名为 PrestoSQL,是原始 prestoDB 开源项目的一个分支。它由 Trino Software Foundation 的大型贡献者和用户社区维护。

Starburst 是 Presto 基金会管理委员会的成员,维护着一个名为 Starburst Enterprise 的企业级 Trino 商业发行版。Starburst Enterprise 包括额外的安全功能、更多连接器、基于成本的查询优化器、对运行额外部署平台的支持等。它旨在帮助大公司安全地从他们的 Trino 部署中提取更多价值。

Redshift Spectrum

Redshift 是一个关系数据库;Redshift Spectrum 是一个查询引擎,驻留在专用的 Redshift 服务器上并访问 S3 中的数据。

与 Athena 相比,Redshift 是:

  • 快点
  • 更健壮(具有额外的计算能力)
  • 更贵
  • 管理起来更复杂,需要大量的集群管理专业知识

亚马逊向 Redshift 引入了 RA3 节点类型,以提高性能并增加存储容量。Amazon 的 Redshift 高级查询加速器 (AQUA) 位于 Amazon Redshift RA3 集群的计算和存储之间,并与 Amazon Redshift RA3 实例一起运行。它不适用于数据湖。

Hive

Apache Hive 是一个开源数据仓库应用程序,用于读取、写入和管理大型数据集。它与 Apache Hadoop 分布式文件系统 (HDFS) 或其他数据存储系统(如 Apache HBase)配合使用。您通过命令行工具和 JDBC 驱动程序连接到 Hive。使用 Hive 的 SQL-like 接口查询存储在与 Hadoop 集成的各种数据库和文件系统中的数据。

专用文本搜索引擎

顾名思义,专用文本(或全文)搜索引擎检查文档和数据库记录中的所有单词。(元数据搜索方法仅分析文档的描述。)它们承诺通过高级索引和基于相关性的更直观的搜索结果快速检索数据。

Elasticsearch

Elasticsearch 是一个基于 Lucene 的开源可伸缩搜索引擎。它通常用于日志搜索、日志分析以及 BI 和报告。您可以在任何地方运行它。  

将 Elasticsearch 包含在流式架构中以明确查询日志文件的情况并不少见。为此,将所有原始数据存储在数据湖中以供重放和临时分析。然后对其进行去重,过滤掉不相关的事件,并将该子集发送到 Elasticsearch。

可以使用 Kafka Connect 将主题直接流式传输到 Elasticsearch。

将所有日志存储在 Elasticsearch 中不需要自定义编码。但由于 Elasticsearch 日志通常包含大量文本,因此相对较大,存储成本高昂

亚马逊OpenSearch

OpenSearch 项目由亚马逊创建,是一个基于 Elasticsearch 和 Kibana 的分叉搜索项目。(亚马逊没有计划 Elasticsearch 和 Kibana 的当前或未来版本。)它与 Elasticsearch 相同,但随着时间的推移会有所不同。

阿帕奇Solr

Apache Solr 是一个基于 Apache Lucene™ 构建的开源企业搜索平台。它提供分布式索引、复制和负载平衡查询、自动故障转移和恢复以及集中配置。它被设计为可靠的、可扩展的和容错的。  

Microsoft Azure 数据资源管理器

Azure 数据资源管理器是一项用于存储和运行大量数据的交互式分析的服务。它基于 RDMS,支持数据库、表和列等实体。您可以通过 Kusto 查询语言创建复杂的分析查询。

Kusto 补充但不替代传统 RDBMS 系统,用于 OLTP 和数据仓库等场景。它对所有形式的数据(结构化、半结构化和非结构化)表现同样出色。Kusto 不执行单个行和跨表约束或事务的就地更新。

存储层

与其他类型的流架构组件一样,存储层也在不断发展,充分利用它们的策略也在不断发展通常,可以选择文件存储、对象存储(数据湖,主要是mostly0 和数据仓库)。

文件存储——Hadoop 旨在处理大量数据。相对而言,对于中小型文件,它仍然足够简单和有效。但是元数据是有限的,并且只能通过整个文件进行搜索,因此随着容量的增加,使用 HDFS 作为主要存储层的成本、复杂性和延迟变得不合适。

对象存储——通常是指数据湖,其中最突出的是 Amazon S3;微软 Azure 数据湖和谷歌云存储。文件位置被标记,元数据是可靠的。因此缩放是无限的,搜索比文件存储快得多。但数据必须经过转换和优化才能使其可查询。

数据仓库——这些最适合结构化和半结构化数据,数据必须在存储在仓库中之前进行预处理(读取模式)。仓库可以提供简单的数据访问和快速查询,但不能以经济高效的方式扩展,也不能很好地处理非结构化数据。它们通常还需要一个封闭的架构——也就是说,它们实际上只适用于各自供应商的工具集。有许多可用的数据仓库;最著名的是 Snowflake 和 Amazon Redshift。

六 流数据常见用例

流式数据处理使实时或近实时获得可操作的洞察成为可能。特别适合流式传输的用例包括:

  • 欺诈检测——将复杂的机器学习算法与实时交易分析相结合,以识别模式并实时检测表明欺诈的异常情况。
  • 网络安全——数据流中的异常有助于数据安全从业者隔离或消除威胁,例如来自单个 IP 地址的可疑流量。
  • 物联网传感器数据——实时计算数据流,例如监控机械或环境条件或库存水平并几乎立即做出响应。
  • 在线广告和营销情报——跟踪用户行为、点击次数和兴趣,然后为每个用户推广个性化的赞助广告。实时衡量观众对内容的反应,以快速、有针对性地决定为访客和客户提供哪些服务并吸引潜在客户。
  • 产品分析——跟踪数字产品中的行为以了解功能使用、评估用户体验变化、增加使用并减少放弃。
  • 日志分析——IT 部门可以将日志文件转化为集中的易于使用的消息流,以从日志文件中提取意义;通常与可视化工具和开箱即用的过滤器结合使用。
  • 云数据库复制——使用变更数据捕获 (CDC) 在云中维护事务数据库的同步副本,以支持数据科学家使用高级分析。

0ec9632b8db6bf186f15c7fc0904a4c0.png

0ec9632b8db6bf186f15c7fc0904a4c0.png七 流处理常见陷阱

流处理是从海量数据流中获取商业价值的最佳方法。但路径不一定是直截了当的。在设计流式传输架构时,请牢记这些陷阱:

  • Apache Spark 的复杂性
  • 过度依赖数据库
  • 小文件的激增

Apache Spark 的复杂性

Spark 是一个强大的开源流处理器,并且被广泛使用。但是,与 Hadoop 一样,它是一个复杂的框架,需要大量的专业知识。 它功能强大且用途广泛 – 但它不易使用、部署简单或运行成本低廉。那是因为:

  • 专为大数据和 Scala 工程师打造,而非分析团队。在 Spark 中构建数据转换需要在 Scala 中进行冗长的编码,并具备在对象存储、分区和合并小文件方面实施数十种 Hadoop 最佳实践的专业知识。
  • 不是一个独立的解决方案。Spark 只是更大的大数据框架的一部分。对于流处理、工作流编排和状态管理,需要组装相当多的额外工具,每个工具都有自己的专业技能集,从而增加了更多的复杂性和成本。
  • 需要很长时间才能实现价值。Spark 的大规模实施是一个复杂的编码项目。随着雇用或培训专家、定制开发和手动调整以优化和扩展 Spark 所需的时间,从开始到生产需要几个月或更长时间。
  • 造成技术债务并扼杀敏捷性。对数据或分析要求的任何更改都需要一个编码周期,包括回归测试/QA。  
  • 造成数据工程瓶颈。数据团队必须实施任何需要新 ETL 流程或管道更改的新仪表板或报告。因此,每个变更请求都必须符合工程团队的 Sprint 计划。这可能会很痛苦,并最终会减少整个组织对数据的访问。
  • 是昂贵的。 的确,没有直接的许可费用(尽管通过托管 Spark 服务可能会产生高昂的订阅费用)。但是,将额外硬件的成本添加到专业知识的成本中,Apache 部署很容易超过大多数软件许可的价格。当使用高端开发人员进行普通的数据管道构建和维护时,也会产生机会成本。

过度依赖数据库

如果已经在管理大量数据流,这可能是显而易见的——但将流数据保存在关系数据库中是站不住脚的:

  • 事务数据库必须保留用于操作。任何额外报告或处理都会妨碍表现。
  • 基于事件的数据存储为对象而不是表。但是关系数据库是建立在表格存储之上的;使用它们来存储非结构化数据需要冗长的清理和转换过程,并在摄取时造成工程瓶颈。
  • 存储成本很容易使所有其他项目成本相形见绌,尤其是当将大数据存储在存储和计算紧密耦合的数据库中时。
  • 操作型数据库只包含相对较新的数据,而且通常只包含数据点的最新状态。挖掘模式和趋势或跟踪数据沿袭以从错误中恢复是非常具有挑战性的。
  • 流数据的价值通过探索技术、预测建模和机器学习得到释放。与传统数据库相比,这些分析需要更广泛、更灵活的数据访问。

小文件的激增

将小文件写入对象存储非常简单。但无论是在云端还是本地使用 Hadoop 或 Spark,小文件都会破坏性能。打开每个文件、读取元数据和关闭文件都需要几毫秒的时间,这在处理数百万个文件时变得有意义。此外,许多文件会导致许多不连续的磁盘寻道,而对象存储并未为此进行优化。

为了缓解这种情况,请在数据架构中使用压缩——定期将较小的事件文件合并到较大的档案中——以提高查询性能。最好的方法是:

  • 地定义压缩窗口。过于频繁地压缩是一种浪费,因为文件仍然非常小,任何性能改进都是微不足道的。当系统等待压缩作业完成时,压缩太少会导致处理时间过长和查询速度变慢。
  • 删除未压缩的字段以节省空间和存储成本。当然,始终保留原始状态的数据副本以用于重放和事件溯源。
  • 压缩完成后重新配置 Athena 表分区,这样 Athena 将读取压缩后的分区而不是原始文件。
  • 保持文件大小尽可能大,但仍然足够小以适应未压缩的内存。

同时,遵循一些最佳实践可以确保在构建流式架构时更快地获得更多价值。

八 综述

随着流数据的规模持续增长,组织可以通过构建或升级数据架构来保持竞争力,使他们能够实时或接近实时地处理和分析数据。该过程的每个步骤都有多种方法、技术和工具。通过采用有限数量的最佳实践并坚持开放数据架构以最大限度地增加选择,数据堆栈不仅具有成本效益,而且在可预见的未来具有足够的灵活性和可扩展性。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
7天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
14天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
53 3
|
9天前
|
监控
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
通过引入稀疏化和角色多样性,SMoA为大语言模型多代理系统的发展开辟了新的方向。
24 6
SMoA: 基于稀疏混合架构的大语言模型协同优化框架
|
7天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
3天前
|
传感器 算法 物联网
智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建
随着城市化进程的加速,停车难问题日益凸显。本文深入剖析智能停车系统的关键技术,包括停车场电子地图编辑绘制、物联网与传感器技术、大数据与云计算的应用、定位技术及车辆导航路径规划,为读者提供全面的技术解决方案。系统架构分为应用层、业务层、数据层和运行环境,涵盖停车场室内导航、车位占用检测、动态更新、精准导航和路径规划等方面。
27 4
|
12天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
21天前
|
监控 API 持续交付
构建高效后端服务:微服务架构的深度探索
【10月更文挑战第20天】 在数字化时代,后端服务的构建对于支撑复杂的业务逻辑和海量数据处理至关重要。本文深入探讨了微服务架构的核心理念、实施策略以及面临的挑战,旨在为开发者提供一套构建高效、可扩展后端服务的方法论。通过案例分析,揭示微服务如何帮助企业应对快速变化的业务需求,同时保持系统的稳定性和灵活性。
46 9
|
16天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
51 1
|
21天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
55 6
|
20天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
24 4