生产实践中的经典算法-BitMap 是一个位图,用二进制来记录数据状态,本质就是字节表示法。一个int占4个字节,32bit。用下标表示数值,下标索引由0~31。比如想存1,2,4,6。在字节数组中下标对应1,2,4,6位置的元素记为,其余为0。因为都是在A[0]中,A[0]=1+4+16+64=86。因为一个字节数组只能存32位,比如A[0]存0~31,32就存在A[1]中。比如存32,34,36。后续数字以此类推。那么如何确定给定的一个数M,应该存在哪个位置呢?因为每个数组可以存32个,所以首先M/32得到应该存在数组的下标。
Spark shuffle和Hadoop shuffle区别通俗易懂 普通机制会将计算结果写入到一个默认的内存结构(默认是5M),每次写入都会进行一个阈值的判断,是否写满了。合并机制是让多个task共享一个buffer,这样会减少落盘的文件,会产生reduce个数 * core个数的文件。Map端Shuffle会将数据写入到环形缓冲区,默认大小是100M,底层是一个数组,一半存储数据,另一半存储元数据,当达到80%的时候进行反向溢写,溢写之前要根据key的hashcode值对reduce task的个数取模进行分区快排,然后溢写到本地磁盘中。当内存满了之后会写到本地磁盘。
数据库 面试题(持续更新) a. 普通索引:一个索引只能包含一个列,一个表中可以有多个普通索引b. 唯一索引:索引列的值必须唯一,但润许有空值,且只允许有一个空值c. 主键索引:一个表只能有一个主键索引,并且不能为空d. 复合索引:一个索引可以包含多个列。
Flink 面试题 (持续更新) 1. 计算速度不同,flink是真正的实时计算框架,Spark Streaming是一个准实时微批次的计算框架2. 架构不同,Spark Streaming的角色是Driver、Executor,Flink是JobManager和TaskManager3. 时间机制不同,Spark Streaming只支持处理时间,而Flink有三种时间:事件时间、注入时间和处理时间,并且还有水位线机制处理迟到数据。
Flink 容错机制 Barrier对齐: 一个task收到 所有上游 同一个编号的barrier之后,才会对自己的本地状态做备份①:精准一次:在对齐过程中,barrier后面的数据 阻塞等待,不会越过barrier②:至少一次:在对齐过程中,先到的barrier,其后面的数据不阻塞,继续计算非Barrier对齐:一个Task收到第一个barrier后,就开始执行备份,能保证精准一次。细节:①:先到的barrier 将本地状态备份,同时后面的数据接着计算输出。
Spark 数据倾斜问题 — 通俗易懂 原因:数据本身不均,分组之后导致不均匀或者filter过后分区间数据量不一致,造成某些key的value数据量远大于其他key的,导致绝大多数的任务执行的很快,只有少部分的任务执行的很慢甚至执行失败。
Flink -- 状态管理 Flink中算子任务可以分为有状态和无状态。无状态的算子任务只需要观察每个独立事件,根据当前输入的数据直接转换输出结果。比如map、flatmap有状态的算子,除了当前数据之外,还需要一些其他的数据来得到计算结果。这些其他数据,就是所谓的状态。比如聚合算子、窗口算子都属于有状态算子。
flink -- 处理函数 ProcessFunction底层继承了AbstractRichFunction,有两个泛型表示输入和输出。其中有一个抽象方法processElement必须要实现,另一个非抽象方法onTimer1) 抽象方法processElement对于流中的每个元素都会调用一次,参数包括三个,输入的数据值value、上下文ctx、收集器collector out,这个方法没有返回值,处理之后的输出数据是通过收集器out定义的2) 非抽象方法onTimer类似于闹钟,只有在注册好的定时器触发时才会调用。
Flink 水位线(Watermark)个人总结 在Flink中,用于衡量事件时间进展的标记,被称为水位线。可以看作一条特殊的数据记录,它是插入到数据流中的一个标记点。主要内容就是一个时间戳,用来指示当前的事件时间自身理解:本质上就是一个时间戳,表示比这个时间早的事件已经全部到达。并且在数据乱序的情况下,通过水位线可以判断出迟到的数据。
Flink的时间语义 -- 通俗介绍(包含零点漂移问题) 前一天23:59:59发送过来的数据,但是由于延迟发送到了下一天的分区,这条数据就具有偏差(离线数仓经典问题)。对于flink,具有事件时间,这个时间点是比较重要的,是保证计算结果准确的重要因素。喝牛奶这个时间为处理时间。一般情况下,业务日志数据中都会记录数据生成的时间戳(timestamp),它就可以作为事件时间判断的基础。"时间" 对于flink来说是非常重要的,大致可以分成两大类:事件时间和处理时间(flink的时间语义):一个数据产生的事件(比如2.30分下单操作,事件时间就为2.30分)