Flink - InstanceManager
InstanceManager用于管理JobManager申请到的taskManager和slots资源
/**
* Simple manager that keeps track of which TaskManager are available and alive.
*/
public class InstanceManager { // ------------------------------------------------------------------------
// Fields
// ------------------------------------------------------------------------ //分别以InstanceId和ResourceId来索引Instance
/** Set of hosts known to run a task manager that are thus able to execute tasks (by ID). */
private final Map<InstanceID, Instance> registeredHostsById;
/** Set of hosts known to run a task manager that are thus able to execute tasks (by ResourceID). */
private final Map<ResourceID, Instance> registeredHostsByResource; /** Set of hosts that were present once and have died */
private final Set<ResourceID> deadHosts; /** Listeners that want to be notified about availability and disappearance of instances */
private final List<InstanceListener> instanceListeners = new ArrayList<>(); //Instance资源发生变化时,需要通知谁,如Scheduler /** The total number of task slots that the system has */
private int totalNumberOfAliveTaskSlots;
关键的操作,
registerTaskManager
/**
* Registers a task manager. Registration of a task manager makes it available to be used
* for the job execution.
*
* @param taskManagerGateway gateway to the task manager
* @param taskManagerLocation Location info of the TaskManager
* @param resources Hardware description of the TaskManager
* @param numberOfSlots Number of available slots on the TaskManager
* @return The assigned InstanceID of the registered task manager
*/
public InstanceID registerTaskManager(
TaskManagerGateway taskManagerGateway,
TaskManagerLocation taskManagerLocation,
HardwareDescription resources,
int numberOfSlots) { synchronized (this.lock) {
InstanceID instanceID = new InstanceID(); Instance host = new Instance( //创建新的instance
taskManagerGateway,
taskManagerLocation,
instanceID,
resources,
numberOfSlots); registeredHostsById.put(instanceID, host); //register
registeredHostsByResource.put(taskManagerLocation.getResourceID(), host); totalNumberOfAliveTaskSlots += numberOfSlots; host.reportHeartBeat(); // notify all listeners (for example the scheduler)
notifyNewInstance(host); return instanceID;
}
}
其中,notifyNewInstance
private void notifyNewInstance(Instance instance) {
synchronized (this.instanceListeners) {
for (InstanceListener listener : this.instanceListeners) {
try {
listener.newInstanceAvailable(instance); //调用listener的newInstanceAvailable
}
catch (Throwable t) {
LOG.error("Notification of new instance availability failed.", t);
}
}
}
}
Instance
看注释,instance就是一种抽象
用于描述注册到JobManager,并准备接受work的TaskManager
/**
* An instance represents a {@link org.apache.flink.runtime.taskmanager.TaskManager}
* registered at a JobManager and ready to receive work.
*/
public class Instance implements SlotOwner { /** The instance gateway to communicate with the instance */
private final TaskManagerGateway taskManagerGateway; /** The instance connection information for the data transfer. */
private final TaskManagerLocation location; /** A description of the resources of the task manager */
private final HardwareDescription resources; /** The ID identifying the taskManager. */
private final InstanceID instanceId; /** The number of task slots available on the node */
private final int numberOfSlots; /** A list of available slot positions */
private final Queue<Integer> availableSlots; //注意这里记录的不是slot,而是position,因为slot是在用的时候创建的 /** Allocated slots on this taskManager */
private final Set<Slot> allocatedSlots = new HashSet<Slot>(); /** A listener to be notified upon new slot availability */
private SlotAvailabilityListener slotAvailabilityListener; //listener用于通知当slot状态发生变化 /** Time when last heat beat has been received from the task manager running on this taskManager. */
private volatile long lastReceivedHeartBeat = System.currentTimeMillis();
核心的操作,
申请slot
/**
* Allocates a simple slot on this TaskManager instance. This method returns {@code null}, if no slot
* is available at the moment.
*
* @param jobID The ID of the job that the slot is allocated for.
*
* @return A simple slot that represents a task slot on this TaskManager instance, or null, if the
* TaskManager instance has no more slots available.
*
* @throws InstanceDiedException Thrown if the instance is no longer alive by the time the
* slot is allocated.
*/
public SimpleSlot allocateSimpleSlot(JobID jobID) throws InstanceDiedException { synchronized (instanceLock) {
Integer nextSlot = availableSlots.poll(); //看看有没有available的slot position
if (nextSlot == null) {
return null;
}
else {
SimpleSlot slot = new SimpleSlot(jobID, this, location, nextSlot, taskManagerGateway);
allocatedSlots.add(slot);
return slot;
}
}
}
归还slot
/**
* Returns a slot that has been allocated from this instance. The slot needs have been canceled
* prior to calling this method.
*
* <p>The method will transition the slot to the "released" state. If the slot is already in state
* "released", this method will do nothing.</p>
*
* @param slot The slot to return.
* @return True, if the slot was returned, false if not.
*/
@Override
public boolean returnAllocatedSlot(Slot slot) { if (slot.markReleased()) {
LOG.debug("Return allocated slot {}.", slot);
synchronized (instanceLock) { if (this.allocatedSlots.remove(slot)) {
this.availableSlots.add(slot.getSlotNumber()); if (this.slotAvailabilityListener != null) {
this.slotAvailabilityListener.newSlotAvailable(this); //通知有个slot可以用
} return true;
}
}
}
}
Flink - InstanceManager的更多相关文章
- Flink 1.1 – ResourceManager
Flink resource manager的作用如图, FlinkResourceManager /** * * <h1>Worker allocation steps</h1 ...
- Flink - FLIP
https://cwiki.apache.org/confluence/display/FLINK/Flink+Improvement+Proposals FLIP-1 : Fine Grained ...
- 追源索骥:透过源码看懂Flink核心框架的执行流程
li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...
- Flink - Scheduler
Job资源分配的过程, 在submitJob中,会生成ExecutionGraph 最终调用到, executionGraph.scheduleForExecution(scheduler) 接着,E ...
- Flink BLOB架构
Flink中支持的BLOB文件类型 jar包 被user classloader使用的jar包 高负荷RPC消息 1. RPC消息长度超出了akka.framesize的大小 2. 在HA摸式中,利用 ...
- Flink源码阅读(1.7.2)
目录 Client提交任务 flink的图结构 StreamGraph OptimizedPlan JobGraph ExecutionGraph flink部署与执行模型 Single Job Jo ...
- 透过源码看懂Flink核心框架的执行流程
前言 Flink是大数据处理领域最近很火的一个开源的分布式.高性能的流式处理框架,其对数据的处理可以达到毫秒级别.本文以一个来自官网的WordCount例子为引,全面阐述flink的核心架构及执行流程 ...
- apache flink 入门
配置环境 包括 JAVA_HOME jobmanager.rpc.address jobmanager.heap.mb 和 taskmanager.heap.mb taskmanager.number ...
- Apache Flink初接触
Apache Flink闻名已久,一直没有亲自尝试一把,这两天看了文档,发现在real-time streaming方面,Flink提供了更多高阶的实用函数. 用Apache Flink实现WordC ...
随机推荐
- phpcms
phpcms 织梦 帝国cms
- 【Network】golang 容器项目 flannel/UDP相关资料
参考资料: flannel_百度搜索 Flannel首页.文档和下载 - 容器集群子网 - 开源中国社区 docker下基于flannel的overlay网络分析 - OPEN 开发经验库 flann ...
- 没听说过这些,就不要说你懂并发了,three。
引言 很久没有跟大家再聊聊并发了,今天LZ闲来无事,跟大家再聊聊并发.由于时间过去的有点久,因此LZ就不按照常理出牌了,只是把自己的理解记录在此,如果各位猿友觉得有所收获,就点个推荐或者留言激励下LZ ...
- Spring Security控制权限
Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. < ...
- 使用poi读取xlsx中的数据
excel中的内容见下图: 详细代码: package dataprovider; import java.io.FileInputStream; import java.io.InputStream ...
- win7安装Linux
1. 新建分区必须为FAT32 (不是绿色的可用分区,只要linux安装时可以识别) 大小大于8G 2.打开ISO, 把casper文件夹下的initrd.lz vmlinuz 两个文件提取到C盘下 ...
- vs2008所有DTE.ExecuteCommand命令
下面列表中为我当前机器上visual studio 2008所有DTE.ExecuteCommand命令的内容: 其中:Build.开头对应“编译”菜单下命令(如:Build.RebuildSolut ...
- Jetty官方文档翻译
最近在学习Jetty,没有找到合适的资料,所有只能看官方文档了,但是只有英文的,想着自己翻译着学也是学还不如把学习的过程放到网上,也可以给需要的人看,英文水平毕竟有限,也是用有道翻译着来的,不过也加了 ...
- 安卓更新sdk的代理
mirrors.neusoft.edu.cn80
- 转换一个矩阵(2维数组)为HTML Table
matrix[row][col],比如[ [ "Name", "Age" ], [ "Sam", 12 ] ] function (m) { ...