Flink任務提交源碼閱讀(一):flink腳本


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()

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