python flink 1.9 環境搭建 - 處理kafka實例化報錯

我看網上都是一個版本的中文文檔,有些地方細節不夠清楚,我這裏補充一下。

首先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

補充

  1. java最好用"1.8.0_131"版本,不然很有可能會報錯.官方要求是8u51以上。
  2. yum install gcc gcc-c++ -y 依賴庫記得裝.
  3. NVM裝個node最新版,不然有的模塊可能編譯失敗

總結

我個人最後是都裝好了,但是苦於pyflink社區資料太少,本身java底子也不好,加上官方python文檔教程太少,經常要對照java的類猜參數,本身對流計算經驗甚少,轉向scala了。對自己技術有信心的小夥伴可以嘗試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章