ubuntu虚拟机下Pyflink环境搭建与集群使用

ubuntu虚拟机下Pyflink环境搭建与集群使用

  • 前言
  • 开始之前
    • 环境准备
    • 安装JDK
    • 安装python3.8
      • 安装python本体
      • (选择性操作)删除原来的python链接
      • 正式安装python3
      • 为python添加链接
    • 使用pip安装所需的环境
      • (选择性操作)安装pip
      • 安装pyflink
    • 使用pyflink
  • 单节点运行以及任务提交测试
    • 配置flink-conf.yaml
    • 启动节点
    • 提交任务
  • 集群配置以及测试
    • 配置hostnames
    • 设置主节点FLINK_HOME
      • 查找pyflink的安装位置以及相关参数
      • 修改.bashrc
    • 配置子节点
      • 检查flink相关依赖以及版本
    • 修改Master的flink配置文件
      • flink-conf.yaml
      • masters
      • workers
      • 打包flink并分发
      • 启动集群
  • 笔者遇到过的坑
    • 坑1:代理
    • 坑2:没有配置python链接
    • 坑3:运行着Scala的flink,上传py的任务
    • 坑4:权限问题
  • 结语

ubuntu虚拟机下Pyflink环境搭建与集群使用

前言

为了能更方便的开发flink应用, 笔者决定使用python+flink进行代码开发,然而中文论坛上很难找到一个详细的教程在ubuntu上配置一个pyflink集群,用于提交python脚本执行任务。笔者在提交pyflink任务的时候踩了很多坑,最后终于配好了框架并且能够提交python任务,归根结底造成这些困难的原因还是环境没搭好,希望这篇文章能够给初学者带来一些帮助,节省时间快速入门。
首先,有问题一定要首先从官方获取帮助pyflink官方文档 。
其次,要学会看错误输出,首先自己粗略浏览一遍错误输出,看到有没有熟悉的内容是自己有操作过,配置过的,比如一些IP地址,还有python解释器的版本,这些都是可以自行更改配置的,通常如果一个刚搭建的flink框架如果有问题,那么应该着重排查这些可以自行配置的内容。

开始之前

环境准备

这里的环境列出的是笔者所用的环境,大家可以根据自己的需求使用,其中python的版本应在3.7~3.10之间,后续如果支持到更高的python版本,请以官方文档为准。

环境版本
jdk1.8.0_162
python3.8.10
apache-flink1.17.1
Ubuntuubuntu1~20.04

apache-flink就是我们要安装的pyflink,它不仅包含了python的API,也包含了一个完整的flink框架,我们需要使用这个框架来启动集群。
有的同学可能希望通过anaconda来管理环境,值得一提的是,pyflink并不能通过conda install进行安装,笔者由于并不熟练使用conda管理虚拟环境,不知道如何解决后面提到的链接操作,导致踩了坑,所以笔者也不推荐初学者上来看到flink官方说可以使用anaconda管理虚拟环境,于是也配了anaconda。如果使用了anaconda创建了虚拟环境,并且能够让flink集群正确用上合适的python环境,那么可以通过调用对应python环境下的pip来安装pyflink。

安装JDK

由于笔者使用的是oracle的jdk,所以笔者建议使用oracle的jdk而不是openjdk。
如果已经安装了jdk,这部分内容可以跳过。
首先把准备好的jdk文件解压到你想要的目录,这里我使用的是

/usr/lib/jvm/

解压文件:

sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm

配置JAVA_HOME

vim ~/.bashrc

添加以下内容:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

应用更改

source ~/.bashrc

测试java环境:

java -version

如果出现:

则说明安装成功,继续下一步

安装python3.8

如果已经安装过python3.7~3.10,那么可以跳过安装本体部分
如果不确定自己是否已经安装过python,可以使用以下命令,查看目前可用的python:

ls /usr/bin/python*

这条命令查看了系统能够调用的python二进制文件的软链接。
值得注意的是,pyflink在提交任务的时候,使用的是/usr/bin/文件夹下名为python的软连接,所以这个名为python的软连接一定要配置,并且包含了apache-flink所需要的库。
简单来说,如果你在命令行中输入python能够打开python的命令行,并且可以正常调用apache-flink库,那么flink就可以调用python解释器接收python脚本形式的任务。

安装python本体

(选择性操作)删除原来的python链接

如果选择重新安装python,安装了新的环境,想要使用新的环境,则需要删除原来的链接,并添加新链接

sudo rm /usr/bin/python3   

正式安装python3

文章参考:Ubuntu安装Python3.8

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.8

为python添加链接

sudo ln -s /usr/bin/python3.8 /usr/bin/python3

这时候可以尝试使用来验证python是否正确配置

python3 --version

然而链接的添加并没有结束,根据pyflink官方文档的提示,

我们需要添加:

sudo ln -s /usr/bin/python3 /usr/bin/python

使用pip安装所需的环境

(选择性操作)安装pip

默认安装Python3之后自动安装pip3,如果在终端中敲入

pip3 -V

显示

bash: pip command not found

那么需要设置一下pip

sudo apt-get install python3-pip

安装pyflink

