想要了解任何Apache下的平台框架,我们可以首先通过官网进行学习,下面介绍一下PyFlink的安装步骤。
PyFlink的安装与配置
1 下载安装
系统: CentOS
环境依赖:Java 1.8+(1.8.0_252)
Maven 3.x(3.2.5)最好使用Maven3.2.5,3.3以上的可能会出现一些错误
Scala 2.11+(2.13.0)
Python 2.7+ (3.6)
Git 2.20+(2.24.0)
Pip 9.1+(pip 9.0.3)
下载:Flink-1.10.1
注:括号内是本机的环境
1.1 安装Maven
Centos中没有自带安装Maven,需要手动安装Maven。直接使用如下指令下载maven即可,下载位置为当前目录:
wget https://archive.apache.org/dist/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5bin.tar.gz
下载完成之后,解压并安装:
tar zxvf apache-maven-3.2.5-bin.tar.gz
修改文件名:
sudo mv apache-maven-3.2.5 maven
配置环境变量:
vim /etc/profile
将下面代码加入到profile中:
# /usr/local/maven是你maven安装的位置
export MAVEN_HOME=/usr/local/maven
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
代码加入后如下图所示:
重新加载系统配置文件:
source /etc/profile
# 查看是否安装完成。
mvn -v
1.2 安装Flink:
下载源代码:
git clone https://github.com/apache/flink.git
对于国内的用户,下载 github 上的代码可能比较慢,可以在/etc/hosts 中增加如下配置, 可以显著提升github的下载速度:
151.101.72.133 assets-cdn.github.com
151.101.73.194 github.global.ssl.fastly.net
192.30.253.113 github.com
11.238.159.92 git.node5.mirror.et2sqa
注:粘贴到hosts后要分为四行,而且中间不要有空格,如果不能提升下载速度的话,重启终端再进行下载。
接着拉取1.10的分支:
cd flink/
git fetch origin release-1.10 && git checkout -b release-1.10 origin/release-1.10
修改maven settings的配置,输入以下指令进入setting.xml:
cd /usr/local/maven/conf/
vim settings.xml
进入到setting.xml后,修改镜像配置:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots,!mapr-releases</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>mapr-public</id>
<mirrorOf>mapr-releases</mirrorOf>
<name>mapr-releases</name>
<url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>
修改后如下图所示:
此处是使用了aliyun提供的镜像仓库。
进入解压后的flink文件夹,编译Flink代码:(注:在编译之前,scala,git,java等环境依赖要配置好)
mvn clean install -DskipTests -Drat.skip=true -Dcheckstyle.skip=true
这个编译的时间可能会长一些
编译过程中可能会出现下列问题:
[ERROR] Failed to execute goal on project flink-avro-confluent-registry: Could not resolve dependencies for project org.apache.flink:flink-avro-confluent-registry:jar:1.9-SNAPSHOT: Failure to find io.confluent:kafka-schema-registry-client:jar:3.3.1 in http://maven.aliyun.com/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or updates are forced -> [Help 1]
解决方案:
下载上述错误提示缺少某个jar包,此时我们使用wget 进行下载:
wget http://packages.confluent.io/maven/io/confluent/kafka-schema-registry-client/3.3.1/kafka-schema-registry-client-3.3.1.jar
下载完成后在你的当前目录会出现一个jar包:
安装这个jar包:
mvn install:install-file -DgroupId=io.confluent -DartifactId=kafka-schema-registry-client -Dversion=3.3.1 -Dpackaging=jar -Dfile=/usr/local/kafka-schema-registry-client-3.3.1.jar
注:这里的/usr/local是我的jar包所在的目录,使用时需要将其改成你的jar包所在的目录,如果安装不成功,重启终端再次安装。
在整个编译过程中,当某些项目编译失败时,可能会是网络问题,再重新编译一次即可。
最终编译成功的界面如下图所示:
如下图所示,编译成功后会在你的目录中出现一个build-target文件:
2 编程实现wordcount
使用如下指令Java 包囊括进来,再把自己 PyFlink 本身模块的一些 Java 的包和 Python 包打包成一起:
cd flink-python
python3 setup.py sdist
注:当python3 setup.py sdist这段命令无法执行时,重启终端再次执行即可。
然后执行下列指令:
cd dist/
如下图所示,此时我们可以看到dist文件夹下有一个可以用于 pip install 的 PyFlink 包:
接下来我们首先检查命令的正确性,在执行之前,我们用 pip3 检查一下 list,我们要看在已有的包里有没有这个包:
pip3 list
我们可以看到如下结果:
如图所示,我们并没有apache-flink的包,此时我们要使用如下命令进行安装:
pip install dist/*.tar.gz
注:执行这条指令的时候要退回到上一次文件夹中,不要在dist文件夹中执行这条指令。
如果pip3 install安装速度很慢的话,使用清华园镜像,即在末尾加上:
-i https://pypi.tuna.tsinghua.edu.cn/simple
如果出现timeout的错误的话,则在末尾加上:--default-timeout=100
出现以下错误的话:
Command “/usr/bin/python3.6 -u -c “import setuptools, tokenize;file=’/tmp/pip-build-ld1n0zah/grpcio/setup.py’;f=getattr(tokenize, ‘open’, open)(file);code=f.read().replace(’\r\n’, ‘\n’);f.close();exec(compile(code, file, ‘exec’))” install --record /tmp/pip-ney8umyq-record/install-record.txt --single-version-externally-managed --compile” failed with error code 1 in /tmp/pip-build-ld1n0zah/grpcio/
执行以下代码解决这个问题:
Pip3 install --upgrade setuptools
python -m pip install --upgrade pip --default-timeout=100
执行结果如下图所示:
此时我们再执行pip3 list的命令,我们就可以发现apache-flink包已经包含在里面了:
安装完成后,我们使用WordCount 例子来验证环境是否正确:
# 首先使用vim命令创建一个soruce.csv文件
vim source.csv
文件内容如下图所示,这个文件可以根据自己的情况来写。
接下来我们创建一个python文件:
vim wordcount.py
python文件内的具体代码如下所示:
# -*- coding: utf-8 -*-
from pyflink.dataset import ExecutionEnvironment
from pyflink.table import TableConfig, DataTypes, BatchTableEnvironment
from pyflink.table.descriptors import Schema, OldCsv, FileSystem
import os
# 数据源文件,这里的源文件路径是我刚刚创建的source.csv的路径
source_file = '/usr/local/flink/enjoyment.code/myPyFlink/enjoyment/source.csv'
# 计算结果文件
sink_file = 'sink.csv'
# 创建执行环境
exec_env = ExecutionEnvironment.get_execution_environment()
# 设置并发为1 方便调试
exec_env.set_parallelism(1)
t_config = TableConfig()
t_env = BatchTableEnvironment.create(exec_env, t_config)
# 如果结果文件已经存在,就先删除
if os.path.exists(sink_file):
os.remove(sink_file)
# 创建数据源表
t_env.connect(FileSystem().path(source_file)) \
.with_format(OldCsv()
.line_delimiter(',')
.field('num', DataTypes.STRING())) \
.with_schema(Schema()
.field('num', DataTypes.STRING()))\
.register_table_source('mySource')
# 创建结果表
t_env.connect(FileSystem().path(sink_file)) \
.with_format(OldCsv()
.field_delimiter(',')
.field('num', DataTypes.STRING())
.field('count', DataTypes.BIGINT())) \
.with_schema(Schema()
.field('num', DataTypes.STRING())
.field('count', DataTypes.BIGINT())) \
# 非常简单的word_count计算逻辑
t_env.scan('mySource') \
.group_by('num') \
.select('num, count(1)') \
.insert_into('mySink')
# 执行Job
t_env.execute("wordcount")
启动flink
# 进入build-target的bin目录下
cd /usr/local/flink/build-target/bin/
# 启动flink
./start-cluster.sh
将wordcount.py代码提交到flink上去执行:
./bin/flink run -m localhost:8081 -py ~/PycharmProjects/test/wordcount.py
注:我们需要新进入build-target目录才能执行这段指令,执行结果如图所示:
这个代码的含义是是读了一个 source.csv 文件,把结果写到 sink.csv 文件。我们来查看sink.csv文件:
vim sink.csv
我们可以看到结果如下图所示,此时就说明我们的wordcount代码执行成功。
此时说明我们已经成功安装了PyFlink。
注:flink 1.11.1的安装与flink 1.10.0的安装类似,其安装包可以去官网上下载
https://www.apache.org/dyn/closer.lua/flink/flink-1.11.1/flink-1.11.1-src.tgz
下载清华园的版本即可
https://mirrors.tuna.tsinghua.edu.cn/apache/flink/flink-1.11.1/flink-1.11.1-src.tgz
Reference
如何在 Apache Flink 中使用 Python API?
在Linux上安装Flink以及编写打包WordCount程序