You need to enable JavaScript to run this app.
导航
图文混排
最近更新时间:2025.04.22 20:21:32首次发布时间:2025.04.22 20:21:32
我的收藏
有用
有用
无用
无用

场景描述

一个网页一般由一段大的文本描述和若干其中的图片和视频组成,爬取网页的时候,一般会将单独的文本构建成一个数据集,然后解析其中的图片超链接,再单独爬取图片链接,构建成的新的图片数据集。
因此,一个网页对应,一个文本,N个图片(视频同理,这里简化为只有图片场景)。
一般情况下,文本数据集用于 NLP 任务的数据操作,图片数据集用于 CV 任务的数据处理。
但某些训练任务要求,将整个网页的文本和图片混排在一起,进行训练。 这个时候就需要将文本数据集和图片数据集通过 docID 关联在一起,并输出结果。

当前方案

Image

图片数据集一般会采用 Webdataset 存储, 计算采用 Spark 引擎。

  1. 首先对图片数据集会进行一次抽列和过滤操作。
  2. 然后对图片数据集按照 docID 进行聚合操作
  3. 最后跟文本数据集进行 join 操作,完成数据拼接。

Lance 方案

Image

和传统数据流程类似,计算依然使用 spark,但图像数据集存储为 Lance 格式。

  1. 抽数 + AGG + Join,都不获取 Image 内容,只使用 Lance 中的 RowId 指代。
  2. 在 Join 完毕后,输出了(docID,TEXT, List)结构
  3. 最后加入一个替值的步骤,该步骤实际就是 LookUp 过程,通过 RowId 查找 Image 字段,并完成替换。

方案对比

维度

当前方案

Lance 方案

过滤 + 抽列

需要流式读取全部数据,再过滤数据,读取 IO 放大严重

  • 列式存储,可以通过 meta 信息跳过无关行数据

聚合 + 连接

  • Image 字段会在内存中,占据Spark资源,容易出现**内存 OOM**,导致任务重试
  • Image 字段会完成 Shuffle 操作,会占据大量的磁盘存储和网络带宽,会因为**IO 失败**,导致任务重试或者失败
  • 聚合 + 连接总计两次 Shuffle,导致内存和 IO 问题成倍发生
  • 只传递 RowId,为 Long 类型,跟普通字段一致,无内存和 IO 问题。

替值

不存在该步骤

  • Sink 步骤,流式操作,处理完一个图片即可流式写入,无内存问题。
  • PyLance 有对象存储背压机制,能够单请求重试,控制重试粒度,防止触发 Spark Task、Stage、Job 重试