- 博客(138)
- 资源 (3)
- 收藏
- 关注
原创 Flink源码之State创建流程
Flink内置状态管理是相比其他分布式流式处理系统最大的优势之一,不用借助外部存储组件,就可实现高效可靠的分布式状态管理,极大降低了学习和使用成本。
2023-08-15 15:24:40
1219
原创 Flink源码之StreamTask启动流程
submitTask 方法核心就是构造org.apache.flink.runtime.taskmanager.Task实例,该实例继承自Runnable接口,有个Thread成员变量,构造完成后就启动线程执行Task逻辑。每个ExecutionVertex分配Slot后,JobMaster就会向Slot所在的TaskExecutor提交RPC请求执行Task,接口为TaskExecutorGateway::submitTask。
2023-08-14 14:25:39
765
原创 Flink源码之JobMaster启动流程
在整个提交过程中,首先获取JobMasterService的Leader权限,然后对一个JobGraph生成一个JobMaster,JobMaster先将JobGraph转换为ExecutionGraph,转换核心逻辑在DefaultExecutionGraph::attachJobGraph方法中,最后为每个Execution申请Slot资源,对每个Execution向TM提交TaskDeploymentDescriptor调度执行。
2023-08-11 16:36:30
1175
原创 Flink源码之TaskManager启动流程
从启动命令flink-daemon.sh可以看出TaskManger入口类为org.apache.flink.runtime.taskexecutor.TaskManagerRunner这些服务在构造TaskExecutor时作为构造函数参数传入构造TaskExecutor前会先构造TaskManagerServices辅助TaskExecutor实现其核心功能TaskManager中管理Slot的实现类TaskSlotTableImpl,该实例记录了Slot的分配信息。
2023-08-10 11:49:35
948
原创 Flink源码之JobManager启动流程
JobManager的启动过程就是创建三大组件RestServer/RM/Dispacher实例初始化的过程,RestSever通过Netty启动HTTP服务,RM/Dispacher被AkkaRpcService包装成AkkaActor提供本地或远程RPC服务,RestServer仅仅是接受请求解析消息后由具体Handler处理,JobGrap提交执行会转发给Dispatcher处理。
2023-08-09 17:35:48
992
原创 Flink源码之RPC
因此实现一个具体的Component只要同时继承RpcGateway和RpcEndPoint就能实现将RpcGateway的业务接口暴露出去提供远程服务,在JobManager/TaskManger启动过程中,都是先创建一个RpcService实例,然后new出各个业务组件实例,这样各个组件完成初始化后就能各司其职,协调配合完成具体业务功能。组件间通信基于Actor, 负责RPC通信功能则被抽象成一个RPCEndPoint。这些接口的具体实现就是组件提供的核心功能。
2023-08-08 16:00:28
756
原创 Roaring Bitmap原理
最近面试字节,被问roaring bitmap原理,虽然说之前看过,时间久了细节忘了,再次mark下,这边文章讲的很透彻。
2022-11-18 22:15:41
120
翻译 Java中5中发送HTTP请求的的方式
发送HTTP请求时现代编程中的核心功能,也是我们学习一种编程语言时最先想做的事。在Java中,有多种方式实现此功能,比如JDK或第三方库,这篇文章将会介绍我所知的Java中HTTP客户端,如果你使用过其他的,那很好,请告诉我。这篇文章将会涉及:JDK中:HttpURLConnectionHttpClient流行的第三方库:ApacheHttpClientOkHttpRetrofit我将会使用 NASA APIs 中每天一图Astronomy Picture of the Day做为示
2021-12-24 20:55:12
330
原创 ETL优化之道
天下武功,唯快不破。ETL Job优化的目标是执行快,耗费时间更短,总结起来有以下方式:增加硬件资源,比如增大内存、CPU等,但优化往往是在资源不足的情况下数据缓存,空间换时间服务常驻,减少初始化化时间减少输入数据量,常用以下技术数据压缩,缓存中能存放更多数据索引+BloomFilter,也是空间换时间,加快数据查找速度列裁剪,原理也是提高了缓存利用率谓词下推,减少扫描数据,一般要借助预分区或索引相关技术数据分区分桶避免重启读取相同数据,比如对同一张表多次查询UNIO
2021-12-18 16:43:39
619
原创 数据倾斜产生原因及应对之道
产生数据倾斜的根本原因是某个task处理数据过多,执行时间较长,导致整个Job执行时间长,因此解决数据倾斜的根本之道就是避免过多的数据进入同一个task,总结起来主要有以下方式:Group By产生数据倾斜直接增加task并行度,简单粗暴,但并不一定能正在解决问题。倾斜是由多个key组合输入一个task导致数据过多, 这种方式有效,但如果存在单个hot key数据量大则无效。预聚合,类似于Map Combine, 相当与把聚合运算提前分散到多个task, 减少最终聚合task的输入数据量hi
2021-12-17 16:09:30
1211
翻译 理解LSM树:频繁写的数据库基石
log-structured merge-tree(LSM tree)是可支持大量写的一种数据结构,写操作被优化成顺序写,LSM树是许多数据库背后的核心数据结构,包括BigTable, Cassandra, Scylla, 和 RocksDB.SSTablesLSM树在磁盘上以有序表(Sorted String Table)的形式存在。下图所示,SSTable存储了以key排序的key-value键值对,其中name为key。一个SSTable是由多个排序的文件组成,每个文件是一个Segment, 这些
2021-12-15 20:03:13
190
原创 动态规划之最大正方形
最大的以 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) {
2020-07-09 18:05:36
292
原创 动态规划之最低票价
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4
2020-07-09 17:59:54
305
原创 快排应用-第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) {
2020-06-18 17:32:34
221
原创 链表插入排序
时间复杂度O(n2)leetcode public ListNode insertionSortList(ListNode head) { ListNode res = null; while (head != null) { if (res == null) { res = head; head = head.next; res.next = n
2020-06-17 14:27:26
121
原创 二叉树遍历
深度优先前序遍历 Leetcode public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root != null) { res.add(root.val); res.addAll(preorderTraversal(root.left));
2020-06-17 14:20:05
117
原创 递归应用-链表快速排序
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。leetcode public ListNode quickSortList(ListNode head) { if (head == null) return null; ListNode pivot = head; ListNode left = null, right = null; ListNode cur = head.next; wh
2020-06-17 14:08:58
175
原创 递归应用-根据遍历顺序构造二叉树
已知前序遍历和中序遍历,可以构造唯一二叉树同样,已知后序和中序遍历,可以构造唯一二叉树但是已知前序和后序,并不能构造唯一二叉树,因为对于单个子节点无法确定到底是左子树还是右子树已知前序中序 Leetcode public TreeNode buildTree(int[] preorder, int[] inorder) { return buildTree(preorder, 0, preorder.length, inorder, 0, inorder.length);
2020-06-16 16:19:58
233
原创 动态规划-不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?leetcode public int uniquePaths(int m, int n) { int[][] a = new int[m][n]; for(int i=0; i<m; ++i) for(int j=0; j
2020-06-12 18:38:49
174
原创 递归&动态规划-解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。leetcode递归 public int numDecodings(String s) { int total = 0; if (s.isEmpty()) { return total; } String
2020-06-12 18:23:44
189
原创 递归应用-回溯复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。leetcode public List<String> restoreIpAddresses(String s) { return restoreIpAddresses(s, 4); } private List<String> restoreIpAddresses(Str
2020-06-12 18:17:36
251
原创 递归应用-n个数中选取k个数
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。leetcode public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if (n==k) { List<Integer>
2020-06-11 11:00:27
871
原创 递归应用-生成子集
给定一个数组,生成子集leetcode public List<List<Integer>> subsets(int[] nums) { return subsets(nums, nums.length); } private List<List<Integer>> subsets(int[] nums, int len) { List<List<Integer>> res = n
2020-06-10 18:45:09
216
原创 相对路径转换成绝对路径
根据Linux相对路径生成绝对路径leetcode public String simplifyPath(String path) { String[] a = path.split("/"); int[] flag = new int[a.length]; for(int i=0;i<a.length;i++) { String s = a[i]; if (s.isEmpty() || s.eq
2020-06-10 18:40:09
796
原创 递归应用-回溯生成括号对
递归可以理解为深度优先遍历穷举+回溯剪枝leetcodeclass Solution { public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>(); generateParenthesis(n, ""...
2020-01-08 14:48:04
159
原创 递归应用-组合总和
给定一个正数数组和target, 求所有组合为target的解。leetcode直观解决方案是蛮力搜索,保存搜索路径,对于无法确定搜索次数的,只能使用递归搜索,准确描述搜索停止条件即可。class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target)...
2020-01-07 17:38:55
158
原创 递归应用-全排列
leetcode题class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<>(); if (nums.length == 0) retu...
2020-01-06 17:43:29
178
原创 大数乘法
输入两个代表整数的字符串,不使用标准库,实现大数乘法LeetCode//手动乘法public String multiply(String num1, String num2) { if(num1.equals("0") || num2.equals("0")) return "0"; String result = ""; for(int i=num1.length...
2020-01-06 17:12:21
170
原创 三数之和为0的解题过程
leetcode上有个三数之和的题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ ...
2020-01-02 18:33:50
762
原创 Hive中找出分组第一的记录
使用group by进行分组查询只能获取分组列以及聚合函数列,如果想要获取表中非分组列则获取不到,此时可以使用row_number()对分组进行排序,同时也可以获取非分组列。表结构学生课程分数表,三列create table student_score( student_id int, --学生id subject string, -- 课程 score int -- 分数);...
2019-12-24 14:23:01
914
原创 面向对象的Flink SQL
任何程序都可以抽象成输入、处理、输出三部分,flink中将输入抽象成source,输出抽象成sink,中间处理则对应SQL/API,SQL对用户友好,抽象层次更高,同时也导致缺乏灵活性,表达力更弱。使用Flink中DataStream转换相关的Operater Function比如map,filter等函数编写流式应用,是一种过程式思维,大部分时候使用SQL申明式语言也能实现业务需求。下面的D...
2019-12-20 18:45:13
212
原创 基于Drools的人群推荐实现方案
业务上运营提前建好规则,根据广告主等级、业务类型等属性给广告主推荐不同的人群,通过规则引擎来实现,可避免代码中出现过多的if else判断加载规则1、从ClassPath下加载DRL文件头,比如引入的类型、定义的全局变量private void loadRuleTemplate() throws IOException { ClassPathResource template = n...
2019-08-07 17:10:43
630
原创 Git总结
commitHEAD: 当前commitHEAD~1: 简写HEAD~, HEAD的前一个版本HEAD~n: HEAD的前n个版本HEAD^1: 简写HEAD^, 只merge时主分支HEAD^2: 代指merge分支branchbranch_name: 本地某个分支origin/branch_name: 远程本地对应分支git branch: 创建分支git checkout...
2019-07-30 15:52:10
104
原创 如何发送带cookie HTTP请求
Postman App&Postman Interceptor安装Postman安装chrome extension Postman Interceptorchrome上点击Postman Interceptor同步cookie, Postman App上Enable InterceptorChrome Console有时chrome抽风,调试时只能打开无痕窗口,...
2019-07-02 14:06:29
4973
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人