Fluid 携手 Vineyard,打造 Kubernetes 上的高效中间数据管理

简介: 本文阐述了如何利用 Fluid 和 Vineyard 在 Kubernetes 上优化中间数据管理,解决开发效率、成本和性能问题。 Fluid 提供数据集编排,使数据科学家能用 Python 构建云原生工作流,而 Vineyard 通过内存映射实现零拷贝数据共享,提高效率。两者结合,通过数据亲和性调度减少网络开销,提升端到端性能。同时通过一个真实事例介绍了安装 Fluid、配置数据与任务调度及使用 Vineyard 运行线性回归模型的步骤,展示了在 Kubernetes 上实现高效数据管理的实践方法。未来,项目将扩展至 AIGC 模型加速和 Serverless 场景。

本文主要介绍如何利用 Fluid 和 Vineyard,在 Kubernetes 上实现高效的中间数据管理。

背景介绍和面临的挑战

随着 Kubernetes 在 AI/大数据领域的普及和业务场景变得越来越复杂,数据科学家在研发效率和运行效率上遇到了新的挑战。当下的应用,往往需要使用端到端的流水线来实现,以下图所示的一个风控作业数据操作流为例:首先,需要从数据库中导出订单相关数据;随后,图计算引擎会处理这些原始数据,构建“用户-商品”关系图,并通过图算法,初筛出其中隐藏的潜在作弊团伙;接下来,机器学习算法会对这些潜在团伙进行作弊归因,筛选出更准确的结果;最后这些结果会经过人工筛查,并最终做出业务处理。

image.png

在这样的场景下,我们常常会遇到如下问题:

  1. 开发环境和生产环境的差异导致数据工作流的开发和调试变得复杂且低效
    数据科学家在自己的计算机上开发时通常使用 Python,但是又需要在生产环境中将代码转化为他们并不熟悉的 YAML 文件从而利用 Argo、Tekton 等基于 Kubernetes 的工作流引擎,这大大降低了开发和部署效率。
  2. 需要引入分布式存储实现中间临时数据交换,带来额外的开发、费用、运维成本
    端到端任务的子任务之间的数据交换通常依赖分布式文件系统或对象存储系统(如 HDFS、S3 和 OSS),这使得整个工作流需要进行大量的数据格式转换和适配工作,导致冗余的 I/O 操作,并由于中间数据的短期性,使用分布式存储系统会导致额外的成本。
  3. 在大规模 Kubernetes 集群环境中数据处理的效率问题
    在大规模的 Kubernetes 集群中,使用现有的分布式文件系统处理数据时,由于调度系统对数据的读写本地性缺乏足够的理解,并未有效地考虑到数据的位置问题,没有充分利用数据的局部性,导致在处理节点间的数据交换时,无法避免大量的数据重复拉取操作。这种操作既增加了 I/O 消耗,也降低了整体的运行效率。

image.png

为了解决上述问题,我们提出了结合 Vineyard 数据共享能力和 Fluid 数据编排能力的解决方案:

  • Fluid 的 Python SDK 能够方便地对数据流进行编排,为熟悉 Python 的数据科学家提供了一种简单的方式来构建和提交以数据集操作为中心的工作流。此外,Fluid 支持在开发环境和云上生产环境通过一套代码进行数据流管理。
  • Vineyard 使端到端工作流中任务之间的数据共享更加高效, 通过内存映射的方式实现零拷贝数据共享,从而避免了额外的 I/O 开销。
  • 通过利用 Fluid 的数据亲和性调度能力,在 Pod 调度策略考虑数据写入节点的信息,从而减小数据迁移引入的网络开销,提升端到端性能。

解决方案

什么是 Fluid

