发布于: Oct 30, 2022

为了企业级数据存储的需求,EMR 开发 Alluxio 服务以实现基于对象存储的智能分层大数据存储架构,本文将为您介绍这一实现过程。

针对上述讨论的存储架构各自优势,一个新的问题就是如何引入一个数据编排层,使用户既能够使用 S3 作为存储,又提高在 EMR 上运行的分析工作负载的性能和范围。Alluxio 通过使用内存、SSD /或磁盘提供分层缓存层,从而提高性能,从而解决了上述难题。Alluxio 是一个开源的虚拟分布式文件系统,它最初起源于一个来自加州大学伯克利分校 AMPLab 实验室的叫做 Tachyon 的研究项目。Alluxio 位于大数据栈中的计算和存储之间,为计算框架提供了数据抽象层,使得应用能够通过一个共同的接口连接底层不同的存储系统。它为运行于其之上的计算框架和之下的存储系统都提供 HDFS S3 API  兼容性,并提供了跨多个存储系统的统一命名空间,实现了对计算和存储进行分离。

Alluxio 的实现包括一个缓存缓冲区,其中包括多层存储,例如用户通常会指定内存层(MEM)、固态硬盘层(SSD)和磁盘层(HDD )。启用分层存储后,会智能地考虑各层的顺序,根据 I/O 性能从上到下排序。这样的实现带来的主要优势之一是应用程序具有统一的命名空间。通过这个抽象,使得应用程序能够通过相同的命名空间和接口访问多个独立的存储系统,由 Alluxio 来处理与不同的底层存储系统的连通细节。例如,我们可以实现将来自不同帐户的多个 S3 存储桶装载到 Alluxio 中,并且可以通过 SparkPresto Hive 访问它们,而无需知道他们来自不同的帐户,甚至来自不同的区域。

S3 配置为 Alluxio 下层存储的过程也非常简单,只要创建一个 S3 存储桶和文件夹,然后通过创建配置文件 alluxio-site.properties,并在其中将 S3 配置为底层存储即可。虽然可以在配置文件中指定 AK/SK 赋予 S3 的访问权限,但作为最佳实践,我们建议通过 IAM 角色来实现权限管控。在《5 分钟快速上手通过 EMR 引导脚本部署 Alluxio 并运行 Spark 任务》的文章中,介绍了如何快速在 Amazon EMR 上手 Alluxio 并运行 Spark 任务。通过上述的配置,Alluxio 将作为一个新的数据访问层,配置在持久性存储系统 S3 和计算框架(如 Apache SparkPresto Hadoop MapReduce)之间。Alluxio 的架构包含 masterworkerclient 三个部分。其中,lending master 用于管理全局的元数据,包含文件系统元数据(文件系统节点树)、数据块元数据(数据块位置)、以及 worker 的容量元数据(空闲或已占用空间)。Alluxio clients 用于通过 SparkMapReduce 作业、Alluxio 命令行或 FUSE 层等应用程序与 lending master 通信,实现读取或修改元数据。Alluxioworker用于管理用户为 Alluxio 定义的本地资源(内存、SSDHDD)。Alluxio worker 将数据存储为块,并通过在其本地资源上读或者创建新的数据块来响应 client 请求。Workers 只用于管理数据块,文件到数据块的映射存储在 master 中,所以 worker 会定期的向 lending master 发送心跳信号。lending master 会在一个分布式的持久化系统上记录所有的文件系统事务,这样能够实现容错,当 lending master 失效时,standby master zookeeper 被选为新的 lending master

举例说明,如果一个应用通过 Alluxio client 请求数据,clientAlluxio master 请求数据所在的 worker

  • 如果数据在本地可用,Alluxio client 使用短路读取来绕过 Alluxio worker,并直接通过本地文件系统读取文件。短路读取避免通过 TCP 套接字传输数据,并提供数据的直接访问。
  • 当请求的数据存储在 Alluxio 中,而不是存储在 client 的本地 worker 上时,client 将对具有数据的 worker 进行远程读取。client 完成读取后,会要求本地的 worker 创建一个 copy,这样下次读取的时候就可以在本地读取相同的数据。远程缓存命中提供了网络级别速度的数据读取。Alluxio 优先从远程 worker 读取数据,因为 Alluxio worker 间的速度通常会快过从 S3 读取的速度。
  • 如果数据在 Alluxio 中找不到,应用将从 S3 读取数据。Alluxio client 会将数据读取请求委托给 worker,这个 worker 会从 S3 读取数据并缓存。当 client 只读取块的一部分或不按照顺序读取块时,client 将指示 worker 异步缓存整个块。异步缓存不会阻塞 client

