关键要点 在这篇文章中,我们将探讨Jumia如何与AWS专业服务合作,现代化其数据平台,从传统的Hadoop解决方案迁移到基于AWS无服务器解决方案的架构。这一现代化过程解决了高维护成本、灵活性不足等一系列问题,建立了一个可重用、可扩展的元数据驱动规格框架。最终目标是推动数据处理的效率与安全性。
Jumia是一家成立于2012年的技术公司,总部位于尼日利亚拉各斯,在14个非洲国家开展业务。Jumia的业务涵盖市场、物流和支付服务。本文将重点介绍Jumia与AWS合作的现代化数据平台之旅,它将数据架构从Hadoop迁移到无服务器架构,以应对高昂的维护成本和灵活性不足等挑战。
该现代化项目的核心理念是创建一种元数据驱动的框架,能够响应数据的不同处理阶段,包括数据编排、迁移、摄取、处理和维护。这一标准化方法促进了开发工作流程的简化,降低了由于采用各种不同方法而产生的错误风险。
在数据治理方面,虽然每个用例在其领域内保持一定自治,但在其上方有一个集中式治理模型,定义了对共享架构组件的访问控制。此外,实施过程中强调数据保护,确保所有服务都进行加密,并遵循最小权限原则,从而增强整体系统安全性。
以下图展示了所创建的框架设计。在该设计中,新的数据平台的负载按用例分类。每个用例需要为数据迁移至数据流编排的每个阶段创建一组YAML文件作为输入,而输出则是执行特定任务的有向无环图(DAG)。

接下来,我们将更详细地讨论每个阶段的目标、实施和经验。
本阶段的目标是构建一个元数据驱动的框架,以便在整个现代化过程中编排数据流。该编排框架提供了一个强大且可扩展的解决方案,具有以下功能:动态创建DAGs、原生集成非AWS服务、根据过去执行创建依赖关系、每次执行时生成可访问的元数据等。因此,决定使用(Amazon MWAA),它通过Apache Airflow引擎提供这些功能。
以下是为进行数据处理而提供的元数据文件描述,该数据处理使用Spark在上进行:
yaml owner: # 用例所有者 dags: # 为该用例创建的DAG列表 - name: # 用例名称 type: # DAG类型(可能是迁移、摄取、转换或维护) tags: # 标签列表 notification: # 定义DAG通知 on_success_callback: true on_failure_callback: true spark: # Spark作业信息 entrypoint: # Spark脚本 arguments: # Spark脚本所需参数 spark_submit_parameters: # Spark提交参数
所有框架的构建意图是为了提供可重用的艺术品,从而加速开发团队的工作并提高可靠性。这个框架为直接在AmazonMWAA中基于配置文件创建DAG对象提供了能力。
本阶段的目标是构建一个元数据驱动的框架,将数据从HDFS迁移到使用Apache Iceberg存储格式的AmazonS3,该过程要尽量减少操作开销,同时在高峰时段提供可扩展性,并确保数据的完整性和机密性。
以下图示显示了该架构。

在这一阶段,构建在PySpark上的元数据驱动框架接收配置文件作为输入,以便执行一些在Amazon EMRServerless作业中的迁移任务。这项工作使用PySpark框架作为脚本位置,然后使用之前描述的编排框架创建一个迁移DAG,该DAG运行以下任务:
要提高数据传输性能,建议将待传输文件的大小压缩到128–256 MB。因此,减少文件数量能加快迁移阶段的数据分析和完整性阶段。
本阶段的目标是实现另一个基于元数据的框架,以响应两种数据摄取模型。批处理模式负责从不同数据源(如Oracle或PostgreSQL)中提取数据,而微批处理模式则从Kafka集群中提取数据。
以下图示显示了批处理、微批处理和流处理的架构。

在此阶段,元数据驱动框架构建逻辑,以便从Kafka、数据库或外部服务中提取数据,并将其运行在部署在Amazon MWAA中的摄取DAG中。
对Kafka主题的数据摄取使用Spark结构化流处理。框架接收YAML格式的配置文件,指示读取哪些主题、要执行的提取过程、是以流方式还是微批方式读取,以及信息应保存到哪个目标表。
针对批处理摄取,实现了一个用PySpark编写的元数据驱动框架。同样,框架接收YAML格式的配置,包含要迁移的表及其目标。
在这种类型的迁移中,与摄取阶段和迁移阶段的数据同步至关重要,以防数据丢失或不必要的再处理。为此,实现了一个解决方案,将最后历史数据的时间戳(按表分类)保存到DynamoDB表中。两种类型的框架都被编程为在首次运行时使用这些数据。
本阶段的目标是能够在对象存储文件系统中处理数据的更新和删除,因此Iceberg成为了本项目的重要解决方案,因其具有ACID能力。虽然所有阶段都使用Iceberg作为增量文件,但处理阶段广泛利用Iceberg的能力执行数据的增量处理,使用UPSERT在Iceberg中运行MERGEINTO命令。
以下图示显示了该架构。

