PS:在工作中有個需求:使用java API的方式提交flink job 到yarn上,有yarn負責部署集羣運行任務,待任務運行完成後銷燬集羣,官方沒有提供類似的java API怎麼辦,沒辦法只能看源碼自己幹了,也趁這個機會閱讀flink提交任務的源碼並記錄以便後期學習查看。
Flink版本&任務提交方式及示例
閱讀版本:Flink1.9.0
任務提交方式:運行命令行flink腳本
使用flink腳本提交任務示例:
./bin/flink run -m yarn-cluster -yjm 2048 -ytm 4096 -ys 16 -p 20 -ynm flinkOnYarnTESTweb ./examples/batch/WordCount.jar
run 是flink 運行的一個action,後面是一堆參數。
先來看看安裝好flink1.9.0後,它的bin目錄下有什麼
這麼多腳本,我們暫時只關注flink、config.sh兩個腳本文件;config.sh中定義了很多flink程序中會用到的環境變量,flink是任務提交的入口,在flink腳本中會引用config.sh
看看flink腳本中都有啥:
# 獲取當前腳本名
target="$0"
iteration=0
# 判斷腳本名合法性
while [ -L "$target" ]; do
if [ "$iteration" -gt 100 ]; then
echo "Cannot resolve path: You have a cyclic symlink in $target."
break
fi
ls=`ls -ld -- "$target"`
target=`expr "$ls" : '.* -> \(.*\)$'`
iteration=$((iteration + 1))
done
# 獲取當前腳本的上一層路徑
bin=`dirname "$target"`
# get flink config
. "$bin"/config.sh
if [ "$FLINK_IDENT_STRING" = "" ]; then
FLINK_IDENT_STRING="$USER"
fi
CC_CLASSPATH=`constructFlinkClassPath`
log=$FLINK_LOG_DIR/flink-$FLINK_IDENT_STRING-client-$HOSTNAME.log
log_setting=(-Dlog.file="$log" -Dlog4j.configuration=file:"$FLINK_CONF_DIR"/log4j-cli.properties -Dlogback.configurationFile=file:"$FLINK_CONF_DIR"/logback.xml)
# Add HADOOP_CLASSPATH to allow the usage of Hadoop file systems
# 使用exec啓用新進程,調用java方法org.apache.flink.client.cli.CliFrontend,這個類的main方法就是job提交的入口
exec $JAVA_RUN $JVM_ARGS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" org.apache.flink.client.cli.CliFrontend "$@"
以上腳本可以解讀爲:在運行job提交的入口類CliFrontend之前爲其設置必要的環境變量、參數及必要的jar包,其中尤爲重要的一個jar包是:flink-dist_2.11-1.9.0.jar
所以執行flink腳本後最後運行的命令是這樣的
exec /opt/jdk1.8.0_211/bin/java
-Dlog.file=/opt/flink-1.9.0/log/flink-root-client-louisvv.log
-Dlog4j.configuration=file:/opt/flink-1.9.0/conf/log4j-cli.properties
-Dlogback.configurationFile=file:/opt/flink-1.9.0/conf/logback.xml
-classpath /opt/flink-1.9.0/lib/log4j-1.2.17.jar
:/opt/flink-1.9.0/lib/slf4j-log4j12-1.7.15.jar
:/opt/flink-1.9.0/lib/flink-dist_2.11-1.9.0.jar
::: org.apache.flink.client.cli.CliFrontend
其中我們需要重點關注的是:
1、加載flink classpath
加載的三個jar包是flink程序運行必須設定的包,
PS:後面我在工作中想要通過java API提交job的實現過程中,因爲flink-dist_2.11-1.9.0.jar包的問題卡了好久好久。
2、程序的入口類:org.apache.flink.client.cli.CliFrontend類
這個類是運行命令行命令的入口類,主要功能是接收並解析命令行傳入的命令,調用相應工具類執行命令,它有一下actions:
- run:編譯並運行程序
- cancel:取消正在運行的程序(官方不推薦使用該方式)
- stop:使用保存點停止正在運行的程序(僅用於流作業)
- savepoint:觸發正在運行的作業的保存點或處置現有的保存點
- info:顯示程序執行計劃(JSON)
- list:列出正在運行和計劃的程序
我們使用run來提交job程序。
閱讀繼續:
Flink1.9.0任務提交源碼閱讀(二):入口類CliFrontend
Flink1.9.0任務提交源碼閱讀(三):Job提交 run()