Flink源码之StreamTask启动流程 submitTask 方法核心就是构造org.apache.flink.runtime.taskmanager.Task实例,该实例继承自Runnable接口,有个Thread成员变量,构造完成后就启动线程执行Task逻辑。每个ExecutionVertex分配Slot后,JobMaster就会向Slot所在的TaskExecutor提交RPC请求执行Task,接口为TaskExecutorGateway::submitTask。
Flink源码之JobMaster启动流程 在整个提交过程中,首先获取JobMasterService的Leader权限,然后对一个JobGraph生成一个JobMaster,JobMaster先将JobGraph转换为ExecutionGraph,转换核心逻辑在DefaultExecutionGraph::attachJobGraph方法中,最后为每个Execution申请Slot资源,对每个Execution向TM提交TaskDeploymentDescriptor调度执行。
Flink源码之TaskManager启动流程 从启动命令flink-daemon.sh可以看出TaskManger入口类为org.apache.flink.runtime.taskexecutor.TaskManagerRunner这些服务在构造TaskExecutor时作为构造函数参数传入构造TaskExecutor前会先构造TaskManagerServices辅助TaskExecutor实现其核心功能TaskManager中管理Slot的实现类TaskSlotTableImpl,该实例记录了Slot的分配信息。
Flink源码之JobManager启动流程 JobManager的启动过程就是创建三大组件RestServer/RM/Dispacher实例初始化的过程,RestSever通过Netty启动HTTP服务,RM/Dispacher被AkkaRpcService包装成AkkaActor提供本地或远程RPC服务,RestServer仅仅是接受请求解析消息后由具体Handler处理,JobGrap提交执行会转发给Dispatcher处理。
Flink源码之RPC 因此实现一个具体的Component只要同时继承RpcGateway和RpcEndPoint就能实现将RpcGateway的业务接口暴露出去提供远程服务,在JobManager/TaskManger启动过程中,都是先创建一个RpcService实例,然后new出各个业务组件实例,这样各个组件完成初始化后就能各司其职,协调配合完成具体业务功能。组件间通信基于Actor, 负责RPC通信功能则被抽象成一个RPCEndPoint。这些接口的具体实现就是组件提供的核心功能。
Java中5中发送HTTP请求的的方式 发送HTTP请求时现代编程中的核心功能,也是我们学习一种编程语言时最先想做的事。在Java中,有多种方式实现此功能,比如JDK或第三方库,这篇文章将会介绍我所知的Java中HTTP客户端,如果你使用过其他的,那很好,请告诉我。这篇文章将会涉及:JDK中:HttpURLConnectionHttpClient流行的第三方库:ApacheHttpClientOkHttpRetrofit我将会使用 NASA APIs 中每天一图Astronomy Picture of the Day做为示
ETL优化之道 天下武功,唯快不破。ETL Job优化的目标是执行快,耗费时间更短,总结起来有以下方式:增加硬件资源,比如增大内存、CPU等,但优化往往是在资源不足的情况下数据缓存,空间换时间服务常驻,减少初始化化时间减少输入数据量,常用以下技术数据压缩,缓存中能存放更多数据索引+BloomFilter,也是空间换时间,加快数据查找速度列裁剪,原理也是提高了缓存利用率谓词下推,减少扫描数据,一般要借助预分区或索引相关技术数据分区分桶避免重启读取相同数据,比如对同一张表多次查询UNIO
数据倾斜产生原因及应对之道 产生数据倾斜的根本原因是某个task处理数据过多,执行时间较长,导致整个Job执行时间长,因此解决数据倾斜的根本之道就是避免过多的数据进入同一个task,总结起来主要有以下方式:Group By产生数据倾斜直接增加task并行度,简单粗暴,但并不一定能正在解决问题。倾斜是由多个key组合输入一个task导致数据过多, 这种方式有效,但如果存在单个hot key数据量大则无效。预聚合,类似于Map Combine, 相当与把聚合运算提前分散到多个task, 减少最终聚合task的输入数据量hi
理解LSM树:频繁写的数据库基石 log-structured merge-tree(LSM tree)是可支持大量写的一种数据结构,写操作被优化成顺序写,LSM树是许多数据库背后的核心数据结构,包括BigTable, Cassandra, Scylla, 和 RocksDB.SSTablesLSM树在磁盘上以有序表(Sorted String Table)的形式存在。下图所示,SSTable存储了以key排序的key-value键值对,其中name为key。一个SSTable是由多个排序的文件组成,每个文件是一个Segment, 这些
动态规划之最大正方形 最大的以 1 为边界的正方形给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。[leetcode] public int largest1BorderedSquare(int[][] grid) { int n = grid.length; int[] dp = new int[n]; for(int i=0;i<n;++i) {
动态规划之最低票价 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4
快排应用-第k大元素 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。leetcode public int findKthLargest(int[] nums, int k) { return findKthLargest(nums, 0, nums.length,k); } private int findKthLargest(int[] nums, int start, int end, int k) {