PyFlink 是 Flink on Zeppelin上Python语言的入口 , Flink Interpreter 内部会创建 Python Shell, 在这个Python Shell 里会创建 Flink的各种 Environment (包括ExecutionEnvironment,StreamExecutionEnvironment 等等)。需要注意的是PyFlink里的各种Environment变量背后对应的Java变量都是Scala Shell那边创建的。你在Zeppelin上写的Python代码就会提交到这个Python Shell里去执行。Zeppelin已经为你创建了下面7个变量 (不要自己再创建这些Environment)
- s_env (StreamExecutionEnvironment),
- b_env (ExecutionEnvironment)
- st_env (StreamTableEnvironment for blink planner)
- bt_env (BatchTableEnvironment for blink planner)
- st_env_2 (StreamTableEnvironment for flink planner)
- bt_env_2 (BatchTableEnvironment for flink planner)
- z (ZeppelinContext)
配置PyFlink
使用PyFlink需要做以下3个配置
- 安装 pyflink (pip install apache-flink==1.11.1) (版本号根据实际情况选择)。如果你需要使用PyFlink UDF,那么你需要在每台TaskManager的机器上安装pyflink,如果是Yarn模式,那么需要在Yarn集群的每台机器上都安装,因为TaskManager可能会起在任何一台机器上。
- 将flink opt下的 flink-python-*.jar 拷贝到 flink lib下
- 设置 zeppelin.pyflink.python 为python的可执行文件的路径(默认是用PATH里的python),因为有时候你的系统里可能安装了多个python版本,所以需要设置 zeppelin.pyflink.python 为你想用的那个版本
使用PyFlink
PyFlink 在Zeppelin中有2种使用方式
- %flink.pyflink
- %flink.ipyflink
%flink.pyflink 最简单,除了上面的配置不需要做其他事情,但功能也相对比较弱,没法和jupyter里的python环境相比
%flink.ipyflink
%flink.ipyflink 功能比较强,和jupyter里的python环境类似,但是需要如下额外配置。
- 如果你没有安装anaconda,那么需要安装下面3个python库 ```
- Jupyter
pip install jupyter
- grpcio
pip install grpcio
protobuf
pip install protobuf
```如果你已经安装了anaconda,那么只需要安装下面2个python库 ```
- grpcio
pip install grpcio
- protobuf
pip install protobuf
```
当上面的这些库安装完之后,你就可以使用 %flink.ipyflink 了,除了基本的python执行环境外,还可以享用如下一些高级feature
1. 彩色高亮输出
%flink.pyflink 输出是纯文本文字,而%flink.ipyflink 输出是彩色的,更加醒目,如下图
2. IPython Magic语法糖支持
IPython语法糖是指以%开头的特殊语法,如下图所示
%flink.ipyflink
#python help
range?
#timeit
%timeit range(100)
3. Matplotlib 支持
Matplotlib的用法和在Jupyter变得一模一样,如下图
4. 更多Python可视化库的支持
除了Matplotlib之外,还能支持更多其他Python的可视化库,比如Bokeh, HvPlot, Pandas,Seaborn 等等,具体可以参考每个Python库的官方文档,在Zeppelin无需任何其他配置,按照官方用法就可以。
5. 更好的Code Completion支持
和Scala Shell的Code Completion一样,你只要按tab键就会显示当前环境下的code completion,比如
Python 段落执行顺序
同一时间只能有一个Python段落执行,Zeppelin是安装FIFO的顺序来执行Python段落。所以如果你的一个Python段落里正在跑一个Streaming作业的话,另外一个Scala段落只能等待(处于PENDING状态)。
视频教程
钉钉群+公众号