最新Flink 调度源码分析1:拓扑图创建与提交过程(1),2024年最新作为大数据开发程序员应该怎样去规划自己的学习路线

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • Transformation:可查看 flink-streaming-java 模块中 org.apache.flink.streaming.api.transformations 下的类,有各种类型的 Transformation。
  • 算子将用户逻辑封装,并构造出 Transformation,然后将 Transformation 存储到 StreamExecutionEnvironment:
// 将 Transformation 存储到执行环境中
getExecutionEnvironment().addOperator(resultTransform);

  • 当调用 env.execute() 时,遍历执行环境中的 Transformation 集合,然后使用 StreamGraphGenerator.generate() 创建 StreamGraph。
StreamGraph streamGraph = getStreamGraph();
-> final StreamGraph streamGraph = getStreamGraph(transformations);
	-> getStreamGraphGenerator(transformations).generate();
		->
		for (Transformation<?> transformation : transformations) {  
			transform(transformation);  
		}
		// 记录slot共享组及其相应的细粒度资源档案
		streamGraph.setSlotSharingGroupResource(slotSharingGroupResources);
		for (StreamNode node : streamGraph.getStreamNodes()) {  
			if (node.getInEdges().stream().anyMatch(this::shouldDisableUnalignedCheckpointing)) {  
				for (StreamEdge edge : node.getInEdges()) {  
					edge.setSupportsUnalignedCheckpoints(false);  
				}  
			}  
		}

注:并不是每一个 StreamTransformation 都会转换成 runtime 层中物理操作。有一些只是逻辑概念,比如 union、split/select、partition等。

2. 生成 JobGraph

JobGraph 是在 Client 端生成的。
该部分代码主要在 flink-runtime 模块中的,该过程主要在 org.apache.flink.runtime.jobgraph包中。StreamingJobGraphGenerator.createJobGraph() 中实现。

  • StreamNode 转成 JobVertex,将 one-to-one 且并行的相同的节点合并为一个节点。StreamEdge 转成 JobEdge。会为所有节点生成一个唯一的 hash id,如果节点在多次提交中没有改变(包括并发度、上下游等),那么这个 id 就不会改变,这主要用于故障恢复。

3. 集群接收并处理 JobGraph

这部分实现在 flink-runtime 模块中的 org.apache.flink.runtime.rest.handler.job.JobSubmitHandler.handleRequest() 方法中。在该方法中,会获取 restClient 的文件,获取 JobGraph 和对应的依赖、jar包,然后通过 dispatchergateway 提交 JobGraph。
下面代码负责继续处理 JobGraph。

CompletableFuture<Acknowledge> jobSubmissionFuture =  
        finalizedJobGraphFuture.thenCompose(  
                jobGraph -> gateway.submitJob(jobGraph, timeout));

可进而查看其调用的方法,如下所示。

gateway.submitJob(jobGraph, timeout)
-> internalSubmitJob(jobGraph)
	-> this::persistAndRunJob
		-> runJob(createJobMasterRunner(jobGraph), ExecutionType.SUBMISSION)

在 runJob() 中会创建 JobMaster,然后 JobGraph 在 JobMaster 中会被转化成 ExecutionGraph。

4. 生成 ExecutionGraph

Client 会将 JobGraph 进行提交,然后服务端会接收 JobGraph,创建 JobMaster,并将 JobGraph 转换为 ExecutionGraph。

  • 集群会在创建调度器时,创建 ExecutionGraph。调度器会继承 SchedulerBase 类,在该类的构造函数中通过下面的代码创建 ExecutionGraph。
this.executionGraph =  
        createAndRestoreExecutionGraph(  
                completedCheckpointStore,  
                checkpointsCleaner,  
                checkpointIdCounter,  
                initializationTimestamp,  
                mainThreadExecutor,  
                jobStatusListener,  
                vertexParallelismStore);

查看其调用过程如下。

createAndRestoreExecutionGraph(...)
-> final ExecutionGraph newExecutionGraph =  
    executionGraphFactory.createAndRestoreExecutionGraph(...)
    -> final ExecutionGraph newExecutionGraph =  
    DefaultExecutionGraphBuilder.buildGraph(...)



![img](https://img-blog.csdnimg.cn/img_convert/d7f34a071b05d5f0c3e4e82cde8ff5a1.png)
![img](https://img-blog.csdnimg.cn/img_convert/ca82dab150f81abeefb6eb23b55af9eb.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一个大数据开发工程师,面试中可能会涉及到Flink的相关知识。下面是一些常见的问题和建议的答案,供你参考: 1. 请介绍一下Flink的基本概念和特点。 Flink是一个开源的流处理和批处理框架,具有低延迟、高吞吐量、Exactly-Once语义等特点。它支持事件时间和处理时间,并且可以在内存中保存状态。 2. Flink的数据流转换操作有哪些? Flink提供了一系列的数据流转换操作,如map、filter、reduce、keyBy、window等。这些操作可以用来对数据流进行转换、聚合和处理。 3. Flink的窗口是什么?它有哪些类型? 窗口是按照一定的条件对数据流进行切分和分组的机制。Flink支持基于时间或者基于数量的窗口。常见的窗口类型有滚动窗口、滑动窗口和会话窗口。 4. Flink的状态管理方式有哪些? Flink支持两种类型的状态管理方式:键控状态和操作符状态。键控状态是根据输入数据流中的键值对来维护状态,而操作符状态是全局共享的状态。 5. Flink如何实现容错性? Flink采用了事件时间和WAL(Write-Ahead-Log)机制来实现容错性。它会将数据流的元数据和状态信息持久化到可靠的存储系统中,以便在故障发生时进行恢复。 6. Flink的常见部署方式是什么? Flink可以以独立集群模式或者与Hadoop、Kubernetes等集成部署。它可以在YARN、Mesos、Kubernetes等资源管理器上运行。 7. Flink的水位线(Watermark)是什么作用? 水位线是用来处理事件时间乱序的机制。它可以告知Flink事件的最大延迟时间,以便在窗口计算中进行处理。 这些问题只是一些基本的问题,你还可以根据你自己的经验和实际情况进行深入的准备。祝你面试顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值