如果pip已经可以正常使用,那么直接输入:

pip install apache-flink

笔者推荐使用pip官方源,如果有下载速度过慢,连接超时的问题,可以使用代理解决。
其中我们只需要在主机端的clash找到主机的IP地址,和clash配置的端口号,组成这样的形式:http://主机IP:端口号 的形式,就可以使用主机上的代理访问官方源。
使用代理的pip 指令:

pip install apache-flink --proxy=http://主机IP:端口号

安装过程会自动安装依赖包,如果安装过程中有红字提示依赖未安装,可以手动安装。

使用pyflink

如果上一步没有安装出错,那么我们可以使用

pip show apache-flink

来查看pyflink的安装位置:

进入flink的文件夹:

cd /home/hadoop/.local/lib/python3.8/site-packages/pyflink/

我们可以看到文件夹下有完整的flink框架:

通过examples测试一下flink的pythonAPI:

python examples/datastream/word_count.py

看到如下输出,并且没有报错。
说明flink pythonAPI调用成功。

单节点运行以及任务提交测试

配置flink-conf.yaml

在启动节点之前,首先要配置./conf/flink-conf.yaml的参数

 vim ./conf/flink-conf.yaml

其中

jobmanager.rpc.address: Master

Master是笔者的taskmanager节点名称,也是本机名称,大家可以根据自己的实际情况进行修改
其余参数
如果需要使用flinkweb,可以把rest.bind-address简单配置成:

rest.bind-address: 0.0.0.0

启动节点

启动集群,以提交任务

./bin/start-cluster.sh

可以使用jps查看节点是否成功启动:

提交任务

提交的任务我们采用examples,这样就不需要自己编写代码,也不需要准备数据源

./bin/flink run --python ./examples/datastream/word_count.py


可以看到虽然没有输出,但是也没有报错,没有输出,就是最好的输出。
到此我们已经完成了flink单节点任务提交测试,后续会更新集群的配置以及测试

集群配置以及测试

配置hostnames

对网络比较熟悉的同学可以跳过这一部分。
为了能够使用别名来连接各个节点,方便配置文件的编写,笔者建议修改hosts文件,用别名来代替IP地址
首先查看当前节点的IP地址:

ip a


一般来说只会有一个网卡,笔者这里配置了两个网卡,挑选一个能够让节点之间互相ping通的ip地址即可

修改hosts配置文件:

sudo vim /etc/hosts

添加以下内容(根据自己的实际情况修改):

192.168.56.2 Master
192.168.56.3 Slave1
192.168.56.4 Slave2

测试:

这里演示了Master的配置方法,其余的节点同样地添加以上的三行内容即可。

设置主节点FLINK_HOME

FLINK_HOME是一个环境变量参数,我们可以在用户目录(建议)下的.bashrc 文件配置它。
这里我们首先配置MASTER的FLINK_HOME。
FLINK_HOME表示了当前机器的Flink位置,
同时FLINK_HOME告诉MASTER(主节点)如何从子节点找到Flink可执行程序并启动它,成为worker。
所以Worker的Flink路径应该要和Master的Flink路径一致。

查找pyflink的安装位置以及相关参数

pip show apache-flink


这里我们可以看到一会要用到的flink的版本号以及安装位置等信息。

version:1.17.1
location:/home/hadoop/.local/lib/python3.8/site-packages

修改.bashrc

我们可以先试着切换到flink的文件夹,确认一下文件是否存在:

cd  /home/hadoop/.local/lib/python3.8/site-packages/pyflink/

如果存在,复制这个路径( /home/hadoop/.local/lib/python3.8/site-packages/pyflink/),一会要用到

vim ~/.bashrc

添加:

export FLINK_HOME=/home/hadoop/.local/lib/python3.8/site-packages/pyflink
export PATH=$FLINK_HOME/bin:$PATH


笔者由于worker的环境是python3.10,且没办法卸载后安装3.8,经过在worker测试集群后,最后定下了这个目录,
但是理论上用3.8的路径也是可以的。

保存之后,输入:

source ~/.bashrc 
flink --version


如果配置正确,那么终端会显示flink的版本,否则会报错

配置子节点

在分发flink之前,需要按照上面的内容对其它节点配置,但是中间如果有python环境不一样,比如主节点用的是python3.8而子节点用的是python3.10,这种情况不需要惊慌,虽然有可能因为python的API不一致导致flink启动失败,但其实保证flink版本一致,其实问题不大。
值得注意的是,即便我们要从Master拿一个flink客户端来用,也依旧需要用pip安装apache-flink 来安装相关的依赖。
子节点也需要配置FLINK_HOME,

检查flink相关依赖以及版本

在配置之前,我们应该检查pip安装的flink和主机的flink版本是否一致。

pip show apache-flink

也可以切换到pyflink目录下,输入:

./bin/flink --version

查看版本

如果版本不一致,则使用

pip uninstall apache-flink
pip install apache-flink==1.17.1

安装指定版本的flink。

还有一个问题是有的同学可能worker用的python版本和Master的不一样,比如笔者Master用的是3.8,而worker用的是3.10,这时候我们只要

