我看網上都是一個版本的中文文檔,有些地方細節不夠清楚,我這裏補充一下。
首先flink在1.9纔開始支持支持python的。開發主要思路是要先把源碼編譯成python的依賴包,然後用pip命令把包集成到python庫。
安裝命令如下:
1.git clone https://github.com/apache/flink.git
2.git fetch origin release-1.9 && git checkout -b release-1.9 origin/release-1.9
3.mvn clean install -DskipTests -Dfast
顯示build success代表成功,如果你沒裝java1.8環境是build不起來的,貌似還需要node npm環境。
4.cd flink/flink-python; python3 setup.py sdist bdist_wheel (git目錄下有個flink-python目錄)
5.
建議使用python3環境安裝
pip3 install dist/*.tar.gz
6.
檢查一下python依賴包是否安裝上了
pip3 list|grep dev
關於如何使用這個包
官方文檔地址: https://ci.apache.org/projects/flink/flink-docs-release-1.9/api/python/
單節點集羣的部署
在上面步驟我們給python打上了pyflink1.9的依賴包,但是flink集羣我們還沒有部署。以下是部署步驟
wget https://archive.apache.org/dist/flink/flink-1.9.0/flink-1.9.0-bin-scala_2.12.tgz
tar xvf flink-1.9.0-bin-scala_2.12.tgz
cd flink-1.9.0/bin
./start-cluster.sh
訪問localhost:8081
使用DEMO
flink程序默認可以在本地起一個迷你集羣運行,當然你也可以使用你部署的flink集羣來執行這個腳本。
flink.py程序:
from pyflink.dataset import ExecutionEnvironment
from pyflink.table import TableConfig, DataTypes, BatchTableEnvironment
from pyflink.table.descriptors import Schema, OldCsv, FileSystem
exec_env = ExecutionEnvironment.get_execution_environment()
exec_env.set_parallelism(1)
t_config = TableConfig()
t_env = BatchTableEnvironment.create(exec_env, t_config)
t_env.connect(FileSystem().path('/tmp/input')) \
.with_format(OldCsv()
.line_delimiter(' ')
.field('word', DataTypes.STRING())) \
.with_schema(Schema()
.field('word', DataTypes.STRING())) \
.register_table_source('mySource')
t_env.connect(FileSystem().path('/tmp/output')) \
.with_format(OldCsv()
.field_delimiter('\t')
.field('word', DataTypes.STRING())
.field('count', DataTypes.BIGINT())) \
.with_schema(Schema()
.field('word', DataTypes.STRING())
.field('count', DataTypes.BIGINT())) \
.register_table_sink('mySink')
t_env.scan('mySource') \
.group_by('word') \
.select('word, count(1)') \
.insert_into('mySink')
t_env.execute("python_job")
(1) 迷你集羣使用方法,python3 flink.py
(2) 使用上述搭建好的集羣使用方法, cd flink-1.9.0/bin && ./flink run -py ~/demo/flink.py
執行成功可以看到:
異常處理
local class incompatible
那大概是你下載錯誤了flink的版本,造成python flink版本和flink自身的版本對不上,上述教程都是1.9的。
還有種可能性就是,flink可執行文件要用 wget https://archive.apache.org/dist/flink/flink-1.9.0/flink-1.9.0-bin-scala_2.12.tgz
包裏的,不要用之前git克隆的flink可執行文件。
處理kafka實例化報錯
如果你是按照上面教程,你會發現pyflink.table.descriptors import Kafka
中的 Kafka()
實例化會失敗,然而官方也沒有給出解決方案,根據不斷的嘗試摸索,正確的做法是,flink/flink-connectors/flink-connector-kafka-base/target
裏面的flink-connector-kafka-base_2.11-1.9-SNAPSHOT.jar
+ original-flink-connector-kafka-base_2.11-1.9-SNAPSHOT.jar
JAR包複製到flink/flink-python/dist/apache-flink-1.9.dev0/deps/lib
目錄,讓後使用tar czvf
命令重新打包成pyflink依賴包,把之前的卸載掉pip3 uninstall apache-flink && pipi3 install 新打包.tar.gz
.
— 補充: 實例化elasticsearch組件報錯也是同理。
– 補充2: 引用qinhan1219
處理kafka實例化報錯這一步 你是將flink-connector-kafka-base_2.11-1.9-SNAPSHOT.jar + original-flink-connector-kafka-base_2.11-1.9-SNAPSHOT.jar複製到flink/flink-python/dist/apache-flink-1.9.dev0/deps/lib目錄,這一步確實實例化Kafka()的時候不會報錯,但是後面編程時候會有很大問題 正確做法將 flink-json-1.10.0-sql-jar.jar flink-sql-connector-kafka_2.11-1.10.0.jar kafka-clients-2.2.0.jar flink-jdbc_2.11-1.10.0.jar這幾個包複製到site-packages/pyflink/lib下就可以了 我的是/home/yy1s/project/test/lib/python3.6/site-packages/pyflink/lib /home/yy1s/project/test/lib/python3.6/site-packages/pyflink/lib [yy1s@hub lib]$ ls -lrt total 154404 -rw-rw-r–. 1 yy1s yy1s 9931 Sep 2 2019 slf4j-log4j12-1.7.15.jar -rw-rw-r–. 1 yy1s yy1s 489884 Sep 2 2019 log4j-1.2.17.jar -rw-rw-r–. 1 yy1s yy1s 19301237 Feb 7 13:54 flink-table_2.11-1.10.0.jar -rw-rw-r–. 1 yy1s yy1s 22520058 Feb 7 13:54 flink-table-blink_2.11-1.10.0.jar -rw-rw-r–. 1 yy1s yy1s 110055308 Feb 7 13:54 flink-dist_2.11-1.10.0.jar -rw-r–r--. 1 yy1s yy1s 89695 Feb 7 14:51 flink-jdbc_2.11-1.10.0.jar
補充
- java最好用"1.8.0_131"版本,不然很有可能會報錯.官方要求是8u51以上。
yum install gcc gcc-c++ -y
依賴庫記得裝.- NVM裝個node最新版,不然有的模塊可能編譯失敗
總結
我個人最後是都裝好了,但是苦於pyflink社區資料太少,本身java底子也不好,加上官方python文檔教程太少,經常要對照java的類猜參數,本身對流計算經驗甚少,轉向scala了。對自己技術有信心的小夥伴可以嘗試。