拓冰建站拓冰建站
首页 / 资讯中心 / 正文

DataHub 摄取运行内存剖析实战:使用 memray 定位 Ingestion 性能瓶颈与资源调优指南

DataHub 摄取运行内存剖析实战使用 memray 定位 Ingestion 性能瓶颈与资源调优指南【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本文基于 DataHub 官方开发指南profiling_ingestions.md编写面向需要为生产环境摄取任务做容量规划、或在开发新的摄取源Source与功能时进行性能调优的工程师。阅读本文后你将掌握如何在 DataHub 的 CLI 摄取与 UI 摄取两种方式中开启 memray 内存剖析、收集并分析摄取进程的内存 dump 文件从而量化单次摄取的内存占用、识别热点路径为摄取任务合理地分配运行资源。DataHub 的元数据摄取Ingestion本质上是一个在 Python 进程中持续运行的数据管道从源系统拉取元数据、经 transform 处理、再写入 sink。不同数据源如 Snowflake、BigQuery、dbt 等的数据规模与内存敏感度差异极大在投入生产前回答跑一次摄取需要多少内存、哪个环节最吃内存这一问题正是本文要解决的。何时需要对摄取做内存剖析官方文档明确指出内存剖析有两个典型场景资源容量规划sizing在为某个数据源设计生产摄取任务时评估跑完一次摄取到底需要多少内存资源从而为运行环境如 DataHub 的 ingestion executor 容器、K8s Pod设置合理的资源上限避免 OOM 或资源浪费。开发新功能或新数据源在开发阶段分析代码的内存行为找出内存泄漏或异常增长的代码路径。实现方式上DataHub 摄取的flags配置中提供generate_memory_profiles选项开启后会在摄取运行期间生成memray二进制内存转储文件运行结束后可用 memray 自带的火焰图等工具进行分析。 版本兼容性来自官方文档DataHub Core (Open Source)0.11.1| DataHub Cloud0.2.12。剖析机制的底层实现原理在动手操作前先了解 DataHub 是如何把generate_memory_profiles这一配置落到 memray 上的这有助于你理解 dump 文件从哪来、命名规则是什么。flags 配置入口FlagsConfig摄取管道的实验性开关集中在 pipeline_config.py 的FlagsConfig模型中class FlagsConfig(ConfigModel): Experimental flags for the ingestion pipeline. As ingestion flags an experimental feature, we do not guarantee backwards compatibility. Use at your own risk! generate_browse_path_v2: bool Field(defaultTrue, ...) generate_memory_profiles: Optional[str] Field( defaultNone, description( Generate memray memory dumps for ingestion process by providing a path to write the dump file in. ), )两点关键信息generate_memory_profiles的类型是Optional[str]即路径字符串默认值为None关闭一旦赋值为一个目录路径剖析即被开启。整个FlagsConfig被声明为实验性功能As ingestion flags an experimental feature, we do not guarantee backwards compatibility. Use at your own risk!且配置类标注为HiddenFromDocs意味着它不出现在自动生成的配置文档中——这也是本文把这一选项的完整用法整理出来的价值所在。运行期装配Pipeline.run()中的 memray.Tracker摄取管道的核心入口是 pipeline.py 的run()方法def run(self) - None: self._set_platform() self._warn_old_cli_version() with self.exit_stack, self.inner_exit_stack: if self.config.flags.generate_memory_profiles: import memray self.exit_stack.enter_context( memray.Tracker( f{self.config.flags.generate_memory_profiles}/{self.config.run_id}.bin ) ) ...从源码可以确认三条实现细节按需导入memray在run()内部才import所以未安装debug插件时普通摄取完全不受影响只有开启该 flag 才会真正依赖 memray。全程跟踪memray.Tracker(...)作为上下文管理器被压入self.exit_stackpipeline.py 中通过exit_stack.pop_all()保存因此从摄取开始到结束的整个管道生命周期source 拉取 → extractor → transform → sink 写入都会被记录。覆盖异常清理exit stack 的机制保证即使初始化中途抛异常已经创建的资源也能被清理避免留下半开的 Tracker。dump 文件命名run_id生成规则从上述代码可见dump 文件路径为{generate_memory_profiles}/{run_id}.bin。而run_id在用户未显式指定时由 pipeline_config.py 中的_generate_run_id自动生成def _generate_run_id(source_type: Optional[str] None) - str: current_time datetime.datetime.now().strftime(%Y_%m_%d-%H_%M_%S) random_suffix .join(random.choices(string.ascii_lowercase string.digits, k6)) if source_type is None: source_type ingestion return f{source_type}-{current_time}-{random_suffix}即默认 run_id 形如snowflake-2023_09_18-21_38_43-ab12cd{源类型}-{时间戳}-{6位随机串}。因此每次摄取运行都会产生一个唯一命名的二进制文件并在运行期间被持续追加写入你可以在 recipe 中显式指定run_id来获得可预测的文件名。官方文档给出的示例文件名file-None-file-2023_09_18-21_38_43.bin属于特定运行环境file sink、未指定 run_id下的样式实际文件名会随源类型与运行时间变化。准备剖析环境安装 debug 插件memray 本身是独立的 Python 包DataHub 通过debug这个 extra 把它作为可选依赖打入acryl-datahub。CLI 方式在运行摄取的机器上安装 DataHub CLI 的debug插件pip install acryl-datahub[debug]这一步会同时把 memraydebug_requirements { memray2.0.0, }随后在 setup.py 中该集合被注册为debugextra因此pip install acryl-datahub[debug]等价于安装核心包并带上memray2.0.0的版本约束注意当前仓库锁定的是 memray 2.x 以下版本。UI 方式DataHub 托管/前端创建摄取若通过 DataHub UI 创建摄取任务完整流程参见 Ingestion guide操作路径为在 UI 中按常规流程创建一次摄取在最后的配置面板中展开Advanced高级区域在Extra DataHub Plugins部分填入debug包即acryl-datahub的 debug extra保存并运行该摄取任务。需要提醒的是UI 摄取本质上仍由后端的 ingestion executor 以 Python 进程执行 recipe详见 ingestion-executor-security 对执行环境的说明因此 dump 文件会生成在 executor 可访问的路径下分析时需要确保该路径可达。在 recipe 中开启内存剖析无论 CLI 还是 UI开启剖析的方式都是相同的在 recipe 顶层增加flags.generate_memory_profiles字段值为 dump 文件输出目录# recipe.yaml source: type: 你的数据源类型例如 snowflake / bigquery / dbt config: { ... } sink: type: datahub-rest config: server: http://datahub-gms:8080 flags: generate_memory_profiles: /path/to/folder/where/dumps/will/be/written参数说明配置项类型说明flags.generate_memory_profiles字符串路径关闭时为None设置后摄取运行期间会在该目录下持续写入{run_id}.bin二进制 dump。目录需预先存在且进程对其有写权限除此之外flags下还有其他实验性开关如generate_browse_path_v2、generate_browse_path_v2_dry_run等定义于 pipeline_config.py它们彼此独立、互不影响剖析功能只需设置上述一个字段。运行摄取并收集内存 dumpCLI 运行配置好 recipe 后使用标准摄取命令运行即可datahub ingest是 ingest_cli.py 提供的入口datahub ingest -c recipe.yaml运行开始后目标目录下会立即出现一个二进制文件并在整个摄取执行期间被持续追加写入这正是memray.Tracker上下文管理器从run()开始到结束全程生效的结果。关于 CLI 部署的补充若你使用datahub ingest deploy将 recipe 部署为托管执行任务该命令定义于 ingest_cli.py还可以通过--extra-pip参数为执行环境补充额外 pip 包其 help 文本明确给出了示例Extra pip packages. e.g. [memray]——这意味着在无法直接pip install的环境里--extra-pip [memray]也是一种可行的安装路径。排查要点若开启 flag 后目录未出现文件优先检查路径是否存在、进程是否对该目录有写权限由于 dump 是追加写入的长时间运行的大规模摄取会产生较大的 dump 文件容量规划时需为输出目录预留磁盘空间每次运行会生成独立命名的文件多次运行不会互相覆盖方便对比不同配置如不同批大小、不同 transformer下的内存表现。用 memray 分析内存 dump摄取结束后使用 memray 自带的火焰图命令分析 dumpmemray flamegraph file-None-file-2023_09_18-21_38_43.bin将命令中的文件名替换为实际生成的{run_id}.bin即可。执行后 memray 会生成一个交互式 HTML 文件打开后可以看到按调用栈聚合的内存分配火焰图直观定位哪些 Python 调用路径例如某个 connector 的拉取逻辑、schema 解析、序列化等占用了最多内存从而指导后续的优化与资源调优。从源码角度理解这张火焰图的价值由于memray.Tracker包裹的是整个Pipeline.run()见 pipeline.py火焰图覆盖了 source 取数、extractor、transform、sink 写入的完整调用链你可以据此区分内存消耗在数据拉取阶段还是内存消耗在写入/转换阶段为针对性的性能优化提供精确依据。除此之外memray 还提供了丰富的内存调查能力如统计汇总、分配热点对比等。围绕确定某数据源摄取所需资源或开发新源时验证内存表现这两个官方文档定义的场景建议至少产出并保留一份火焰图作为基线便于后续变更前后的对比。实战建议与注意事项结合官方文档与源码实现总结以下实践要点实验性功能谨慎用于生产flags被官方明确标注为不保证向后兼容的实验特性升级 DataHub 版本后需重新验证 recipe 中 flags 的兼容性。只在需要时开启memray 的跟踪本身会带来性能开销并产生磁盘文件建议仅在容量评估、性能调优或开发阶段开启日常生产运行保持默认generate_memory_profiles为None状态。先做小规模基线建议先用小批量如调整source.config的采样/过滤条件跑通全流程确认 dump 文件生成与分析链路正常再放大到完整数据集。结合run_id做对比实验显式指定run_id可让 dump 文件命名可控方便对不同配置参数下的多次运行做横向对比。关注运行环境差异CLI 本机运行与 UI/executor 容器运行的环境Python 版本、memray 是否随debugextra 安装、输出路径权限不同dump 的绝对内存值不可直接跨环境对比但火焰图的相对热点仍然具有参考价值。通过以上步骤你可以为 DataHub 的任何数据源摄取任务建立起可复现的内存剖析流程用数据而非猜测来决定生产环境的资源配额。【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门