自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 数仓基础理论(一)

模范定义指以维度建模作为理论基础,构建总线矩阵,划分和定义数据域、业务过程、维度、度量 / 原子指标、修饰类型、修饰词、时间周期、派生指标。名词术语解释数据域指面向业务分析将业务过程或者维度进行抽象的集合。其中,业务过程可以概括为一个个不可拆分的行为事件,在业务过程之下,可以定义指标;维度是指度量的环境,如买家下单事件,买家是维度。为保障整个体系的生命力,数据域是需要抽象提炼,并且长期维护和更新的,但不轻易变动。

2024-03-13 11:30:46 563

原创 Flink面试题与详解

官网图:由两个部分组成,JM,TM。JM中包含三个组件,。dispatch主要是负责提供了rest接口,接受客户端提供的jar包dataflow等信息,并且运行Flink UI也是该组件运行。jobmaster主要是负责将dataflow等数据流图转换成真正的物理执行图,如果资源足够启动任务,那么就会将图分发给对应的TM,并且负责任务启动后的协调运行管理,比如checkpoint的协调。resource manager主要负责资源的申请、释放、分配。管理着Flink的slot。

2023-12-23 21:20:37 1279

原创 Flink优化——数据倾斜(二)

的思想:在 keyBy 上游算子数据发送之前,首先在上游算子的本地对数据进行聚合后再发送到下游,使下游接收到的数据量大大减少,从而使得 keyBy 之后的聚合操作不再是任务的瓶颈。如果 keyBy 之前就存在数据倾斜,上游算子的某些实例可能处理的数据较多,某些实例可能处理的数据较小,产生该情况可能是因为数据源的数据本身就不均匀。注意: Flink 是实时流处理,如果 keyby 之后的聚合操作存在数据倾斜,且没有开窗口的情况下,简单的任务使用两阶段聚合,是不能解决问题的。通常,数据倾斜也会引起反压。

2023-12-06 18:35:02 1431

原创 Flink优化——资源优化(一)

另外 Sink 端要与下游的服务进行交互,并行度还得根据下游的服务抗压能力来设置,如果在 Flink Sink 这端的数据量过大的话,且 Sink 处并行度也设置的很大, 但下游的服务完全撑不住这么大的并发写入, 可能会造成下游服务直接被写挂,所以最终还是要在 Sink 处的并行度做一定的权衡。上,让多块磁盘来分担压力。Flink 性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的心更难调优策略。

2023-12-04 15:17:41 1121

原创 leetcode周赛 第 370 场周赛

你的得分之和为 values[1] + values[2] + values[3] + values[4] + values[5] = 11。第二种情况:values[x] 加入答案,问题变成「以 y 为根的子树是健康时,失去的最小分数」,这里 y 是 x 的儿子。那么答案就是 values 的元素和,减去「以 0 为根的子树是健康时,失去的最小分数」。第一种情况:失去 values[x],也就是不加入答案,那么 x 的所有子孙节点都可以加入答案,失去的最小分数就是 values[x]。

2023-11-06 15:58:18 143

原创 leetcode第369周赛

右移:答案为 coins[i]>>(j+1)\textit{coins}[i]>>(j+1)coins[i]>>(j+1) 加上每个子树 ch\textit{ch}ch 的 dfs(ch,j+1)\textit{dfs}(ch,j+1)dfs(ch,j+1)。因为 k == 1 ,数组的 1-or 等于其中所有元素按位或运算的结果。长度大于或等于 3 的子数组为 [2,4,0], [4,0,0], [0,0,4], [2,4,0,0], [4,0,0,4], [2,4,0,0,4]。

2023-10-30 14:23:54 304

原创 每日一题:leetcode1155 掷骰子等于目标和的方法数

dp[i][j] = dp[i][j] + dp[i-1][j-x],其中x的范围是[1-k],i表示几个骰子,j表示这i个骰子能加到的范围,dp[i][j]则表述i个骰子达到j值的方法数。首先看到这个是求方法数,就让我想起了超级楼梯这个递推的动态规划题目,再看看这个数据的规模才1000,直接就是有着异曲同工的思路。当然需要进行一些分支截取,骰子的范围,最小值就是1,最大是k,那么数据的范围就是[n,n*k]。得到 7 的和有 6 种方法:1+6 2+5 3+4 4+3 5+2 6+1。

