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

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