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

图片数据集一般会采用 Webdataset 存储, 计算采用 Spark 引擎。
- 首先对图片数据集会进行一次抽列和过滤操作。
- 然后对图片数据集按照 docID 进行聚合操作
- 最后跟文本数据集进行 join 操作,完成数据拼接。
Lance 方案

和传统数据流程类似,计算依然使用 spark,但图像数据集存储为 Lance 格式。
- 抽数 + AGG + Join,都不获取 Image 内容,只使用 Lance 中的 RowId 指代。
- 在 Join 完毕后,输出了(docID,TEXT, List)结构
- 最后加入一个替值的步骤,该步骤实际就是 LookUp 过程,通过 RowId 查找 Image 字段,并完成替换。
方案对比
维度 | 当前方案 | Lance 方案 |
---|
过滤 + 抽列 | 需要流式读取全部数据,再过滤数据,读取 IO 放大严重 | |
聚合 + 连接 | - Image 字段会在内存中,占据Spark资源,容易出现**内存 OOM**,导致任务重试
- Image 字段会完成 Shuffle 操作,会占据大量的磁盘存储和网络带宽,会因为**IO 失败**,导致任务重试或者失败
- 聚合 + 连接总计两次 Shuffle,导致内存和 IO 问题成倍发生
| - 只传递 RowId,为 Long 类型,跟普通字段一致,无内存和 IO 问题。
|
替值 | 不存在该步骤 | - Sink 步骤,流式操作,处理完一个图片即可流式写入,无内存问题。
- PyLance 有对象存储背压机制,能够单请求重试,控制重试粒度,防止触发 Spark Task、Stage、Job 重试
|