Fluid 是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用。通过 Kubernetes 服务提供的数据层抽象,可以让数据像流体一样在诸如 HDFS、OSS、Ceph 等存储源和 Kubernetes 上层云原生应用计算之间灵活高效地移动、复制、驱逐、转换和管理。而具体数据操作对用户透明,用户不必再担心访问远端数据的效率、管理数据源的便捷性,以及如何帮助 Kuberntes 做出运维调度决策等问题。用户只需以最自然的 Kubernetes 原生数据卷方式直接访问抽象出来的数据,剩余任务和底层细节全部交给 Fluid 处理。

Fluid 项目架构如下图所示,当前主要关注数据集编排和应用编排这两个重要场景。数据集编排可以将指定数据集的数据缓存到指定特性的 Kubernetes 节点,而应用编排将指定该应用调度到可以或已经存储了指定数据集的节点上。这两者还可以组合形成协同编排场景,即协同考虑数据集和应用需求进行节点资源调度。

image.png

接着介绍 Fluid 中数据集 Dataset 的概念,数据集是逻辑上相关的一组数据的集合,会被运算引擎使用,比如大数据的 Spark、AI 场景的 TensorFlow。Dataset 的管理实际上也有多个维度,比如安全性、版本管理和数据加速。

Fluid 希望从数据加速出发,对数据集的管理提供支持。在 Dataset 上面, 通过定义 Runtime 这样一个执行引擎来实现数据集安全性、版本管理和数据加速等能力。Runtime 定义了一系列生命周期的接口,可以通过实现这些接口来支持数据集的管理和加速。Fluid 的目标是为 AI 与大数据云原生应用提供一层高效便捷的数据抽象,将数据从存储抽象出来从而达到如下功能:

  • 通过数据亲和性调度和分布式缓存引擎加速,实现数据和计算之间的融合,从而加速计算对数据的访问。
  • 将数据独立于存储进行管理,并且通过 Kubernetes 的命名空间进行资源隔离,实现数据的安全隔离。
  • 将来自不同存储的数据联合起来进行运算,从而有机会打破不同存储的差异性带来的数据孤岛效应。

什么是Vineyard Runtime

首先我们来介绍 Vineyard,一个专为云原生环境大数据分析工作流中不同任务之间高效共享中间结果而设计的数据管理引擎。通过共享内存实现不同计算引擎之间中间数据共享的零拷贝,避免数据存入外部存储(本地磁盘、S3 及 OSS 等)的开销,从而提高了数据处理的效率和速度。

Vineyard Runtime 是 Fluid 中 Vineyard 相关组件的抽象,整体架构如下图所示。

image.png

从图中可以看到,Vineyard Runtime 由两个核心组件 Master 和 Worker 构成,它们共同管理 Vineyard 中构成每个对象的 metadata 和 payload:

  • Master: 使用 etcd 作为元数据管理系统,承担 metadata 的存储功能。
  • Worker: 使用 vineyardd(Vineyard 的守护进程) 管理共享内存,负责存储 payload 数据。

在性能方面,当应用任务与 vineyardd 位于同一节点上,它们通过内部进程通信(IPC)进行高速数据传输;而在不同节点之间,应用任务与 vineyardd 通过远程过程调用(RPC)传输数据,速率相对较慢。

Vineyard Runtime 的优势

  • 性能卓越: 避免不必要的内存拷贝、序列化/反序列化、文件 I/O 和网络传输等。同节点内应用与数据交互实现瞬时读取(大约 0.1 秒),写入仅需秒级时间;跨节点操作时,数据传输速度可接近网络带宽上限。
  • 简单易用: 通过对分布式对象进行数据抽象,用户只需要使用简单的 putget 操作就能在 Vineyard 中进行数据存取。同时支持包括 C++、Python、Java、Rust 和 Golang 在内的多语言 SDK 。
  • 集成 Python 生态: 集成了常用的 Python 对象,例如 numpy.ndarraypandas.DataFramepyarrow.{Array,RecordBatch,Table}pytorch.Datasetpytorch.Module 等。

Vineyard Runtime 性能怎么样