2023-10-24 14:43:39 173

原创 每日一题: leetcode1726 同积元组

1、若 a = c,则 b = d,可以通过反证法推断,如果a = c,但是 b 不等于 d,则式子可以写成 a * b = a * d ==> b = d,所以若 a = c,则 b = d。说白了,其实就是根据给定的nums数组,每个元素两两相乘,遍历一次,记录乘积的个数,然后个数大于2的,根据排列组合公式,从可选组合中选取2个。首先,我们可以从答案上推断出,只要有一组符合的答案,比如 2*3 = 4*6,根据换不同的位置,可以知道,最终的答案就是4元组的个数 * 8。

2023-10-19 11:50:21 176

原创 Flink1.14 SourceReader概念入门讲解与源码解析 (三)

SourceReader是一个运行在Task Manager上的组件,主要是负责读取 SplitEnumerator 分配的source split。SourceReader 提供了一个拉动式(pull-based)处理接口。Flink任务会在循环中不断调用 pollNext(ReaderOutput) 轮询来自 SourceReader 的记录。pollNext(ReaderOutput) 方法的返回值指示 SourceReader 的状态。

2023-10-17 15:43:38 740 1

原创 Flink1.14 SplitEnumerator概念入门讲解与源码解析 (二)

SplitEnumerator被认为是整个Source的“大脑”。SplitEnumerator的功能实现SplitEnumerator 可以在的帮助下完成所有上述工作,其会在 SplitEnumerator 的创建或者恢复的时候提供给 Source。SplitEnumeratorContext 允许SplitEnumerator 检索到 reader 的必要信息并执行协调操作。而在 Source 的实现中会将 SplitEnumeratorContext 传递给 SplitEnumerator 实例。

2023-10-08 16:53:14 359

原创 Flink1.14 Source概念入门讲解与源码解析(一)

目前可以看出,Souce接口的更新,其实是因为Flink在1.12之前将批处理任务与流处理任务分为两种实现模式。在底层实现中描述输入的数据如何被划分为不同的InputSplit,继承于 INputSplitSource描述如何从单个InputSplit读取记录,具体包括如何打开一个分配到的InputSplit,如何从这个INputSplit读取一条记录,如何得知记录已经读完和如何关闭这个Inputsplit描述如何获取输入数据的统计信息(比如文件的大小、记录的数目)

2023-09-22 15:50:22 765

原创 每日一题:leetcode 2594 修车的最少时间

这样就明确了,我只需要在一个范围里面进行判断最小的time是什么就行了,这个范围就是[1 - x * n * n],其中x是随便某个人的rank,n是全部汽车数,即就是随便一个人修完全部车的时间。最终,这个算法其实就是二分答案,初听这个名字有点炫酷,但是其实就是二分查找,在答案范围内进行查询,找到满足条件的最值即可。- 第一位机械工修 2 辆车,需要 4 * 2 * 2 = 16 分钟。- 第二位机械工修 2 辆车,需要 2 * 2 * 2 = 8 分钟。,表示总共需要修理的汽车数目。

2023-09-07 10:58:28 247

原创 每日一题:leetcode 57 插入区间

跟之前的同向指针一样,只要互不重叠的情况下,就要看需要插入的区间是否在已有的区间内,判断的标准则是看插入的区间左边界是否有小于某个区间的右边界,如果有则合并。并且记录更大的右边界。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。按照区间起始端点排序的区间列表。

2023-08-28 16:03:37 357

原创 每日一题:leetcode 56 合并区间

区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2023-08-27 16:42:22 272

原创 每日一题:leetcode 1448 统计二叉树中好节点的数目

往下递归的同时需要维护一个当前路径上的最大值,而ans的话,看个人喜好,我是将ans同步传递下去进行更新。「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。节点 2 -> (3, 3, 2) 不是好节点,因为 "3" 比它大。节点 5 -> (3,4,5) 是路径中的最大值。节点 3 -> (3,1,3) 是路径中的最大值。节点 4 -> (3,4) 是路径中的最大值。的二叉树,请你返回二叉树中好节点的数目。根节点 (3) 永远是个好节点。图中蓝色节点为好节点。

