以下是在application模式中,通过java代码提交任务遇到的问题以及一些总结:
1、将core-site.xml,flink-conf.yaml,hdfs-site.xml,mapred-site.xml,yarn-site.xml放到resources目录下
2、无法读取到本地的conf文件
org.apache.hadoop.conf.Configuration conf = new org.apache.conf.Configuration();
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
3、指定flink下的conf目录
String configurationDirectory = "/opt/flink-1.11.0/conf";
4、将flink目录下的lib目录中的文件上传至hdfs
String flinkLibs = "hdfs://192.168.30.100:8020/flinkApplication/libs";
5、指定要运行flink代码的jar
String userJarPath = "hdfs://192.168.30.100:8020/flinkApplication/jars/demo-1.0-SNAPSHOT.jar";
6、指定flink-yarn_2.11-1.11.0.jar的hdfs路径
String flinkDistJar = "hdfs://192.168.30.100:8020/flinkApplication/yarnJar/flink-yarn_2.11-1.11.0.jar";
7、设置用户jar的参数和主类
ApplicationConfiguration appConfig = new ApplicationConfiguration(args,"com.test.demo.TestDemo");
8、pom文件中
org.apache.hadoop
hadoop-client
3.0.0
provided
org.apache.flink
flink-yarn_${scala.binary.version}
${flink.version}
org.apache.hadoop
hadoop-yarn-common
1、指定yarn的ApplicationId
2、指定flink的jobId
3、指定flink的savePoint的地址(hdfs上)
java -cp demo-1.0-SNAPSHOT.jar cluster.SubmitJobApplicationMode
根据flink官方文档:
在flink-conf.yaml中,配置参数:
rest.bind-port: 50010
在防火墙后面的YARN上运行Flink
一些YARN群集使用防火墙来控制群集与网络其余部分之间的网络流量。在这些设置中,只能将Flink作业从群集网络内部(在防火墙之后)提交到YARN会话。如果这对于生产用途不可行,则Flink允许为其REST端点配置端口范围,该端口范围用于客户端群集通信。配置了此范围后,用户还可以将作业提交给穿越防火墙的Flink。
用于指定REST端点端口的配置参数如下:
rest.bind-port
此配置选项接受单个端口(例如:“ 50010”),范围(“ 50000-50025”)或两者的组合(“ 50010,50011,50020-50025,50050-50075”)。
请确保
rest.port
未指定配置选项,因为该选项优先于rest.bind-port
并且不接受范围。(Hadoop使用的是类似的机制,其中的配置参数称为
yarn.app.mapreduce.am.job.client.port-range
。)
参考文章
flink教程-详解flink 1.11中的新部署模式-Application模式
完整代码请参考:
https://github.com/zhangjun0x01/bigdata-examples/blob/master/flink/src/main/java/cluster/SubmitJobApplicationMode.java