资讯详情

资讯详情

用 Pachyderm 构建海量 datum 压测流水线:lots-of-datums 测试 DAG 实战指南

数据工程后端云原生任务调度微服务【免费下载链接】pachydermData-Centric Pipelines and Data Versioning项目地址https://gitcode.com/gh_mirrors/pa/pachyderm点击查看免费下载本指南围绕 Pachyderm 仓库中console/test-dags/lots-of-datums测试 DAG 展开讲解如何构造一个成百上千个 datum的数据流水线用于 Console 前端与集群在高并发、大数据量场景下的开发与压测。读完本文你将掌握该 DAG 的镜像构建、仓库与流水线创建、随机数据生成与提交、以及通过 meta 仓库验证 datum 拆分结果的完整流程并理解其背后的 PFS glob 与 datum 切分原理。一、测试 DAG 与 lots-of-datums 的定位在 Pachyderm 的 Console 开发仓库中console/test-dags/目录汇集了一批可用于 Console 开发调试的 DAG有向无环图即数据流水线。其中的setup-datums与generate-datums两条命令专门服务于海量 datum场景setup-datums搭建一个有助于测试大量 datum 列表的 DAGgenerate-datums生成 datum 并提交到setup-datums创建的仓库中。其完整命令清单见 console/test-dags/README.md而具体的 DAG 实现位于 console/test-dags/lots-of-datums/由以下文件组成文件作用README.md使用步骤说明本文主体来源Dockerfile构建流水线 worker 镜像index.js流水线 transform 执行的 Node 脚本处理每个 datumgenerateData.js本地批量生成随机测试数据文件的 Node 脚本pipeline.pipeline.json流水线定义含 glob 与输入配置package.json/package-lock.jsonNode 依赖声明含lorem-ipsum该 DAG 的核心思路是在输入仓库data中放置大量随机命名的文件使流水线输入按 glob/*被拆分为海量 datum从而在真实负载下检验数据浏览、任务调度与前端渲染表现。二、构建并上传 worker 镜像依据 console/test-dags/lots-of-datums/README.md第一步是构建流水线使用的 Docker 镜像。你可以将镜像打标签并推送到自己的 Docker 仓库也可以直接使用pipeline.pipeline.json中声明的镜像docker build -t peterpachyderm/datum:v1 . docker push peterpachyderm/datum:v1其中pipeline.pipeline.json里 transform 部分引用的是peterpachyderm/datum:v2因此若在本地构建建议将 tag 同步改为v2或同时推送多个 tag以与流水线配置保持一致。镜像内容由 console/test-dags/lots-of-datums/Dockerfile 定义要点如下FROM node:16-buster-slim WORKDIR /usr/src/app RUN apt-get update apt-get install ADD package.json /package.json ADD index.js /index.js run npm i基于node:16-buster-slim内置 Node.js 16 运行时将package.json与index.js分别拷贝到根目录/index.js与流水线中的cmd: [node, /index.js]对应在构建阶段执行npm i安装lorem-ipsum依赖见 console/test-dags/lots-of-datums/package.json。三、创建仓库与流水线Pach setup第二步是初始化 Pachyderm 集群侧的仓库与流水线原文给出了两条核心命令pachctl create repo data pachctl create pipeline -f pipeline.jsonpachctl create repo data创建名为data的输入仓库用于存放将要提交的海量随机文件pachctl create pipeline -f pipeline.json依据流水线定义文件创建流水线generate-datums。console/test-dags/lots-of-datums/pipeline.pipeline.json 的完整定义如下{ pipeline: { name: generate-datums }, description: generate lots of datums, transform: { cmd: [node, /index.js], image: peterpachyderm/datum:v2 }, input: { pfs: { glob: /*, repo: data } } }关键配置项说明字段取值含义pipeline.namegenerate-datums流水线名称同时用于生成同名输出仓库与 meta 仓库descriptiongenerate lots of datums流水线说明transform.cmd[node, /index.js]worker 容器内执行的命令对应 Dockerfile 拷贝到根目录的脚本transform.imagepeterpachyderm/datum:v2worker 镜像与 README 中:v1示例 tag 不同需保持一致input.pfs.repodata输入仓库input.pfs.glob/*目录级匹配模式决定 datum 如何拆分glob是理解本 DAG 的核心Pachyderm 的 PFS 输入会在repo根目录按 glob 模式匹配将匹配到的每个路径作为独立 datum 交给流水线处理。当输入仓库data根目录下有 N 个文件时glob/*会把每个文件拆成一个 datum即总共产生 N 个 datum。四、生成随机数据文件并提交第三步是使用generateData.js生成随机文件并提交到输入仓库mkdir -p data node generateData.js 100 pachctl put file -r datamaster:/ -f datamkdir -p data创建本地数据目录node generateData.js 100生成 100 个随机命名的数据文件数字参数表示文件个数缺省时脚本默认生成 50 个pachctl put file -r datamaster:/ -f data将本地data目录**递归-r**上传到data仓库的master分支根路径/从而触发流水线为每个文件创建一个 datum。console/test-dags/lots-of-datums/generateData.js 的实现细节const NUM_DATUMS process.argv[2] || 50; // 参数1生成文件个数默认 50 const writeDir process.argv[3] || ./data; // 参数2输出目录默认 ./data // 先清空输出目录中已存在的文件 fs.readdir(writeDir, (err, files) { if (err) throw err; for (const file of files) { fs.unlink(path.join(writeDir, file), (err) { if (err) throw err; }); } }); // 用 Math.random().toString() 作为文件名与内容生成 NUM_DATUMS 个文件 for (let i 0; i NUM_DATUMS; i) { const rand Math.random().toString(); fs.writeFileSync(writeDir / rand, rand); }脚本特点文件内容与文件名都是Math.random().toString()的结果例如0.12345678901234567保证每个 datum 都是独立、随机的生成前会先清空目标目录方便反复执行而不产生残留由于文件名是随机小数均小于 1它们会与index.js中基于parseFloat(file) 0.5的故障注入逻辑产生交互详见下文。五、通过 meta 仓库验证 datum 拆分结果数据提交、流水线触发后README 给出的最后一条验证命令是pachctl list file generate-datums.metamaster:/pfs这条命令列出流水线generate-datums的meta 仓库在master分支/pfs目录下的文件。Pachyderm 为每条流水线自动维护一个pipeline-name.meta类型的元数据仓库其中/pfs目录下的内容就是本次作业被切分出来的datum 集合——每行对应一个 datum文件名即 datum 的哈希/标识。源码证据meta 仓库的类型常量定义在 src/pfs/pfs.go 中MetaRepoType meta而src/internal/clusterstate/v2.7.0_test.go中的测试数据也印证了该约定——例如 edges 流水线的 meta 仓库被命名为edges.metaedges.meta: {Repo: pfs.Repo{Name: edges, Type: pfs.MetaRepoType, Project: pfs.Project{Name: opencv}}},因此generate-datums流水线的 meta 仓库即为generate-datums.meta。当输入仓库提交了 100 个文件时generate-datums.metamaster:/pfs下应能看到约 100 个 datum 条目数量与文件个数一一对应这是验证 glob/*拆分是否正确的最直接手段。六、worker 处理逻辑耗时模拟与故障注入每个 datum 在 worker 容器中由 console/test-dags/lots-of-datums/index.js 处理const LoremIpsum require(lorem-ipsum).LoremIpsum; const lorem new LoremIpsum({ sentencesPerParagraph: { max: 6, min: 3 }, wordsPerSentence: { max: 16, min: 4 }, }); fs.readdirSync(/pfs/data).forEach(async (file) { if (parseFloat(file) 0.5) { throw new Error(lorem.generateSentences(1)); // 故障注入约一半 datum 抛错 } // 每个 datum 处理耗时约 500ms可调参以模拟不同负载 await new Promise((resolve) setTimeout(resolve, 500)); console.log(file); console.log(lorem.generateParagraphs(3)); // 向 stdout 输出 lorem ipsum 文本 fs.writeFileSync(/pfs/out/ Math.random().toString(), Math.random().toString()); // 写输出 });该脚本暴露了几个可调点对压测非常关键故障注入文件名对应的浮点值 0.5时主动throw由于generateData.js生成的文件名是均匀分布的随机小数约有一半 datum 会失败——非常适合验证 Console 对失败作业/错误 datum的展示与处理耗时模拟每个成功 datum 固定 sleep 500ms// Can be tuned to test diffent load times注释明确说明该值可调用于模拟不同的处理负载输出写入成功处理的 datum 会在/pfs/out/下写入一个新的随机文件形成data → generate-datums → out的完整数据流out为流水线自动创建的输出仓库。七、用 Makefile 一键编排整条 DAGconsole/test-dags/Makefile将上述手工步骤封装成了两个目标便于在运行中的 Pachyderm 集群里快速搭建/刷新该 DAGsetup-datums: -pachctl create repo data -pachctl create pipeline -f lots-of-datums/pipeline.pipeline.json -mkdir -p ./lots-of-datums/data -node lots-of-datums/generateData.js 100 ./lots-of-datums/data -pachctl put file -r datamaster:/ -f lots-of-datums/data generate-datums: -node lots-of-datums/generateData.js 100 ./lots-of-datums/data -pachctl put file -r datamaster:/ -f lots-of-datums/datamake setup-datums在console/test-dags/目录下执行一次性完成建仓库 → 建流水线 → 生成本地数据 → 提交触发全流程默认生成 100 个 datummake generate-datums仅重新生成并提交数据用于持续向已有 DAG 追加/刷新 datum反复制造新作业。注意 Makefile 目标使用了-前缀忽略单步失败继续执行适合在 Console 开发环境中反复运行提交前需保证当前pachctl上下文指向目标集群参考 console/test-dags/cluster-setup/README.md 中的说明。八、调参与扩展建议基于以上实现可以按需调整以适配不同的压测目标控制 datum 数量修改generateData.js 100中的数字或在Makefile中调整即可线性放大 datum 规模测试 Console 在几百乃至上千 datum 下的列表渲染与任务追踪性能调整处理耗时修改 index.js 中setTimeout的 500ms 数值模拟慢处理与快处理两种负载形态调整失败比例修改index.js中parseFloat(file) 0.5的阈值如改为 0.9放大失败 datum 比例验证错误展示与重试逻辑更换输入 glob将 pipeline.pipeline.json 中的 glob 从/*改为/dir/*等可测试不同目录结构下的 datum 聚合与拆分。九、常见问题排查镜像 tag 不一致导致流水线拉不到镜像README 示例推的是peterpachyderm/datum:v1而流水线配置引用:v2请保证推送的 tag 与pipeline.pipeline.json中transform.image一致否则作业会因 ImagePull 失败而报错datum 数量与预期不符先检查data仓库根目录实际文件数量再对照pachctl list file generate-datums.metamaster:/pfs的条目数两者应一致若 glob 被改过需按匹配模式重新推算拆分结果大量 datum 失败这是该 DAG 的刻意设计parseFloat(file) 0.5抛错并非环境故障如需全部成功可调整或移除 index.js 中的抛错分支或让generateData.js生成文件名均大于 0.5数据目录残留generateData.js会先清空输出目录若想保留旧数据请更换writeDir参数或改用其他目录名。通过以上步骤你可以在自己的 Pachyderm 集群上快速复现一个海量 datum 的测试流水线并用 meta 仓库清单直接验证 datum 拆分结果为 Console 前端与集群的大数据量场景验证提供稳定、可调、可重复的测试基座。赞分享数据工程后端云原生任务调度微服务【免费下载链接】pachydermData-Centric Pipelines and Data Versioning项目地址https://gitcode.com/gh_mirrors/pa/pachyderm点击查看免费下载相关推荐Pachyderm Console 测试 DAG 集合用 Makefile 一键构造 PPS/PFS 测试场景Pachyderm Console 测试 DAG 集合用 Makefile 一键构造 PPS/PFS 测试场景 本文聚焦 Pachyderm 仓库中 cons数据工程后端云原生任务调度微服务school-of-sre 持续集成CI构建流水线实战指南从代码提交到自动化构建测试school of sre 持续集成CI构建流水线实战指南从代码提交到自动化构建测试 持续集成Continuous IntegrationCI是软件教程 Transformers 测试指南从 CI 流水线到测试编写实战 Transformers 测试指南从 CI 流水线到测试编写实战 本文是 Transformers 仓库官方日语版《Testing》文档的深度解读人工智能大模型深度学习NLP预训练微调模型推理服务上一篇Linux文件搜索难题的终极解决方案FSearch快速搜索工具完全指南下一篇Rust项目配置管理新选择Keyshade CLI的高级用法指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →