Flink区分运行环境的方法是什么

这篇文章主要介绍“Flink区分运行环境的方法是什么”,在日常操作中,相信很多人在Flink区分运行环境的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flink区分运行环境的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Flink判断运行环境(本地、集群)的逻辑如下:

(1)在任务的main方法中,通过 StreamExecutionEnvironment 获取运行环境

StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();

(2)生成运行环境的工厂类放在ThreadLocal中;threadLocalContextEnvironmentFactory 是StreamExecutionEnvironment类的静态属性 

	/** The ThreadLocal used to store {@link StreamExecutionEnvironmentFactory}. */
	private static final ThreadLocal<StreamExecutionEnvironmentFactory> threadLocalContextEnvironmentFactory = new ThreadLocal<>();

①当是本地IDE直接运行任务main方法时,ThreadLocal中获取到的StreamExecutionEnvironmentFactory为空,此时生成本地运行环境LocalStreamEnvironment

	public static StreamExecutionEnvironment getExecutionEnvironment() {
		return Utils.resolveFactory(threadLocalContextEnvironmentFactory, contextEnvironmentFactory)
			.map(StreamExecutionEnvironmentFactory::createExecutionEnvironment)
			.orElseGet(StreamExecutionEnvironment::createLocalEnvironment);
	}

当ThreadLocal中有StreamExecutionEnvironmentFactory时,则用其createExecutionEnvironment()方法来生成运行环境

②当集群环境时,是如何将StreamExecutionEnvironmentFactory放入到ThreadLocal中?

通过 bin/flink run ....   命令提交jar包到集群运行命令时,该脚本会调用 org.apache.flink.client.cli.CliFrontend  来运行用户程序,如下:

.......
.......
# Add HADOOP_CLASSPATH to allow the usage of Hadoop file systems
exec $JAVA_RUN $JVM_ARGS $FLINK_ENV_JAVA_OPTS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" org.apache.flink.client.cli.CliFrontend "$@"

在CliFrontend中依次执行以下方法 main() ->  parseParameters() -> run() -> executeProgram() 

	protected void executeProgram(final Configuration configuration, final PackagedProgram program) throws ProgramInvocationException {
		ClientUtils.executeProgram(new DefaultExecutorServiceLoader(), configuration, program, false, false);
	}

在org.apache.flink.client.ClientUtils的executeProgram()中调用 StreamContextEnvironment.setAsContext(...),StreamContextEnvironment继承自StreamExecutionEnvironment。setAsContext()代码如下

	public static void setAsContext(
			final PipelineExecutorServiceLoader executorServiceLoader,
			final Configuration configuration,
			final ClassLoader userCodeClassLoader,
			final boolean enforceSingleJobExecution,
			final boolean suppressSysout) {
		StreamExecutionEnvironmentFactory factory = () -> new StreamContextEnvironment(
			executorServiceLoader,
			configuration,
			userCodeClassLoader,
			enforceSingleJobExecution,
			suppressSysout);
		initializeContextEnvironment(factory);
	}

创建生成运行环境的工厂类实例,在initializeContextEnvironment()方法中把实例放到StreamExecutionEnvironment类的静态属性threadLocalContextEnvironmentFactory 中 ,代码如下

	protected static void initializeContextEnvironment(StreamExecutionEnvironmentFactory ctx) {
		contextEnvironmentFactory = ctx;
		threadLocalContextEnvironmentFactory.set(contextEnvironmentFactory);
	}

这样在用户程序 StreamExecutionEnvironment.getExecutionEnvironment() 时,获取到的运行环境就是StreamContextEnvironment类的setAsContext()方法中生成的

	public static void setAsContext(
			final PipelineExecutorServiceLoader executorServiceLoader,
			final Configuration configuration,
			final ClassLoader userCodeClassLoader,
			final boolean enforceSingleJobExecution,
			final boolean suppressSysout) {
		StreamExecutionEnvironmentFactory factory = () -> new StreamContextEnvironment(
			executorServiceLoader,
			configuration,
			userCodeClassLoader,
			enforceSingleJobExecution,
			suppressSysout);
		......
	}

本地运行环境LocalStreamEnvironment 和 独立集群、flink on yarn等运行环境StreamContextEnvironment 的主要区别在于,他们的成员属性 configuration 不同。LocalStreamEnvironment 中是创建的空键值对(new Configuration()),而StreamContextEnvironment 是通过 CliFrontend 生成的 Configuration 对象。

到此,关于“Flink区分运行环境的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注本站网站,小编会继续努力为大家带来更多实用的文章!

相关推荐:

Flink中AllowedLateness是什么

这篇文章给大家分享的是有关Flink中AllowedLateness是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。FlinkAllowedLatenessallowedLateness是Flinkwindow中用来容忍一段时间迟到数据的,对allowedLatene...

flink中窗口的作用是什么

这篇文章主要讲解了“flink中窗口的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“flink中窗口的作用是什么”吧!窗口窗口计算是流式计算中常用的数据计算方式之一,通过按照固定时间或长度将数据流切分成不同的窗口,再对数据进行相应的聚合操作...

flink 1.11中的CDC是什么意思

本篇文章给大家分享的是有关flink1.11中的CDC是什么意思,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。CDC简介CDC,ChangeDataCapture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些...

flink中的聚合算子是什么

这篇文章主要讲解了“flink中的聚合算子是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“flink中的聚合算子是什么”吧!前言flink中的一个接口org.apache.flink.api.common.functions.AggregateF...

携程基于Flink的实时特征平台

作者:刘康 本文来自7月26日在上海举行的FlinkMeetup会议,分享来自于刘康,目前在大数据平台部从事模型生命周期相关平台开发,现在主要负责基于flink开发实时模型特征计算平台。熟悉分布式计算,在模型部署及运维方面有丰富实战经验和深入的理解,对模型的算法及训练有一定的了解。 本文主要内容如下...

如何用Flink Connectors读写txt文件

本篇内容主要讲解“如何用FlinkConnectors读写txt文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用FlinkConnectors读写txt文件”吧!通过使用FlinkDataSetConnectors数据流连接器打开txt文件,并提...

怎么搭建Flink开发IDEA环境

这篇文章主要介绍怎么搭建Flink开发IDEA环境,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一.IDEA开发环境1.pom文件设置<properties>     <maven.compiler.source&gt...

实时计算框架Flink集群搭建与运行机制

这篇文章主要介绍“实时计算框架Flink集群搭建与运行机制”,在日常操作中,相信很多人在实时计算框架Flink集群搭建与运行机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”实时计算框架Flink集群搭建与运行机制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、...