简介: 在 Zeppelin notebook 里利用 Conda 来创建 Python env 自动部署到 Yarn 集群中。

PyFlink 作为 Flink 的 Python 语言入口,其 Python 语言的确很简单易学,但是 PyFlink 的开发环境却不容易搭建,稍有不慎,PyFlink 环境就会乱掉,而且很难排查原因。今天给大家介绍一款能够帮你解决这些问题的 PyFlink 开发环境利器:Zeppelin Notebook。主要内容为:

  1. 准备工作
  2. 搭建 PyFlink 环境
  3. 总结与未来

也许你早就听说过 Zeppelin,但是之前的文章都偏重讲述如何在 Zeppelin 里开发 Flink SQL,今天则来介绍下如何在 Zeppelin 里高效的开发 PyFlink Job,特别是解决 PyFlink 的环境问题。

一句来总结这篇文章的主题,就是在 Zeppelin notebook 里利用 Conda 来创建 Python env 自动部署到 Yarn 集群中,你无需手动在集群上去安装任何 PyFlink 的包,并且你可以在一个 Yarn 集群里同时使用互相隔离的多个版本的 PyFlink。最后你能看到的效果就是这样:

1. 能够在 PyFlink 客户端使用第三方 Python 库,比如 matplotlib:

2. 可以在 PyFlink UDF 里使用第三方 Python 库,如:

接下来看看如何来实现。

一、准备工作

Step 1.

准备好最新版本的 Zeppelin 的搭建,这个就不在这边展开了,如果有问题可以加入 Flink on Zeppelin 钉钉群 (34517043) 咨询。另外需要注意的是,Zeppelin 部署集群需要是 Linux,如果是 Mac 的话,会导致在 Mac 机器上打的 Conda 环境无法在 Yarn 集群里使用 (因为 Conda 包在不同系统间是不兼容的)。

Step 2.

下载 Flink 1.13, 需要注意的是,本文的功能只能用在 Flink 1.13 以上版本,然后:

  • 把 flink-Python-*.jar 这个 jar 包 copy 到 Flink 的 lib 文件夹下;
  • 把 opt/Python 这个文件夹 copy 到 Flink 的 lib 文件夹下。

Step 3.

安装以下软件 (这些软件是用于创建 Conda env 的):

  • miniconda:https://docs.conda.io/en/latest/miniconda.html
  • conda pack:https://conda.github.io/conda-pack/
  • mamba:https://github.com/mamba-org/mamba

二、搭建 PyFlink 环境

接下来就可以在 Zeppelin 里搭建并且使用 PyFlink 了。

Step 1. 制作 JobManager 上的 PyFlink Conda 环境

因为 Zeppelin 天生支持 Shell,所以可以在 Zeppelin 里用 Shell 来制作 PyFlink 环境。注意这里的 Python 第三方包是在 PyFlink 客户端 (JobManager) 需要的包,比如 Matplotlib 这些,并且确保至少安装了下面这些包:

  • 某个版本的 Python (这里用的是 3.7)
  • apache-flink (这里用的是 1.13.1)
  • jupyter,grpcio,protobuf (这三个包是 Zeppelin 需要的)

剩下的包可以根据需要来指定:

%sh# make sure you have conda and momba installed.
# install miniconda: https://docs.conda.io/en/latest/miniconda.html
# install mamba: https://github.com/mamba-org/mambaecho "name: pyflink_env
channels:- conda-forge- defaults
dependencies:- Python=3.7- pip- pip:- apache-flink==1.13.1- jupyter- grpcio- protobuf- matplotlib- pandasql- pandas- scipy- seaborn- plotnine" > pyflink_env.ymlmamba env remove -n pyflink_env
mamba env create -f pyflink_env.yml

运行下面的代码打包 PyFlink 的 Conda 环境并且上传到 HDFS (注意这里打包出来的文件格式是 tar.gz):

%shrm -rf pyflink_env.tar.gz
conda pack --ignore-missing-files -n pyflink_env -o pyflink_env.tar.gzhadoop fs -rmr /tmp/pyflink_env.tar.gz
hadoop fs -put pyflink_env.tar.gz /tmp
# The Python conda tar should be public accessible, so need to change permission here.
hadoop fs -chmod 644 /tmp/pyflink_env.tar.gz

Step 2. 制作 TaskManager 上的 PyFlink Conda 环境

