本文介绍了 Py4j的使用以及 Flink官方如何使用 Py4j进行混合语言编程,最后会介绍下我们会应用这种技术在我们的 Flink Notebook 服务,来创建一个混合语言编程环境。
Flink Notebook 服务是我司自研的基于Notebook方式的Flink 开发平台,他支持用户通过SQL方式和JAR包方式进行混合编程,并通过一些配置,既可完全的在页面上完成FLINK任务的开发工作,如图:
通过不同的Notebook Type我们可以加载不同类型的组件,通过table结果集流转方式,承接上下游,以完成相应的功能。目前的插件类型主要是主要分:1.SQL组建:可以自由撰写SQL,2.格式化组建:sink或者source,有具体的格式,标准的前端组建对应,3.JAR包自定义组件,通过用户上传自己开发的jar包完成对应的逻辑。
对于Jar包自定义组件来说,他是为了解决1%的特异性需求的,但问题是其代码不可见,逻辑也相对自由,有违Notebook的初衷,因此,我们想设计一种Notebook的Type,支持可视化的Python编写,可以直接将代码在页面上进行开发。
Flink 本身来说,就有PyFlink 和 Python UDF support,因此python和 flink的耦合度应该很高,所以我们要了解Flink是怎么做的,从而研究我们应该如何去做,所以本文会分成以下3个部分来介绍整个混编逻辑:
1. Java与Python 通信:Py4J
2. Py4j in Flink
3. Notebook with Python
Py4j 介绍
Py4j可以使运行于python解释器的python程序动态的访问java虚拟机中的java对象。Java方法可以像java对象就在python解释器里一样被调用, java collection也可以通过标准python collection方法调用。Py4j也可以使java程序回调python对象。
详细说明可以参考官网 https://www.py4j.org/
安装以及基本使用也可以参考官网
Py4j可以在系统中创建一个 java和python 之间通信的socket管道。
我们可以通过一个例子来看整个Py4j是如何工作的。
我们先创建一个想让python负责具体实现的Java 接口:
public interface TestEnterPoint {
String gift(HashMap<String,String> a, String b);
}
在java 服务端,我们通过以下代码可以启动一个简单的Py4j监听:
public static void main(String[] args) {
ListenerApplication application = new