- 博客(88)
- 收藏
- 关注
原创 延时重试的方法
在许多场景下,需要通过重试几次来取到正确的值,例如 ,在通过接口申请维表数据的时候,有可能接口设置限流,所以需要重试多次来获取正确的数据。这种重试如何实现呢?
2025-03-21 10:35:03
97
原创 Flink 内存模型各部分大小计算公式
D taskmanager.memory.managed.size=1438814063b ,managed memory 的大小,计算得来的大小是 13.4G ,正好是 1438814063/1024/1024/1024 的大小。-D taskmanager.memory.jvm-overhead.max=429496736b 这个是 overhead 的大小, 它是 410 M ,正好是429496736/1024/1024/1024 的大小。
2025-02-10 18:02:16
838
原创 递归的一个应用
有的部门在二级,有的在三级上,如果使用常规的 sql 自关联的方法,不能适应情况的发展,如果,在第四级或者第六级上面新增部门。那就需要修改 sql 了。三个关键字段,有一家公司,他们的部门分为四级。现需要取出任意部门下所有没有下级部门的部门。以下面的组织架构为例,
2024-07-16 10:02:46
193
原创 再说连续性问题
连续问题是判断在某个期间,某些动作(状态)是否连续出现。在帖子连续性问题中, 已经提到了用户连续登录、最大假期等。这些问题的解法是使用大小等差数列相减的办法。其实还有一种算法可以解决此问题,它就是合并集办法。合并集往往使用在计算二维数组的连通性问题,例如,leetcode 的 friend-circle 和 island-size 两个问题。并查集能解决二维数组的问题,那么一维数组的问题一定也能完美解决,在之前文章中提到的连续性问题就是一维数组上的连通性问题。
2024-04-26 11:30:42
449
原创 哈夫曼编码的实现
讲了半天,哈夫曼编码和字符集有什么关系呢?大家仔细观察,英文的字符,有的使用比较多,有的比较少,能不能使用比较短的比特为表示比较常用的字符呢?这些编码集合,本质上都是一个二进制和字符之间映射关系,拿最简单的 ASCII 来说吧,使用 0x30 代表字符 0 ,0x31 代表字符 1,当打印设备看到 0x30 后,就打印出字符 0 了。ASCII 最初是由美国弄出来,他们使用的英文,所以只考虑了英文中的字符,那还有很多字符,比如,阿拉伯文字、俄文这些文字怎么表示,于是就有了 UTF-8 这些。
2024-04-17 22:41:15
383
原创 有依赖的的动态规划问题
例如,兔子数列:f(x) = f(x - 1) + f(x -2), 我们知道 f 代表了计算公式,这里解放思想一下,如果 f 替换为数组,将每个 f(x) 的返回值返回,那么是不是就不用计算了,直接返回了,这样就节省了 CPU 递归和计算的时间,提高计算的效率,这样就对递归进行了优化。经典的 0-1 背包问题。它题目往往是这样有两个一维数组,第一个代表了容量,第二个代表价值,给定一个 N 正整数值,N 值是背包能装的容量,数组的一个元素代表了一个物品,一个物品只能装一个,问背包能装下的最大价值是多少?
2024-04-15 17:33:42
871
原创 Spark的数据结构——RDD
在 compute 中并没有从依赖中取出迭代器,而是调用了 ShuffleManager#getReader 方法,这是因为 combineByKey 是做分区操作的,所以要将相同 key 的数据通过网络发送到不同的机器上,其实就是 Map-Reduce 计算引擎的 shuffle 过程,这里也是一样的,这也是 ShuffleRDD 名称的由来。还有更重要的一点,就是第二个特征,作用在分区上的函数,RDD 加上 PairRDDFunction 上的函数有很多,可以在上一篇。我们只捡能说明问题的就行了。
2024-03-13 14:50:49
810
原创 Spark 核心API
这两个函数是 PairRDDFunctions 的匿名类中的函数,从 PairRDDFunctions 的名称中可以知道,PairRDDFunctions 是真的键值对的,也就是说 RDD 中的数据是键值对的时候,我们可以调 PairRDDFunctions 的函数,scala 这个功能好像类的被动技能。action 算子是真正出发计算的算子,在 action 算子之前, 所有的算子就像流水线上的一个工序,按照我们想要的结果设置好了加工模具,action 才能够决一个 job 的开始。就看一下它的入参吧。
2024-03-08 08:57:31
1455
原创 Hbase 的三个应用
上述代码利用了 Hbase 的 checkAndMutate 功能,先检查 cust 是否存在,如果存在则返回 true ,用户需要被屏蔽,如果不存在,则返回 false ,并将用户插入到 Hbase table 中,整个过程是原子性的。在多个节点同时运行这段代码时,每个节点都可以生成一个唯一的序列号,以确保生成的序列号在整个分布式系统中是唯一的。在获取到锁之后,执行用户指定的函数,然后通过用户输入来释放锁的状态。它通过自旋操作来等待锁的释放,并尝试获取锁,以保证共享资源的访问的一致性和正确性。
2023-12-31 17:55:13
874
原创 袋鼠云的FlinkSQL插件开发
这里所说的插件是可以理解为自定义的语法。dim_shop 可能是一个 redis 为实体的 Table ,这袋鼠已经为我们实现了,现在我们可能从 HTTP 的接口拿到数据,此时的话,我们可以自定义一个 HTTP Table ,然后上面的代码不用修改。
2023-10-24 16:31:24
1325
原创 KafkaConsuner 指定开始消费的位置
需要在执行了 poll() 方法之后才行。我本来想指定一个开始位置,但是还没有指定位置呢?在我们探讨的功能中,index和timeindex两个文件扮演着关键角色,它们与消费者开始消费的位置密切相关。这是我们今天要讲解的核心基础,没有这两个文件,我们无法进行后续的操作。就用了,FlinkKafkaConsumer 不是从 checkpoint 消费,就能是手工指定的位置消费了。才能获取到偏移的位置,否返回一个 size() = 0 的 map。的方式,指定了消费者的消费位置,这样以来,
2023-06-06 22:46:26
3098
原创 集合相关的知识点
ArrayList 的扩容规则newElementSize - elementData.size > 0 ,说明需要扩容了,否则的话不需要扩容。一般的情况下,扩容大小为原大小的 1.5 倍 , 这里使用了一个小技巧,elementSize + (elementSize >> 1) ,>> 1 其实就是除2的操作,但是 >>1 的执行效率比较高。取比例扩容的值和实际需要的大小的最大值作为本次扩容值。如果使用 add , 基本上使用比例扩容就可了。如果 addAl
2022-03-30 23:51:21
388
原创 重学常见排序算法
最常见的有冒(冒泡)择(选择)路(插入)希(希尔)快(快速)归(归并)堆(堆排序)。 这一次把所有的常见的排序熟悉一遍,后面就一劳永逸了。冒泡算法连接:https://www.bilibili.com/video/BV1Mi4y1k7QT/冒泡排序算法的文字描述:一次比较数组中相邻两个元素大小,若 a[j] > a[j+1] , 则交换两个元素,两两都比较一遍为一轮排序,结果是让最大的元素排至最后。重复以上步骤,指导整个数组有序。先实现一版最简单。import java.util.
2022-03-28 22:10:46
269
原创 各种同步器的实现原理
我们可以把是实现的原理分成两部分,一个是修改 state 的部分,也就是 AQS 的实现类是如何实现 tryAcquire() 方法;另外一个入队列和出队列的逻辑。其中前一个是都不相同的,后面一个是基本相同的。先来看看,ReentrantLocktryAquire()// 有两个,一个是公平锁,一个非公平锁static final class FairSync extends Sync { private static final long serialVersionUID = -30008
2022-02-13 21:54:44
1554
原创 AQS对基本概念的实现
非公平锁公平锁如何实现的呢?我们来看看 ReentranLock 中的 NonfairSync 类,这个类中就实现了对非公平锁的实现。final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1);}这段逻辑中,我们可以发现,线程是直接取修改 state 的状态,这代表竞争锁,如果竞争到
2022-02-13 21:53:25
325
原创 AQS 的基础方法
AQS 到底是什么东西AQS 解决的是申请锁和进程间通信的问题。在 AQS 出现之前,锁只能用 sychronized , 进程间通信只能使用 Object#wait/waitAll 和 Object#notify/notifyAll 来进行线程之间通信问题。wait/notify 的缺点是等待的线程需要进入阻塞状态,再 I\O 任务的场景下,这种需要阻塞线程的方式效率是不高的。自旋的方式可以提供这种效率。如果有一个基础的类。在它的基础上我们可以实现公平锁、非公平锁、可重入锁、不可重入锁、独享锁、共享锁
2022-02-13 21:51:30
573
原创 关于 J.U.C 的基本概念
一些基本的概念乐观锁和悲观锁乐观锁是在使用资源之前不上锁的处理方式。悲观锁是在使用资源之前要上锁。乐观锁和悲观锁的定义是使用场景来说。 在资源竞争不激烈的情况下,说明资源比较充足,我们保持一种乐观的态度,所以在使用之前不用上锁。悲观锁是在资源竞争激烈的情况下,说明资源竞争比较激烈,所以在使用资源之前要上锁。上锁之后的目的就是告诉前来竞争的线程,你们不用抢占资源了,这个资源在用了,而且用的时间不会短,你就去排队吧。公平锁和非公平锁公平锁就是获得锁的机会大家都是一样的,大家都在一种 FIFO 的队列里面
2022-02-13 21:46:30
768
原创 整数的计算
功能介绍输入计算整数加减乘除的字符串。解析并计算,得到结果。代码 /** * 解析计算公式里面的括号。 */ private static void bracketHandler(String input){ ArrayDeque<String> ad = new ArrayDeque<>(); String cal = "" ; char[] chars = input.toCharArray();
2021-11-23 09:16:43
178
原创 Kafka 面试题目
第一题Kafka数据积压如何处理?首先来分析一下积压的原因。总体上来说,造成挤压的条件是生产者生产数据的速度大于了消费者的速度。一般使用 rps 来表示。生产者这一端,一般连接的是业务系统,我们可以给业务数据根据重要性来分级,如果在数量超大的情况下,我们可以将一些低重要级的数据分流到其他的 kafka 上面,优先保证重要数据的处理。我们能做的就把消费者的速度搞上去。在消费者这边,可以分成两段来分析,一个是 KafkaConsumer ,一个是 data processer 。造成前者消费速度较生产者慢的
2021-10-24 21:40:19
786
1
原创 Kafka 端到端数据完整性
完整性如何保证数据的端到端的数据完整性?这里说的完整性,就是说“不丢数据”,这里是不丢数据的意思。这里没有保准数据的一致性。也就是说,sink 端收到的数据可能是重复的。如果要保证完整性,需要再 producer 端、broker 端、consumer 端,这三个地方下功夫。producer 端producer 端可以有两种发送方式,一个是只负责发送,至于 broker 收到没有收到那就不管了。另外一种类似 TCP 协议,每一个 TCP 包都会有一个 ACK 回复,收到 ACK 才确定这条数据发送
2021-08-23 22:12:43
689
原创 FlinkKafkaProducer 数据一致性
什么是数据的一致性这所说的数据一致性指,在一个 Flink 任务遇到不可坑因素整体死掉或者部分死掉,已经外部存储介质死掉后,将死掉的部分重写启动后,计算结果和出现故障之前一致,不会产生任何的影响。如果要实现这种效果,无论发生什么,所有算子做到如下要求:source 算子中,一条记录只向下游发送一次。在聚合算子、合集算子、转换算子中一条数据只处理一次。在 sink 算子中,一条数据只向外部存储介质中写入一次。只要做到这些,我们就可以说,我们整个任务的数据是一致的。今天就把 Flink 自己封
2021-06-16 17:09:19
639
原创 如何优化IF/ESE的结构
如何简化多层 if/else目前总结了三种简化多层 if/else 的方法:多态的方式。图结构解决语法树多态方式。多态的方式利用 Java 对象多态的特性。如下所示样式的语句。public void method(flag){ if(flag == var1){ //do_something }else if(flag == varr){ // do_something }else{ // the last choi
2021-05-31 08:41:13
190
原创 补码的原理
怎么就想到这里了看了一道面试题目,如下所示:byte b = (byte)129;System.out.println(b);问输出结果。这个题目考察了四个知识点:整数的字面量默认是 int 类型的。而 int 类型占 32 个 bit 。byte 类型的是 8 ge bit 。能够表示的最大正整数是 127.补码的计算公式。强制类型转换129 = 2 的 7 次方 + 1所以在内存中的表示为: 0000 0000 0000 0000 0000 0000 1000 0001b
2021-05-15 18:13:46
938
3
原创 调度系统的几个核心功能
调度系统是什么先从调度说起,调度就是为每件事情,合理的安排时间。具体得说就是在合理的时间开始,耗费合理的时间完成。举个例子:11:00~12:00 在这期间把销售数据跑出来。13:00~14:00 在这期间把拉新的数据跑出来。等等吧。那还有问题,如果销售数据在跑的时候,出现了问题,导致数据在12:00之前没有跑出来,调度系统应该如何出来?再有如果拉新数据依赖于销售数据,也就是说销售数据跑出来,拉新数据才能开始跑出来,调度系统应该如何处理这种一来关系呢?另外我们现在只举出了两个例子,在真实的工作
2021-02-21 10:18:12
5604
原创 算法:去环行动
题目假设我们有如下数据:A B C D E C F G C 先使以 G 来分割这个 list ,如果是上面的数据,则得到如下两个 list :1. A B C D E C F G2. C 这个题目其实就是 Java 中 String 类中的 split 方法类似的功能。我倒是想出了一个类似递归的方式来解决这个问题,步骤如下所示:使用 list 的 contain 方法,判断 G 是否在 list 里面。如果 G 在数组里面,则使用 indexOf 找出 G 所在的位置 i。使用 s
2021-01-19 20:07:53
197
原创 Flink——理解 allowLateness
什么鬼WindowOperator 里面还有有一个叫做 allowLateness 的东西,这个东西什么鬼呢?简单来说就给迟到的数据第二次机会。我允许它迟到一定的时间。在规定的迟到时间内,只要要数据来了,就会触发第二次窗口计算,那到什么时候就没有第二次机会了呢?下面我们来娓娓道来。allowLateness 的逻辑过程二话不说,先来看一下下面的代码,在这段代码中,```javaWindowOperator 中的成员变量 /** * The allowed lateness for
2020-11-23 12:32:13
614
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人