该架构与摄取阶段相似,仅将数据源更改为Amazon S3。这种方法加快了交付阶段,并确保了生产就绪的解决方案。
默认情况下,Amazon EMRServerless将参数spark.dynamicAllocation.enabled设置为True。该选项根据工作负载动态调整应用程序中注册的执行器数量。这在处理不同类型工作负载时具有许多优势,但在使用Iceberg表时也带来考虑。例如,在向Iceberg表写入数据时,AmazonEMR Serverless应用程序可能使用大量执行器以加快任务速度。这可能导致超出AmazonS3限额,尤其是每个前缀的请求数量。因此,应用良好的数据分区实践非常重要。
另一重要方面是对象存储文件布局。默认情况下,Iceberg使用Hive存储布局,但可以设置为使用ObjectStoreLocationProvider。设置此属性后,每个文件生成一个确定性哈希,并直接在write.data.path后附加哈希。这可以显著减少基于对象前缀的节流请求,同时最大化与AmazonS3相关的I/O操作的吞吐量,因为写入的文件均匀分布在多个前缀中。
在使用Iceberg等数据湖表格式时,进行常规维护任务以优化表的元数据文件管理至关重要,以防止大量不必要的文件堆积,并及时删除未使用的文件。本阶段的目标是构建另一个框架,能够在数据湖中的表上执行这些任务。
以下图示显示了该架构。

该框架与其他框架相似,接收一个配置文件(YAML文件),指示表及其维护任务和相应参数。它是基于PySpark构建的,可作为Amazon EMRServerless作业运行,并可以通过编排框架进行编排。
该框架支持以下维护任务:
维护任务的调度频率根据用例和特定任务的不同而有所不同。因此,这些任务的调度信息在具体用例的每个YAML文件中定义。
在实现该框架时,还没有关于Iceberg表的自动维护解决方案。在2024年AWS re:Invent大会上,功能已发布,旨在自动化Iceberg表的维护工作,包括文件压缩、快照管理及未引用文件的删除。
构建一个基于标准化框架和元数据驱动的解决方案,不仅提升了对数据迁移、摄取、编排等各个阶段的可视化和控制,还显著加快了实施和开发流程。此外,通过使用AmazonEMR Serverless和DynamoDB等服务,能够享受无服务器架构的所有优势,包括可扩展性、简单性、灵活集成、提高可靠性和成本效益。
借助这一架构,Jumia成功将数据湖的成本降低了50%。此外,通过这一方法,数据与DevOps团队能够通过创建元数据文件和SparkSQL文件,快速部署完整的基础设施与数据处理能力。这样一来,不仅缩短了生产周转时间,还降低了失败率。此外,提供了在AWS平台及外部存储层之间协作和治理数据集的能力。
依靠AWS构建我们的数据平台,不仅优化和降低了基础设施成本,还标准化了我们各数据团队的工作流,建立了一个更可靠的数据资产单一真实来源。这种转型提升了我们的效率和灵活性,使我们能够更快地获得洞察,从而增强了整体数据平台的价值。
– Hélder Russa,Jumia集团数据工程主管
立即通过AWS迈出简化数据迁移过程的第一步。
 Ramón Díez 是AWS的高级客户交付架构师,他带领项目顺利进行,坚信技术能够为商业服务。
 Paula Marenco 是AWS的数据架构师,热衷于设计分析解决方案,通过清晰和可操作的洞察,帮客户应对复杂的数据过程,增强决策效力。
 Hélder Russa 是Jumia集团数据工程负责人,参与制定战略,设计和实现多个支持整体决策过程及运营特性、数据科学项目和实时分析的Jumia数据平台。
 Pedro Gonçalves 是Jumia集团的首席数据工程师,负责数据架构的设计与监督,重视AWS平台和数据湖技术的应用,以确保健壮与灵活的数据解决方案及分析能力。
Leave a Reply