mkdir -p /home/hadoop/.local/lib/python3.8/site-packages/pyflink/

来创建这个目录就好。

修改Master的flink配置文件

flink-conf.yaml

flink-conf.yaml是flink客户端的主要配置文件,大部分运行参数都在这里配置。
进入master的FLINK目录

cd $FLINK_HOME

编辑flink.conf:

vim ./conf/flink-conf.yaml

根据自己的实际情况,修改以下参数:

jobmanager.rpc.address: Master
io.tmp.dirs: /home/hadoop/.local/lib/python3.8/site-packages/pyflink/temp
jobmanager.bind-host: 0.0.0.0
taskmanager.bind-host: 0.0.0.0
rest.bind-address: 0.0.0.0
taskmanager.host: Master

其中
jobmanager.rpc.address:jobmanager的IP地址。
io.tmp.dirs:临时文件的存放位置。
然后为io.tmp.dirs创建相应的路径,以免后面因为找不到路径抛出异常。

mkdir /home/hadoop/.local/lib/python3.8/site-packages/pyflink/temp

masters

./conf/masters文件声明了集群的master,也就是jobmanager。

vim ./conf/master

添加以下内容:

master:8081

workers

./conf/wokers文件声明了集群中的taskermanagers。

vim ./conf/workers

添加以下内容:

Master
Slave1
Slave2

打包flink并分发

为了分发flink,我们需要先对其打包

cd ..
tar -zcf  ~/pyflink.master.tar.gz ./pyflink

这条命令把flink打包为pyflink.master.tar.gz ,并存放于当前用户的home文件夹下。

分发flink

scp ./pyflink.master.tar.gz Slave1:/home/hadoop
scp ./pyflink.master.tar.gz Slave2:/home/hadoop

接下来我们到其他节点进行操作:
Slave1:

mkdir -p /home/hadoop/.local/lib/python3.8/site-packages/
sudo tar -zxf ~/pyflink.master.tar.gz -C /home/hadoop/.local/lib/python3.8/site-packages/
chown -R hadoop /home/hadoop/.local/lib/python3.8/site-packages/pyflink/

Slave2:

mkdir -p /home/hadoop/.local/lib/python3.8/site-packages/
sudo tar -zxf ~/pyflink.master.tar.gz -C /home/hadoop/.local/lib/python3.8/site-packages/
chown -R hadoop /home/hadoop/.local/lib/python3.8/site-packages/pyflink/

这里包含了解压( tar -zxf )和修改路径下所有文件所属权(chown -R )
修改文件所属权很重要,因为文件来源是另外一个节点,所以解压出来的文件权限不属于当前节点的用户,会导致无法写入。

启动集群

在Master上操作:

cd /home/hadoop/.local/lib/python3.8/site-packages/pyflink/
./bin/start-cluster.sh

如果没有报错,我们可以等待一段时间(大概3~5分钟)
然后在每个节点上查看JPS:

jps

master:


slave1:

slave2:

如果看到对应的进程都已经正常启动,且保持到了3~5分钟左右,就可以确定现在集群已经正常运行了
接下来再检查一下slot数目是否正常:
在浏览器输入:

http://192.168.56.2:8081/

这里的192.168.56.2是master的IP地址,大家根据自己的实际情况填写
按照配置文件,我的每个节点提供一个slot,所以总共有3个slot:

如果大家的slot和自己的节点数不一致,那么请检查一下子节点flink的配置文件是否和主机的一致。

另外,最后笔者还想确认一点:
master在子节点中启动的flink真的是是根据FLINK_HOME启动的吗?
笔者移动了各节点的的pyflink文件夹到python3.10(原本在3.8下)的目录下,并且修改了相应的FLINK_HOME,
在启动flink集群之后,我们在master的命令行输入:

jps -lv

这条命令用于查看jvm下运行的程序的类的路径等。
可以看到:
master:

slave1:

slave2:

这个结果说明,FLINK_HOME告诉了master,flink在子节点的哪个位置。

笔者遇到过的坑

坑1:代理

之前为了apt能够使用代理,在Ubuntu桌面的设置里配置了代理,导致报错,仔细检查了日志,发现有里面有配置的代理的IP地址,虽然当时不知道是不是这个问题导致无法提交任务上flink,但是确实给我造成了烟雾弹的效果。
关闭ubuntu代理(桌面):

关闭ubuntu代理(terminal):
之前还在bashrc里配置了代理,也先注释掉了

vim ~/.bashrc 


设置完后重启
还有其他情况,比如直接在命令行输入export http_proxy 来设置代理的,直接重启机器就好。

坑2:没有配置python链接

在笔者踩其他坑之前,这个坑可能一直影响着笔者,导致笔者一直不能成功上传任务,如果笔者早些按照官方文档的说明来配置flink,也许不需要踩那些坑。

坑3:运行着Scala的flink,上传py的任务

当时并不知道安装pyflink会自带一个flink框架,用了以前学习的时候用的老flink,所以倒腾了半天也没有进度。

坑4:权限问题

分发flink的时候,没有更改路径的权限,启动不起来

结语

待施工

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/72908.html