在 Openflow 中使用 Python 扩展的指南¶
本主题介绍在 Openflow 中使用 Python 扩展时的限制、支持的配置和最佳实践。
Openflow 中的 Python 处理器采用 NiFi 的 Py4J 桥接架构,其资源特性与原生 Java 处理器有本质区别。由于 Python 处理器作为 JVM 外部的 OS 进程运行,因此会额外占用系统内存,不受 NiFi 内部资源管理的约束,并且可观察性有限。这些差异会影响运行时规格选择、容量规划和监控。
架构差异¶
Python 处理器作为外部 OS 进程运行,而不是在 JVM 内部运行。此架构会影响资源的分配、监控和管理方式:
处理器类型 |
Java 处理器 |
Python 处理器 |
|---|---|---|
运行时环境 |
JVM 内部线程 |
外部 OS 进程 |
内存管理 |
在 JVM 堆内管理 |
独立的进程内存 |
生命周期 |
由 NiFi 控制 |
外部进程生命周期 |
监控 |
完整的 NiFi 可观察性 |
可见性有限 |
运行时大小约束¶
Python 扩展仅适用于中型和大型运行时。由于 CPU 和内存限制,小型运行时不支持 Python 处理器。Snowflake Openflow 会阻止小型运行时的 Python 扩展:
运行时大小 |
Python 支持 |
备注 |
|---|---|---|
小 |
不支持 |
由于 CPU 和内存限制,系统会阻止小型运行时的 Python 处理器运行。 |
中 |
受限(最多 2 个 Python 处理器) |
该限制适用于整个运行时,而非每个连接器或进程组。该限制目前作为建议项,未来将成为 Openflow 运行时强制执行的最高上限。 |
大 |
受限(最多 4 个 Python 处理器) |
该限制适用于整个运行时,而非每个连接器或进程组。该限制目前作为建议项,未来将成为 Openflow 运行时强制执行的最高上限。 |
最佳实践¶
在 Openflow 中使用 Python 处理器时,请遵循以下指南:
对于 CPU 密集型操作,请使用 Java。Java 在 JVM 内部提供更高效的线程管理。Groovy 脚本是基于 Java 的替代方案。
请使用中型或大型运行时。小型运行时不支持 Python。
限制 Python 处理器的数量。请确保不超过每个运行时大小所规定的数量限制。
监控资源使用情况。关注内存压力及 CPU 资源争用情况。
规划升级。自定义 Python 处理器在运行时升级后,可能需要重置虚拟环境 (venv)。有关更多信息,请参阅 在运行时升级后恢复 Python 处理器。
请使用单线程 Python 处理器。Openflow 不支持 Python 处理器生成子进程或使用多线程。
使用 Python 处理器的限制¶
在 Openflow 中使用 Python 处理器时,存在以下限制。
- 运行时约束
Python 扩展仅可用于中型或大型运行时。Python 扩展不可与小型运行时一起使用。该限制由平台强制禁用。
- 内存开销
每个 Python 处理器都会启动一个外部 OS 进程,该进程拥有独立的内存占用。Python 进程整体上会与 JVM 竞争资源。
- 无 NiFi 资源管理
Python 处理器不受 NiFi 内部资源管理的监控或限制。CPU 密集型的 Python 操作大约会占用服务器总 CPU 时间的 50%。
- 监控差距
该平台无法观测外部 Python 进程的运行状况和资源使用情况。
- 升级处理
运行时升级后,在虚拟环境重新创建之前,自定义 Python 处理器可能无法加载或出现意外行为。
在运行时升级后恢复 Python 处理器¶
如果升级运行时后 Python 处理器出现故障,请执行以下操作:
在
ProcessorDetails.version字段中增加处理器版本号。重新构建并上传 NiFi 归档 (NAR) Archive 文件。这将触发 Python 虚拟环境缓存的重置。
在画布上移除并重新添加处理器。这将触发 Py4J 桥接的重新初始化。