2023-08-25 14:47:16 291

原创 每日一题:leetcode 1109 航班预订统计

航班编号 1 2 3 4 5。预订记录 3 : 25 25 25 25。总座位数: 10 55 45 25 25。因此,answer = [10,55,45,25,25]预订记录 2 : 20 20。,里面的元素是每个航班预定的座位总数。因此,answer = [10,25]预订记录 1 : 10 10。预订记录 1 : 10 10。预订记录 2 : 15。总座位数: 10 25。

2023-08-24 20:02:58 255

原创 每日一题:leetcode 1267 统计参与通信的服务器

还有更优的,比如可以通过hashmap去记录行列是否出现,或者是通过一维数组+一个变量去记录,放一个更优的解法。第一行的两台服务器互相通信,第三列的两台服务器互相通信,但右下角的服务器无法与其他服务器通信。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。先按行遍历,如果出现第一个,先记录位置,然后看看有没有第二个的出现。请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。中,1 表示单元格上有服务器,0 表示没有。(我这种肯定不是最优的)没有一台服务器能与其他服务器进行通信。

2023-08-24 16:39:18 506

原创 每日一题:leetcode 849 到最近的人的最大距离

记录上一个乘客的位置极为last,然后当前的乘客的位置为cur,最大的位置就是(cur-last)/ 2。当然需要判断特殊情况,比如前面都是空位置,然后坐第一个位置上,最大距离就是第一个位置到第一个乘客的位置。同理,最后都是空位置,坐在最后一个位置上,最大距离就是上一个乘客到最后一个空位置的大小。亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1。如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。

2023-08-22 15:05:45 60

原创 每日一题:2337 移动片段得到字符串

也就是说,start = L 的下标需要大于target的下标, start = R的下标需要小于target的下标。1、暴力模拟,考虑start和target不同的时候的每种情况,针对不同的情况进行判断。2、双指针,我们可以想到,LR是可以进行移动的,那么其实‘_’就没有什么含义,因为LR的相对位置不会改变。但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target。字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target。

2023-08-21 18:42:27 97

原创 leetcode第359场周赛

1、同向双指针需要将每个元素的下标进行标记,对于每种相同的元素进行遍历,需要判断right - left 的下标是不是超过了k,如果超过了k表示right和left区间内,这种元素需要删除的数太多了。那么就可以理解为,不存在a+b=k的情况,并且需要返回长度等于n的最小总和,肯定就是从1开始往上递增的来取,换句话说, 不就是取a+b=k,加数最小的那个不就好了。2、滑动窗口的想法其实类似,只不过是需要维护一个hash map,map中存放的是窗口内元素的数量,key是元素值,value是对应元素的个数。

2023-08-20 18:06:04 342

原创 每日一题:leetcode1338 3n块披萨

但以[8,9,8,1,2,3]为例,如果我们第一步选取了9,剩下的元素就变成了[1,2,3],我们最大只能选择3,这样的总和就只有12,而显然选取两个8可以得到16的总和,是更优的。首先,每一次选择都是可以自由选择披萨,但是选择完成之后,左右两边披萨则是不能选择,所以可以简化题目,看成在循环列表中,选取n/3个不连续的元素的最大值。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。重复这样的操作,直到选取了n/3个元素为止,我们就得到了需要的最优解。

2023-08-18 14:44:20 282

原创 LeetCode每日一题——2682. 找出转圈游戏输家

然后记录遍历过的玩家数量cnt,用于后面答案数组的初始化长度 n - cnt,vis标记为是否遍历过的玩家。2)第 3 个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 2 个朋友。3)第 2 个朋友将球传给距离他顺时针方向 6 步的玩家 —— 第 3 个朋友。个朋友将球传给距离他顺时针方向 2 步的玩家 —— 第 3 个朋友。个朋友将球传给距离他顺时针方向 4 步的玩家 —— 第 1 个朋友。4)第 3 个朋友接到两次球,游戏结束。2)第 1 个朋友接到两次球,游戏结束。给你参与游戏的朋友数量。