在数据量大小为 22GB 的情况下,使用 Vineyard Runtime 的同节点和跨节点性能分别如下图所示。

image.png

当用户任务被调度到 vineyardd 所在节点上时,此时达到 Vineyard 的最佳性能,即通过 IPC 实现数据传输。由于 Vineyard 会预先分配内存,数据写入到 Vineyard 比对象存储作为中间介质快 68 倍左右;由于和 Vineyard 共享同一块内存,用户任务在读取 Vineyard 数据时,数据将通过零拷贝的形式被传递到用户任务中,实现瞬时读取。

image.png

当用户任务被调度非 vineyardd 所在节点时,此时达到 Vineyard 的最差性能,即通过 RPC 进行数据传输。相比于 OSS,由于 Vineyard 进行 RPC 传输时基本能打满带宽,数据写入到 Vineyard 比 OSS 快 2.3 倍左右,从 Vineyard 读取数据比 OSS 快 2.2 倍左右。

通过Fluid使用VineyardRuntime 实战

在本教程中,我们将演示如何使用 Vineyard Runtime 在 ACK(Alibaba Cloud Kubernetes)上训练一个线性回归模型,请按照以下步骤进行操作。

步骤一:在 ACK 集群中安装 Fluid

选择 1: 安装 ack-fluid,安装步骤可参考云原生 AI 套件文档

选择 2: 使用开源版,我们使用 Kubectl 创建一个名字为 fluid-system 的 namespace,然后使用 Helm 来安装 Fluid,仅需通过以下几个命令来完成这个过程。

# 创建 fluid-system namespace
$ kubectl create ns fluid-system

# 将 Fluid 存储库添加到 Helm 存储库
$ helm repo add fluid https://fluid-cloudnative.github.io/charts
# 获取最新的 Fluid 存储库
$ helm repo update
# 找到 Fluid 存储库中的开发版本
$ helm search repo fluid --devel
# 在 ACK 上部署相应版本的 Fluid chart
$ helm install fluid fluid/fluid --devel

当我们在 ACK 上部署好 Fluid 平台后,接下来需要执行以下命令来安装 Fluid Python SDK。

$ pip install git+https://github.com/fluid-cloudnative/fluid-client-python.git

步骤二:开启数据与任务的协同调度(可选)

在云环境中,端到端数据操作流水线经常包含多个子任务。当这些任务被 Kubernetes 调度时,系统仅考虑了所需的资源约束,而无法保证连续执行的两个任务能在同一个节点运行。这导致二者在使用 Vineyard 共享中间结果时,会因为数据迁移引入额外的网络开销。如果希望将任务和 Vineyard 调度到同一节点达到最佳性能,可以按照修改如下 configmap 配置开启 FUSE 亲和性调度,这样系统调度将优先让相关联的任务在同一个节点进行内存访问,以减少数据迁移产生的网络开销。

# 按照以下命令修改 webhook-plugins 的配置,并开启 fuse 亲和性调度,
$ kubectl edit configmap webhook-plugins -n fluid-system
data:
  pluginsProfile: |
    pluginConfig:
    - args: |
        preferred:
          # 开启 fuse 亲和性调度
          - name: fluid.io/fuse
            weight: 100
    ...

# 重启 fluid-webhook pod
$ kubectl delete pod -lcontrol-plane=fluid-webhook -n fluid-system

步骤三:构建和部署线性回归数据操作流水线

该步骤包括数据预处理、模型训练和模型测试阶段,完整代码可参考示例代码。该步骤主要步骤如下:

1.创建 Fluid 客户端: 代码使用默认的 kubeconfig 文件连接到 Fluid 控制平台,并创建 Fluid 客户端实例。

import fluid

# 使用默认 kubeconfig 文件连接到 Fluid 控制平台,并创建 Fluid 客户端实例
fluid_client = fluid.FluidClient(fluid.ClientConfig())

