Flink 1.9.0 及更高版本支持 Python, 也就是 PyFlink.
在最新版本的 Flink 1.10 中, PyFlink 支持 Python 用户定义的函数, 使您能够在 Table API 和 SQL 中注册和使用这些函数. 但是, 听完所有这些后, 您可能仍然想知道 PyFlink 的架构到底是什么? 作为 PyFlink 的快速指南, 本文将回答这些问题.
为什么需要 PyFlink?
Python 上的 Flink 和 Flink 上的 Python
那么, PyFlink 到底是什么? 顾名思义, PyFlink 就是 Apache Flink 与 Python 的组合, 或者说是 Python 上的 Flink. 但是 Flink on Python 是什么意思? 首先, 两者的结合意味着您可以在 Python 中使用 Flink 的所有功能. 而且, 更重要的是, PyFlink 还允许您在 Flink 上使用 Python 广泛的生态系统的计算功能, 从而可以进一步促进其生态系统的开发. 换句话说, 这对双方都是双赢. 如果您更深入地研究这个主题, 您会发现 Flink 框架和 Python 语言的集成绝不是巧合.
Python 和大数据生态系统
python 语言与大数据紧密相连. 为了理解这一点, 我们可以看一下人们正在使用 Python 解决的一些实际问题. 一项用户调查显示, 大多数人都在使用 Python 进行数据分析和机器学习应用程序. 对于此类情况, 大数据空间中还解决了一些理想的解决方案. 除了扩大大数据产品的受众范围之外, Python 和大数据的集成还通过将其独立体系结构扩展到分布式体系结构, 极大地增强了 Python 生态系统的功能. 这也解释了在分析大量数据时对 Python 的强烈需求.
为什么选择 Flink 和 Python?
Python 和大数据的集成与其他最近的趋势一致. 但是, 再次说明一下, 为什么 Flink 现在支持 Python, 而不是 Go 或 R 或另一种语言? 而且, 为什么大多数用户选择 PyFlink 而不是 PySpark 和 PyHive?
为了理解原因, 让我们首先考虑使用 Flink 框架的一些优势:
有利的体系结构: Flink 是具有统一流和批处理功能的纯流计算引擎.
新的活力: 根据 ASF 的客观统计, Flink 是 2019 年最活跃的开源项目.
高可靠性: 作为一个开源项目, Flink 经过长期测试, 并广泛应用于大数据公司的生产环境中.
接下来, 让我们看看为什么 Flink 支持 Python 而不是其他语言. 统计数据显示, Python 是继 Java 和 C 之后最受欢迎的语言, 并且自 2018 年以来一直在快速发展. Java 和 Scala 是 Flink 的默认语言, 但是 Flink 支持 Python 似乎是合理的.
PyFlink 是相关技术发展的必然产物. 但是, 仅仅了解 PyFlink 的重要性是不够的, 因为我们的最终目标是使 Flink 和 Python 用户受益并解决实际问题. 因此, 我们需要进一步探索如何实现 PyFlink.
PyFlink 架构
要实现 PyFlink, 我们需要知道要实现的关键目标和要解决的核心问题. PyFlink 的主要目标是什么? 简而言之, PyFlink 的主要目标如下:
使所有 Flink 功能对 Python 用户可用.
在 Flink 上运行 Python 的分析和计算功能, 以提高 Python 解决大数据问题的能力.
在此基础上, 让我们分析实现这些目标需要解决的关键问题.
使 Flink 功能可供 Python 用户使用
要实现 PyFlink, 是否需要像现有 Java 引擎一样在 Flink 上开发 Python 引擎? 答案是 NO. 尝试在 Flink 1.8 版或更早版本中进行, 但效果不佳. 基本设计原则是以最小的成本实现给定的目标. 最简单但最好的方法是提供一层 Python API, 并重用现有的计算引擎.
那么, 我们应该为 Flink 提供哪些 Python API? 他们对我们很熟悉: 高级表 API 和 SQL, 以及有状态的 DataStream API. 现在, 我们越来越接近 Flink 的内部逻辑, 下一步是提供适用于 Python 的 Table API 和 DataStream API. 但是, 剩下要解决的关键问题到底是什么呢?
关键问题
显然, 关键问题在于在 Python 虚拟机 (PyVM) 和 Java 虚拟机 (JVM) 之间建立握手, 这对于 Flink 支持多种语言至关重要. 要解决此问题, 我们必须选择适当的通信技术.
选择虚拟机通信技术
当前, 有两种解决方案可用于实现 PyVM 和 JVM 之间的通信, 它们是 Beam 和 Py4J. 前者是一个著名的项目, 具有多语言和多引擎支持, 而后者是用于 PyVM 和 JVM 之间通信的专用解决方案. 我们可以从几个不同的角度比较和对比 Apache Beam 和 Py4J, 以了解它们之间的区别. 首先, 考虑一个比喻: 要越过一堵墙, Py4J 会像痣一样在其中挖一个洞, 而 Apache Beam 会像大熊一样把整堵墙推倒. 从这个角度来看, 使用 Apache Beam 来实现 VM 通信有点复杂. 简而言之, 这是因为 Apache Beam 专注于通用性, 在极端情况下缺乏灵活性.
除此之外, Flink 还需要交互式编程. 此外, 为了使 Flink 正常工作, 我们还需要确保其 API 设计中的语义一致性, 尤其是在其多语言支持方面. Apache Beam 的现有体系结构无法满足这些要求, 因此答案很明显, Py4J 是支持 PyVM 和 JVM 之间通信的最佳选择.
技术架构
在 PyVM 和 JVM 之间建立通信之后, 我们已经实现了向 Python 用户提供 Flink 功能的第一个目标. 我们已经在 Flink 1.9 版中实现了这一点. 现在, 让我们看一下 Flink 1.9 版中 PyFlink API 的体系结构:
Flink 1.9 版使用 Py4J 来实现虚拟机通信. 我们为 PyVM 启用了网关, 为 JVM 启用了网关服务器以接收 Python 请求. 此外, 我们还提供了 Python API 中的 TableENV 和 Table 之类的对象, 这些对象与 Java API 中提供的对象相同. 因此, 编写 Python API 的本质是关于如何调用 Java API.Flink 1.9 版还解决了作业部署问题. 它使您可以通过各种方式提交作业, 例如运行 Python 命令以及使用 Python Shell 和 CLI.
但是, 此体系结构提供了哪些优势? 首先, 该体系结构很简单, 并且可以确保 Python API 和 Java API 之间的语义一致性. 其次, 它还提供了与 Java 作业相当的出色 Python 作业处理性能.
在 Flink 上运行 Python 的分析和计算功能
上一节介绍了如何使 Flink 功能可供 Python 用户使用. 本节说明如何在 Flink 上运行 Python 函数. 通常, 我们可以通过以下两种方式之一在 Flink 上运行 Python 函数:
选择一个典型的 Python 类库, 并将其 API 添加到 PyFlink. 该方法花费很长时间, 因为 Python 包含太多的类库. 在合并任何 API 之前, 我们需要简化 Python 执行.
基于现有的 Flink Table API 和 Python 类库的特征, 我们可以将所有现有的 Python 类库函数视为用户定义的函数, 并将其集成到 Flink 中. Flink 1.10 及更高版本中支持此功能. 功能集成的关键问题是什么? 同样, 它取决于 Python 用户定义函数的执行.
接下来, 让我们为这个关键问题选择一种技术.
选择执行用户定义功能的技术
实际上, 执行 Python 用户定义的函数非常复杂. 它不仅涉及虚拟机之间的通信, 还涉及以下所有方面: 管理 Python 执行环境, 解析 Java 和 Python 之间交换的业务数据, 将 Flink 中的状态后端传递给 Python 以及监视执行状态. 鉴于所有这些复杂性, 现在是 Apache Beam 发挥作用的时候了. 作为支持多种引擎和多种语言的大熊, Apache Beam 可以在解决这种情况方面做很多工作, 所以让我们看看 Apache Beam 如何处理执行 Python 用户定义的函数.
下面显示了可移植性框架, 该框架是 Apache Beam 的高度抽象的体系结构, 旨在支持多种语言和引擎. 当前, Apache Beam 支持几种不同的语言, 包括 Java,Go 和 Python.
用户定义的功能架构
UDF 体系结构不仅需要实现 PyVM 与 JVM 之间的通信, 还需要在编译和运行阶段满足不同的要求. 在下面的 PyLink 用户定义功能架构图中, JVM 中的行为以绿色表示, 而 PyVM 中的行为以蓝色表示. 让我们看看编译期间的局部设计. 本地设计依赖于纯 API 映射调用. Py4J 用于 VM 通信.
现在, 让我们看看 Python API 和 Java API 在此架构中的工作方式. 在 Java 方面, JobMaster 将作业分配给 TaskManager, 就像处理普通 Java 作业一样, 并且 TaskManager 执行任务, 这涉及到操作员在 JVM 和 PyVM 中的执行. 在 Python 用户定义的函数运算符中, 我们将设计各种 gRPC 服务, 用于 JVM 和 PyVM 之间的通信. 例如, 用于业务数据通信的 DataService 和用于 Python UDF 的 StateService 来调用 Java State 后端. 还将提供许多其他服务, 例如日志记录和指标.
我们如何使用 PyFlink?
了解了 PyFlink 的体系结构及其背后的思想之后, 我们来看一下 PyFlink 的特定应用场景, 以更好地了解其背后的方式和原因.
PyFlink 的应用场景
PyFlink 支持哪些业务方案? 我们可以从两个角度分析其应用场景: Python 和 Java. 请记住, PyFlink 也适用于 Java 可以应用的所有情况.
事件驱动的方案, 例如实时数据监控.
数据分析, 例如库存管理和数据可视化.
数据管道, 也称为 ETL 方案, 例如日志解析.
机器学习, 例如有针对性的建议.
您可以在所有这些情况下使用 PyFlink.PyFlink 也适用于特定于 Python 的方案, 例如科学计算. 在如此众多的应用场景中, 您可能想知道现在可以使用哪些特定的 PyFlink API. 因此, 现在我们也来研究这个问题.
PyFlink 安装
在使用任何 API 之前, 您需要安装 PyFlink. 当前, 要安装 PyFlink, 请运行命令: pip install apache-Flink
PyFlink API
PyFlink API 与 Java Table API 完全一致, 以支持各种关系和窗口操作. 某些易于使用的 PyFlink API 比 SQL API 更为强大, 例如特定于列操作的 API. 除了 API,PyFlink 还提供了多种定义 Python UDF 的方法.
PyFlink 中用户定义的函数定义
可以扩展 ScalarFunction(例如, 通过添加指标)以提供更多辅助功能. 另外, PyFlink 用户功能函数支持 Python 支持的所有方法定义, 例如 lambda, 命名函数和可调用函数.
定义完这些方法后, 我们可以使用 PyFlink Decorators 进行标记, 并描述输入和输出数据类型. 我们还可以基于 Python 的类型提示功能进一步简化更高版本, 以进行类型派生. 以下示例将帮助您更好地了解如何定义用户定义的函数.
定义 Python 用户定义函数的一种情况
在本例中, 我们将两个数字相加. 首先, 为此, 导入必要的类, 然后定义前面提到的函数. 这非常简单, 因此让我们进行一个实际案例.
PyFlink 的未来前景如何?
通常, 使用 PyFlink 进行业务开发很简单. 您可以通过 SQL 或 Table API 轻松描述业务逻辑, 而无需了解基础实现. 让我们看一下 PyFlink 的整体前景.
目标驱动路线图
PyFlink 的开发始终受到目标的推动, 这些目标是使 Flink 功能可供 Python 用户使用并将 Python 函数集成到 Flink 中. 根据下面显示的 PyFlink 路线图, 我们首先在 PyVM 和 JVM 之间建立了通信. 然后, 在 Flink 1.9 中, 我们提供了 Python Table API, 向 Python 用户开放了现有的 Flink Table API 功能. 在 Flink 1.10 中, 我们准备通过以下操作将 Python 函数集成到 Flink: 集成 Apache Beam, 设置 Python 用户定义的函数执行环境, 管理 Python 对其他类库的依赖关系以及为用户定义用户定义的函数 API, 以便支持 Python 用户定义函数.
为了扩展分布式 Python 的功能, PyFlink 提供了对 Pandas Series https://pandas.pydata.org/ 和 DataFrame 支持, 以便用户可以在 PyFlink 中直接使用 Pandas 用户定义的函数. 此外, 将来会在 SQL 客户端上启用 Python 用户定义函数, 以使 PyFlink 易于使用. PyFlink 还将提供 Python ML 管道 API, 以使 Python 用户能够在机器学习中使用 PyFlink. 监视 Python 用户定义的函数执行对实际生产和业务至关重要. 因此, PyFlink 将进一步为 Python 用户定义函数提供度量管理. 这些功能将包含在 Flink 1.11 中.
但是, 这些只是 PyFlink 未来发展计划的一部分. 还有更多工作要做, 例如优化 PyFlink 的性能, 提供图形计算 API 以及为 Flink 上的 Pandas 支持 Pandas 的本机 API. 我们将继续向 Python 用户提供 Flink 的现有功能, 并将 Python 的强大功能集成到 Flink 中, 以实现扩展 Python 生态系统的最初目标.
PyFlink 的前景如何? 您可能知道, PyFlink 是 Apache Flink 的一部分, 它涉及运行时和 API 层.
PyFlink 在这两层将如何发展? 在运行时方面, PyFlink 将构建用于 JVM 和 PyVM 之间通信的 gRPC 常规服务(例如控件, 数据和状态). 在此框架中, 将抽象化 Java Python 用户定义函数运算符, 并构建 Python 执行容器以支持 Python 的多种执行方式. 例如, PyFlink 可以在 Docker 容器中甚至在外部服务集群中作为进程运行. 特别是在外部服务群集中运行时, 将以套接字的形式启用无限扩展功能. 这一切在后续的 Python 集成中都起着至关重要的作用.
在 API 方面, 我们将在 Flink 中启用基于 Python 的 API, 以实现我们的使命. 这也依赖于 Py4J VM 通信框架. PyFlink 将逐渐支持更多的 API, 包括 Flink 中的 Java API(例如 Python Table API,UDX,ML Pipeline,DataStream,CEP,Gelly 和 State API)以及在 Python 用户中最受欢迎的 Pandas API. 基于这些 API,PyFlink 将继续与其他生态系统集成以便于开发; 例如 Notebook,Zeppelin,Jupyter 和 Alink, 这是阿里巴巴的 Flink 开源版本. 到目前为止, PyAlink 已完全整合了 PyFlink 的功能. PyFlink 也将与现有的 AI 系统平台集成, 例如著名的 TensorFlow.
为此, PyFlink 将一直保持活力. 同样, PyFlink 的任务是使 Flink 功能可供 Python 用户使用, 并在 Flink 上运行 Python 分析和计算功能.
更多实时数据分析相关博文与科技资讯, 欢迎关注 "实时流式计算"
关注 "实时流式计算" 回复 "电子书" 获取 Flink 300 页实战电子书
来源: https://www.cnblogs.com/tree1123/p/13185670.html