2023-08-16 16:23:51 533

原创 Java基础系列(八)——线程池详解

处理高并发场景或者是经常连接数据库的小伙伴应该经常听到或者用过“池”,那么什么是线程池呢?为什么要用线程池呢?举个简单的例子:从前,有个店铺,每天的客户都很少,所以,不需要一个常驻的收银员,都是来一个客户找个临时工充当收银员,结束后临时工就被辞退,每次都是招聘与解雇循环往复。当客户量比较少的时候还可以处理的过来(单线程模式),过几年之后,店铺越做越大,客户越来越多,这种模式就已经处理不过来增长的用户量了(高并发场景)。此时,常驻收银员就出现了,而且可能一个常驻还不够,需要好几个。

2022-11-10 19:43:31 528 1

原创 Java基础系列(七)——多线程Volatile与Synchronized详解

java多线程

2022-11-08 16:49:22 444

原创 Java基础系列(六)——代理机制详解

java代理机制

2022-11-02 16:24:42 309

原创 SQL调优小记

目录SQL优化SQL语句优化负向查询不能使用索引前导模糊查询不能使用索引数据区分不明显时,不应该建立索引字段的默认值不要为null在字段上进行计算不能命中索引最左前缀问题明确返回条数不要让数据库自动强制类型转换join时两表字段类型要相同小结SQL性能优化使用Explain进行SQL分析优化数据访问量重构查询方法当存在慢SQL时,我们首先需要检测一下SQL语句是否可以进行优化(写SQL的时候就需要思考能否优化),然后,再考虑性能优化。当我们使用not in的时候,哪怕中了索引, 也是相当于失效的。前导

2022-06-06 11:45:02 241

原创 Java基础系列(五)——Collection集合Map源码详解

目录HashMapHashMap与HashTable的区别HashMap源码分析类属性源码Node节点源码TreeNode节点源码构造方法put方法源码get方法源码resize方法源码HashMap常用方法HashMap经典问题HashMap的长度为什么是2的幂次方HashMap多线程下死循环的原因HashMap在jdk1.8的优化ConcurrentHashMap存储结构初始化InitTable方法源码put方法get方

2022-05-30 20:28:35 224

原创 Java基础系列(四)——Collection集合List详解

Collection集合概述List,Set,Map,Queue的区别List(对付顺序的好帮手): 存储的元素是有序的、可重复的。 Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。 Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。按照先进先出的顺序。 Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key...

2022-05-27 17:16:30 703

转载 Java基础系列(三)——反射机制详解