运行下面的代码来创建 TaskManager 上的 PyFlink Conda 环境,TaskManager 上的 PyFlink 环境至少包含以下 2 个包:

  • 某个版本的 Python (这里用的是 3.7)
  • apache-flink (这里用的是 1.13.1)

剩下的包是 Python UDF 需要依赖的包,比如这里指定了 pandas:

echo "name: pyflink_tm_env
channels:- conda-forge- defaults
dependencies:- Python=3.7- pip- pip:- apache-flink==1.13.1- pandas" > pyflink_tm_env.ymlmamba env remove -n pyflink_tm_env
mamba env create -f pyflink_tm_env.yml

运行下面的代码打包 PyFlink 的 conda 环境并且上传到 HDFS (注意这里使用的是 zip 格式)

%shrm -rf pyflink_tm_env.zip
conda pack --ignore-missing-files --zip-symlinks -n pyflink_tm_env -o pyflink_tm_env.ziphadoop fs -rmr /tmp/pyflink_tm_env.zip
hadoop fs -put pyflink_tm_env.zip /tmp
# The Python conda tar should be public accessible, so need to change permission here.
hadoop fs -chmod 644 /tmp/pyflink_tm_env.zip

Step 3. 在 PyFlink 中使用 Conda 环境

接下来就可以在 Zeppelin 中使用上面创建的 Conda 环境了,首先需要在 Zeppelin 里配置 Flink,主要配置的选项有:

  • flink.execution.mode 为 yarn-application, 本文所讲的方法只适用于 yarn-application 模式;
  • 指定 yarn.ship-archives,zeppelin.pyflink.Python 以及 zeppelin.interpreter.conda.env.name 来配置 JobManager 侧的 PyFlink Conda 环境;
  • 指定 Python.archives 以及 Python.executable 来指定 TaskManager 侧的 PyFlink Conda 环境;
  • 指定其他可选的 Flink 配置,比如这里的 flink.jm.memory 和 flink.tm.memory。
%flink.confflink.execution.mode yarn-applicationyarn.ship-archives /mnt/disk1/jzhang/zeppelin/pyflink_env.tar.gz
zeppelin.pyflink.Python pyflink_env.tar.gz/bin/Python
zeppelin.interpreter.conda.env.name pyflink_env.tar.gzPython.archives hdfs:///tmp/pyflink_tm_env.zip
Python.executable  pyflink_tm_env.zip/bin/Python3.7flink.jm.memory 2048
flink.tm.memory 2048

接下来就可以如一开始所说的那样在 Zeppelin 里使用 PyFlink 以及指定的 Conda 环境了。有 2 种场景:

  • 下面的例子里,可以在 PyFlink 客户端 (JobManager 侧) 使用上面创建的 JobManager 侧的 Conda 环境,比如下边使用了 Matplotlib。

  • 下面的例子是在 PyFlink UDF 里使用上面创建的 TaskManager 侧 Conda 环境里的库,比如下面在 UDF 里使用 Pandas。

三、总结与未来

本文内容就是在 Zeppelin notebook 里利用 Conda 来创建 Python env 自动部署到 Yarn 集群中,无需手动在集群上去安装任何 Pyflink 的包,并且可以在一个 Yarn 集群里同时使用多个版本的 PyFlink。

每个 PyFlink 的环境都是隔离的,而且可以随时定制更改 Conda 环境。可以下载下面这个 note 并导入到 Zeppelin,就可以复现今天讲的内容:http://23.254.161.240/#/notebook/2G8N1WTTS

此外还有很多可以改进的地方:

  • 目前我们需要创建 2 个 conda env ,原因是 Zeppelin 支持 tar.gz 格式,而 Flink 只支持 zip 格式。等后期两边统一之后,只要创建一个 conda env 就可以;
  • apache-flink 现在包含了 Flink 的 jar 包,这就导致打出来的 conda env 特别大,yarn container 在初始化的时候耗时会比较长,这个需要 Flink 社区提供一个轻量级的 Python 包 (不包含 Flink jar 包),就可以大大减小 conda env 的大小。

原文链接

本文为阿里云原创内容,未经允许不得转载。

