Hi,

简单来说,如果你的作业逻辑中只使用了纯java的算子,比如你写的是一个没有使用 Python udf 的sql/table api
作业时,那么运行时就不需要对Python有需求,但是如果你使用了python udf,或者是你用的是python datastream
api来编写你的作业,那么运行时就对python环境有要求,毕竟那些python的自定义函数逻辑是需要Python解释器来执行的。

pyflink的runtime有两种执行模式process和thread。process模式是基于apache beam
portability框架做的进程间通信的方式,让python自定义函数运行在专门的Python进程的方式。关于thread模式则是基于pemja[1]做的嵌入的方式,让python直接嵌入到jvm里面运行,这种方式是1.15引入的,关于这部分内容可以参考文档[2]

关于性能问题的话,首先,如果你没有用python自定义函数,性能和java一模一样,因为你本质上只是用了pyflink的api。如果你用了python自定义函数,那就取决于你的性能瓶颈在哪了,因为我们知道python函数的性能是不如Java函数的。关于框架层的开销,我之前有写了专门的文章[3]分析过。

希望对你有所帮助。

Best,
Xingbo

[1] https://github.com/alibaba/pemja
[2]
https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/python/python_execution_mode/
[3] https://flink.apache.org/2022/05/06/pyflink-1.15-thread-mode.html

yidan zhao <hinobl...@gmail.com> 于2022年7月13日周三 15:47写道:

> 目前看了下pyflink,想了解下,pyflink的任务实际运行时也是JAVA+python双环境吗。
> 涉及java和python交互等是吗。性能相比java直接开发的任务会有区别吗?
>
> yidan zhao <hinobl...@gmail.com> 于2022年7月12日周二 19:27写道:
> >
> > 公司有部分项目是基于 storm 开发的,目前想进行改造,计划用 flink。
> >
> > 初步看了下代码,发现 storm 中实现都是通过 multi-lang 方式各种调用 shell、python
> > 实现。这些shell和python主要通过storm提供的一个 storm.py 基础包实现和 父进程
> > 的通信(基于stdin和stdout貌似)。
> >
> > 想问问,这种如何改造呢?
> > 首先是大方向上,(1)连同python、shell部分一起改造。(2)保留python、shell部分,基于flink实现一套类似机制。
> >
> > (1)和(2)目前看起来都会很复杂。
> >
> > 有没有小伙伴做过类似事情呢?
>

回复