目录反射基础Class类类加载反射的使用Class类对象的获取Constructor类及其用法Field类及其用法Method类及其用法反射机制执行的流程反射获取类实例反射获取方法调用 method.invoke() 方法反射调用流程小结转载反射基础RTIT(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要

2022-05-25 16:39:18 537

转载 Java基础系列(三)——异常机制详解

异常机制详解异常的层次结构异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。Java异常类层次结构图:ThrowableThrowable 是 Java 语言中所有错误与异常的超类。Throwable 包含..

2022-05-24 10:43:30 341

转载 Java基础系列(二)——泛型机制详解

Java 基础 - 泛型机制详解Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。为什么会引入泛型泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用...

2022-05-22 11:53:35 736

原创 Java基础系列

面向对象三大特性封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。优点:减少耦合:可以独立地开发、测试、优化、使用、理解和修改。 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块。 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能。 提高软件...

2022-05-15 21:11:10 508

原创 Flink源码解读(三):ExecutionGraph源码解读

ExectionGraph执行图在Flink中ExecutionGraph执行图是协调数据流的分布式执行的中心数据结构,它保留了每个并行任务、每个中间流以及它们之间的的通信表示。StreamGraph和JobGraph的转化生成都是在Flink客户端,而最终Flink作业运行时调度层的核心执行图ExecutionGraph是在服务器的JobManager中生成的。ExecutionGraph在实际处理转换上只是改动了GobGraph的每个节点,并没有对整个拓扑结构进行改变。主要发生以下转...

2022-05-07 22:27:51 664

原创 Flink 解析(七):时间窗口

时间概念由于Flink框架中实时流处理事件中,时间在计算中起到很大的作用。例如进行时间序列分析、基于特定时间段(窗口)进行聚合或者是重要情况下的事件处理。Flink的DataStream支持三种time:EventTime、IngestTime和ProcessingTime,并且有大量的基于time的operator。这三种时间进行比较:EventTime 事件生成的时间,在进入Flink之间就已经存在,可以从event的字段中抽取 必须指定watermarks的生成方式 优势..

2022-01-17 20:02:13 2559

原创 Flink 解析(六):Savepoints

目录Savepoints分配算子IDsavepoint操作配置savepoint触发savepoint恢复savepoint删除savepointF.A.Q我应该为我作业中的所有算子分配 ID 吗?如果我在作业中添加一个需要状态的新算子,会发生什么?如果从作业中删除有状态的算子会发生什么?如果我在作业中重新排序有状态算子,会发生什么?如果我添加、删除或重新排序作业中没有状态的算子,会发生什么?当我在恢复时改变程序的并行度时会发生什么?我可以将 sa

2021-12-31 12:09:06 1008

原创 Flink 解析(五):State与State Backend

State对于Flink而言,状态是一个必不可少的需要了解的重要知识点。Flink具有三种状态Keyed State Operator State Broadcast State(1.5版本之后,特殊的Operator State)Operator State每一个operator中都并行的维护一个状态,与key无关的。这里放一段官网上面对于Operator State的解释。Operator State(ornon-keyed state) is state that is...

2021-12-23 20:31:19 2030

原创 Flink 解析(四):恢复机制

目录Flink恢复机制Checkpoint是什么Savepoint保存点检查点协调器CheckpointCheckpoint保存什么信息Checkpoint如何保存信息Barrier 对齐精准一次性(exactly once)端到端精准一次Job失败后,从检查点恢复应用自动恢复机制手动作业恢复机制Job失败后,从保存点恢复机制参考Flink恢复机制任何一个框架都存在出错的可能,所以都会有自己的一套恢复机制,例如Spark是采用血缘关系从头开

2021-12-14 18:40:42 4727

原创 Flink 解析(三):内存管理

目录内存管理积极的内存管理MemorySegment堆内内存与堆外内存的比较序列化方法Flink序列化数据类型参考内存管理Flink是由Java语言所开发的,而基于JVM的数据分析引擎都需要面对将大量的数据存到内存当中,JVM存在以下几个问题:Java对象存储密度低。因为Java对象需要存储许多其他信息,比如一个boolean对象就占用了16个字节内存,其中包括了对象头占8个字节,boolean占一个字节,对齐填充占了7个。相当于浪费了15个字节。 Full GC会极.

2021-10-09 14:17:30 877 1

原创 Flink源码解读(二):JobGraph源码解读

目录JobGraph源码解读JobGraph生成过程入口函数createJobGraph函数参考JobGraph源码解读上回说到,StreamGraph的源码其中是在客户端生成,并且是生成Node节点和Edge,主要是通过StreamAPI生成,表示拓扑结构,这次给大家讲讲JobGraph的生成(以Yarn集群模式)。首先,JobGraph是基于StreamGraph进行优化(包括设置Checkpoint、slot分组策略,内存占比等),最主要是将多个符合条件的StreamN

2021-10-07 09:52:02 815

原创 Flink 解析(二):反压机制解析

Flink反压机制反压是流式系统中关于处理能力的动态反馈机制,并且是从下游到上游的反馈,一般是在实时数据处理的过程中,上游节点的生产速度大于下游节点的消费速度。在Flink中,反压主要有两个部分:跨TaskManager的反压过程和TaskManager内的反压过程。Flink TaskManager内存结构先给大家看看Flink中网络传输场景下的内存管理。首先,每一个Task都是在TaskManager(TM)中运行,每个TM中都存在一个内存区域叫做NetworkBufferPo...

2021-10-03 16:36:56 2311

jstl1.2.jar&stanard;.jar

针对Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core”问题

2018-06-08

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除