PyFlink 开发环境利器:Zeppelin Notebook相关推荐

  1. python真实环境与虚拟环境均配置jupyter的方法,虚拟开发环境增加到notebook选项中

    第一步.在真实环境中安装jupyter,参考另一篇博客 第二.在目录中kernel目录下,添加一个目录,并在该目录下添加kernel json文件,写好配置文件:本质原理是新的目录下的配置文件中指定当 ...

  2. Python入门(二)之Python的集成开发环境(IDE)

    点赞.关注再看,养成良好习惯 本系列视频课程详见超星学习通:https://me.chaoxing.com(点击方可链接) 欢迎博友们亲临指导 1. 引言 在博文<Python入门(一)之Pyt ...

  3. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

  4. 搭建3款远程开发环境:Pycharm、Jupyter notebook以及code-server

    由于疫情人们对远程办公的渴望达到了巅峰.但在经历了多次试错与崩溃后,才发现能有一款与自己合拍的远程编程工具是多么的重要啊! 很多花费半天时间的事情,也许10分钟就能轻松搞定.本文就为大家介绍3个能在1 ...

  5. Go:分布式学习利器(1) -- 开发环境搭建 + 运行第一个go程序

    文章目录 为什么要学习 go 开发环境搭建 -- MAC 运行第一个go程序 go 函数的返回值设置 go 函数的命令行参数 为什么要学习 go 在如下几个应用场景的需求下产生了go: 超大规模分布式 ...

  6. 机器学习从理论到工程的第二步-开发环境与工具篇(下)

    好啦~继续昨天的<第二步--开发环境与工具篇(上)>~ 其实有点尴尬啦,本来想一篇讲完的,结果小夕太啰嗦了,还没有开始讲正文,就写了快2000字了...所以说,这一篇是上一篇的正文... ...

  7. android笔记1——开发环境的搭建

    Long Long ago...已经成为了历史,我还是要说出一个真相:早年前,那时候,android还不被大众所认知的时候,当然开发人员也没不像如今那样趋于饱和状态.一位大牛前辈,也是我的学长,那时候 ...

  8. 别再折腾开发环境了,一劳永逸的搭建方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:Jack Cui 网上教程五花八门,读者吐槽最多的,也都是怎 ...

  9. python ai应用开发_AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 联系我们 OpenmindChina@microsoft.com 零.前提条件 一台能联网的电脑,使用macOS操作系统 请确保鼠标.键盘.显示器 ...

最新文章

  1. python中字典的value可以为任意对象_Python对象作为字典值
  2. 429 too many requests错误出现在wordpress后台更新及官网的5种解决方法
  3. Linux中netfilter模块编程实践
  4. 多线程:happens-before原则
  5. 小米大数据:借助Apache Kylin打造高效、易用的一站式OLAP解决方案
  6. HDU4607(求树中的最长链)
  7. HashMap默认大小和扩容后的大小
  8. 在git的Bash下进行复制粘贴
  9. Python机器学习:线型回归法06最好的衡量线型回归法的指标RSquared
  10. php strcmp函数用法,php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)...
  11. c mysql主从复制_Mysql 主从复制
  12. 如何在html中插入带圈数字,Excel2013中带圈数字怎么输入
  13. 佳能打印机IP1880,打印提示墨盒收集器已满的解决方法
  14. 网件刷breed_小白爱折腾 篇二:矿渣小娱C1刷breed以安装固件(适用其他路由器)...
  15. 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-约束定义
  16. 网站搭建之PHP安装教程
  17. cv2.imread默认情况下读取的是彩色图片
  18. 技术从业者的未来(三)
  19. 一缕黑暗中的火光-----------状态图--------------优雅的建模语言
  20. (XJTLU)Methodology to MAV Auto-Polination

热门文章

  1. Linux的实际操作:用户管理(查ls -ahl,chown改文件所属者,chgrp改文件所属组,usermod改用户所属组)
  2. 特征级融合_遥感影像融合的方法有哪些
  3. 所有的图放到一个html,拖放是HTML5标准的组成部分,若想要把drag1图片放入d
  4. java观察者模式本质_6.[研磨设计模式笔记]观察者模式
  5. jsp工程防止外部注入_XPATH注入详解|OWASP Top 10安全风险实践(五)
  6. 友情提示,你该找一份假期实习啦!
  7. 【LeetCode笔记】69. x 的平方根(Java、二分)
  8. 【LeetCode笔记】538. 把二叉搜索树转换为累加树(Java、二叉搜索树、递归)
  9. python中webdriver_Python自动化学习--Webdriver中的常用方法
  10. 回调java 简书_Java接口回调机制详解【转】