2.创建和配置 Vineyard 数据集与运行时环境: 脚本创建名为 vineyard 的数据集并初始化相关配置,包括副本数和内存大小,使数据集绑定到运行时环境。

# 在 default namespace 下创建名为 vineyard 的数据集
fluid_client.create_dataset(dataset_name="vineyard")

# 获取 vineyard 数据集实例
dataset = fluid_client.get_dataset(dataset_name="vineyard")

# 初始化 vineyard runtime 的配置,并将 vineyard 数据集实例绑定到该 runtime。
# 副本数为 2,内存分别为 30Gi
dataset.bind_runtime(
    runtime_type=constants.VINEYARD_RUNTIME_KIND,
    replicas=2,
    cache_capacity_GiB=30,
    cache_medium="MEM",
    wait=True
)

3.定义数据预处理、模型训练和模型评估函数:分别实现了用于执行数据清洗和划分数据集的预处理函数,训练线性回归模型的训练函数,以及用于评估模型性能的测试函数。

# 定义数据预处理函数
def preprocess():
  ...
  # 将训练数据和测试数据存入 vineyard
  import vineyard
  vineyard.put(X_train, name="x_train", persist=True)
  vineyard.put(X_test, name="x_test", persist=True)
  vineyard.put(y_train, name="y_train", persist=True)
  vineyard.put(y_test, name="y_test", persist=True)
  ...

# 定义模型测试函数
def train():
  ...
  # 从 vineyard 中读取测试数据
  import vineyard
  x_test_data = vineyard.get(name="x_test", fetch=True)
  y_test_data = vineyard.get(name="y_test", fetch=True)
  ...


# 定义模型训练函数
def test():
  ...
  # 从 vineyard 中读取训练数据
  import vineyard
  x_train_data = vineyard.get(name="x_train", fetch=True)
  y_train_data = vineyard.get(name="y_train", fetch=True)
  ...

4.创建任务模版并定义任务工作流: 利用先前定义的函数,创建了数据预处理、模型训练和模型测试的任务模板。这些任务按顺序执行以形成完整的工作流。

preprocess_processor = create_processor(preprocess)
train_processor = create_processor(train)
test_processor = create_processor(test)

# 创建线性回归模型的任务工作流:数据预处理 -> 模型训练 -> 模型测试
# 下列的挂载路径 "/var/run/vineyard" 是 vineyard 配置文件的默认路径
flow = dataset.process(processor=preprocess_processor, dataset_mountpath="/var/run/vineyard") \
              .process(processor=train_processor, dataset_mountpath="/var/run/vineyard") \
              .process(processor=test_processor, dataset_mountpath="/var/run/vineyard")

5.提交并执行任务工作流: 将工作流提交到 Fluid 平台进行执行,并等待任务完成。

# 将线性回归模型的任务工作流提交到 fluid 平台,并开始执行
run = flow.run(run_id="linear-regression-with-vineyard")
run.wait()

6.资源清理: 执行完毕后,清理在 Fluid 平台上创建的所有资源。

# 清理所有资源
dataset.clean_up(wait=True)

通过以上一套 Python 代码可以帮助数据科学家在本地开发通过 kind 环境进行调试,把阿里云 ACK 作为生产环境进行使用,在提升了开发效率的同时得到非常好的运行性能。

总结和展望