用户可以通过选择不同的写类型来配置应该如何写数据。写类型可以通过 Alluxio API 设置,也可以通过在客户机中配置属性 Alluxio.user.file.writetype.default 来设置。

  • 当写类型设置为 MUST_CACHEAlluxio client 将数据写入本地 Alluxio worker,而不会写入到底层存储。如果短路写可用,Alluxio client 直接写入到本地 RAM 的文件,绕过 Alluxio worker,避免网络传输。由于数据没有持久存储在 S3 中,因此如果机器崩溃或需要释放数据以进行更新的写操作,数据可能会丢失。当可以容忍数据丢失时,MUST_CACHE 设置对于写临时数据非常有用。
  • 使用 CACHE_THROUGH 写类型,数据被同步地写到一个 Alluxio workerS3Alluxio client 将写操作委托给本地 worker,而 worker 同时将对本地内存和 S3 进行写操作。由于 S3 的写入速度通常比本地存储慢,所以 client 的写入速度将与 S3 的速度相匹配。当需要数据持久化时,建议使用 CACHE_THROUGH 写类型。在本地还存了一份副本,以便可以直接从本地内存中读取数据。
  • Alluxio 还提供了一个叫做 ASYNC_THROUGH 的写类型。数据被同步地写入到一个 Alluxio worker,并异步地写入到 S3ASYNC_THROUGH 可以在持久化数据的同时以内存速度提供数据写入。

很多企业已经在生产系统中开始在 EMR 中使用 Alluxio,并且从中获得数据价值。下面,我们将介绍一些典型的应用场景。

  • 对象存储的数据加速

如上文所述,越来越流行的架构是利用对象存储 S3 作为 EMRSparkPrestoHadoopTensorflow 等机器学习/ AI 工作负载等数据分析应用程序的重要数据源。对象存储可以是公共对象存储服务(Amazon S3)或本地对象存储(例如 Ceph Swift)。在这样的场景中,将 Alluxio 部署在计算端(其中数据被配置为从 S3 持久存储)可以极大地提高应用程序的性能。Alluxio 可以在临近 EMR 上不同的应用程序本地缓存数据,并管理其相应的元数据,以避免对象存储的特定低效元数据操作。

  • 多集群的数据支持

出于性能,安全性或资源隔离之类的原因,很多企业使用专用于关键任务应用程序的资源来维护多个独立的 EMR 计算集群。这些 EMR 集群通常需要访问共同的数据集。这需要在作业执行期间远程读取数据,或者运行 ETL 管道以在作业执行之前预加载数据。在这样的场景中,Alluxio 可以加快从主数据集读取远程数据的速度,而无需增加额外的 ETL 步骤。当部署在其中某个 EMR 群集中的计算节点上并配置为连接到主数据集时,Alluxio 充当本地数据代理层,提供与主数据集相同的名称空间。Alluxio 将透明地缓存群集本地的经常访问的数据,以减少网络流量。

  • 通用数据访问层

在需要讲本地存储资源和云计算资源打通的混合应用场景下,用户可以将 Alluxio 部署为用于常见数据访问请求的存储抽象层。Alluxio 支持各种存储类型的存储连接器,包括云计算资源(例如 Amazon Web Services)以及本地存储服务(例如 HDFSCeph)。只要 EMR 应用程序与 Alluxio 集成,它们就可以访问不同的持久性存储系统,而无需更改应用程序。一旦连接到 Alluxio,应用程序将自动与最流行的存储选项集成在一起,而无需实现任何连接器。

  • 统一的多数据源访问入口

在客户用有多个不同的数据源需要被访问到的场景下,通过 Alluxio 提供的挂载 API,使 EMR 应用程序能够通过同一文件系统名称空间访问跨多个数据源访问数据。应用程序不需要为每个数据源单独配置连接细节,例如客户端库版本或不同的安全模型。从应用程序的角度来看,它正在访问一个逻辑文件系统,该文件系统的数据可以由多个不同的持久存储来支持。这极大地简化了应用程序的开发、维护和管理。

综上所述,对于 EMR 中的应用程序和计算框架,Alluxio 提供了快速存储,促进了作业之间的数据共享,而不管使用的是哪种计算框架。当 EMR 需要访问的数据位于本地时,可以以内存级的速度访问到数据;当数据位于 Alluxio 时,可以以计算集群网络的速度获得数据;所以只在第一次访问数据时,从 S3 上读取一次。从存储系统的角度看,Alluxio 弥补了大数据应用与对象存储之间的差距,扩大了 EMR 可用的数据工作负载集。所以,后续我们也会持续跟进相关的性能评估等方面的内容,同时也会积极探索通过 Marketplace 等为 Amazon Web Services 用户更为便捷的使用方式。

相关文章