通过结合 Fluid 的数据编排和 Vineyard 的高效数据共享机制,可以解决 Kubernetes 中数据工作流中的开发效率低下、中间数据存储成本高昂和运行效率不足的问题。未来,我们计划支持两个主要场景,一个是 AIGC 的模型加速,通过避免 FUSE 开销和存储对象格式转换将模型加载性能进一步提升;另一个是支持 Serverless 场景,为 Serverless 容器提供高效的原生数据管理。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 缓存 弹性计算
聚宽揭秘:为什么量化研究员喜欢在Kubernetes上使用Fluid简化数据管理?
通过引入阿里云的 ack-fluid 技术,基于 JindoRuntime 的分布式缓存加速,解决了多数据源、弹性扩展、动态挂载等挑战,显著提升了数据处理效率和资源利用率,降低运营成本。这一方案帮助量化研究员实现了更高效的开发和实验流程,为未来的优化和扩展奠定了基础。
|
存储 缓存 弹性计算
聚宽揭秘:为什么量化研究员喜欢在Kubernetes上使用Fluid简化数据管理?
在量化投研过程中,通过引入阿里云的 ack-fluid 技术,基于 JindoRuntime 的分布式缓存加速,解决了多数据源、弹性扩展、动态挂载等挑战,显著提升了数据处理效率和资源利用率,降低运营成本。
|
存储 缓存 Kubernetes
基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化
基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和标准化
|
存储 缓存 分布式计算
Fluid新魔法:跨Kubernetes Namespace共享数据集
Fluid帮助数据科学家优化数据访问。不同的数据科学家团队会在多个不同的Namespace中创建数据密集型作业,且这些作业将访问相同的数据集。多个数据科学家复用相同的数据集,特别是开源数据集。各数据科学家拥有自己独立的Namespace提交作业。如果对于每个Namespace运行缓存运行时并进行缓存预热,会造成缓存资源浪费和作业启动延迟问题。
1127 0
Fluid新魔法:跨Kubernetes Namespace共享数据集
|
存储 Kubernetes Cloud Native
Vineyard | 开源分布式内存数据管理引擎
阿里巴巴技术专家迪杰&高级开发工程师临竹在阿里云开发者社区特别栏目《周二开源日》直播中,介绍了Vineyard的设计动因和整体架构,并通过示例展示如何使用Vineyard来共享数据,分享Vineyard结合云原生能力,赋能更大数据应用场景的尝试和愿景。本文为直播内容文字整理,看直播回放,请点击文首链接~
Vineyard | 开源分布式内存数据管理引擎
|
7月前
|
数据采集 存储 安全
数据治理≠数据管理!90%的企业都搞错了重点!
在数字化转型中,数据不一致、质量差、安全隐患等问题困扰企业。许多组织跳过基础的数据管理,直接进行数据治理,导致方案难以落地。数据管理涵盖数据生命周期中的采集、存储、处理等关键环节,决定了数据是否可用、可靠。本文详解数据管理的四大核心模块——数据质量、元数据、主数据与数据安全,并提供构建数据管理体系的四个阶段:评估现状、确定优先级、建立基础能力与持续改进,助力企业夯实数据基础,推动治理落地。
|
7月前
|
数据采集 存储 SQL
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
老张带你搞定企业数据管理难题!数据找不到、看不懂、用不好?关键在于打好元数据管理、数据整合、数据治理和数据质量管控四大基础。四部曲环环相扣,助你打通数据孤岛,提升数据价值,实现精准决策与业务增长。
数据管理四部曲:元数据管理、数据整合、数据治理、数据质量管控
|
9月前
|
数据采集 人工智能 监控
企业数据来源杂、质量差,如何通过主数据管理解决?如何确保数据可信、一致和可用?
本文三桥君系统介绍了主数据管理(MDM)在企业数字化转型中的关键作用。产品专家三桥君从数据清洗、治理、处理到流转四个维度,详细阐述了如何通过标准化流程将数据转化为企业核心资产。重点包括:数据清洗的方法与工具应用;数据治理的组织保障与制度设计;数据处理的三大核心动作;以及数据流转的三种模式与安全控制。专家三桥君强调主数据管理能够推动企业从"经验决策"转向"数据驱动",并提出构建统一数据服务网关、"数据血缘图谱"等实战建议,为企业数字化转型提供系统化解决方案。
325 0
|
11月前
|
存储 数据管理 数据格式
数据治理 vs. 数据管理:别再傻傻分不清!
数据治理 vs. 数据管理:别再傻傻分不清!
535 10

相关产品

  • 容器服务Kubernetes版