This commit is contained in:
HuaYu 2022-06-21 22:13:53 +08:00
parent 32d7c6c00a
commit 04ef0490bd
25 changed files with 545 additions and 0 deletions

1
flink/TableAPI.md Normal file
View File

@ -0,0 +1 @@
UDF自定义函数

18
flink/checkpoint.md Normal file
View File

@ -0,0 +1,18 @@
## checkpoint
分布式快照,应对失败后重新开始
1. 批计算是否需要checkpoint?否
2. 流计算
1. 任务7*24小时运行,重启能够无缝重启
2. exactly-once 恰好一次,at-most-once至多一次
3. source读取来的数据,必须让整个链路执行成功处理完成才会将state持久化到外部存储(checkpoint)
1. source数据源必须支持再次消费
2. 必须等到所有的算子处理完才checkpoint,否则at-most-once
4. 吞吐量不高,battier(广播分发)栅栏,按批次checkpoint,可能引起重复数据落盘
1. 幂等处理id
2. checkpoint和mysql事物结合在一起
3. source允许再消费,sink幂等或者事务
5. 失败后恢复checkpoint快照.
6. savepoint->手动checkpoint
7. 设置uid,方便代码升级s

257
flink/flink.md Normal file
View File

@ -0,0 +1,257 @@
## Hadoop生态圈
### Yarn资源调度
MR on Yarn
Storm on Yarn
Spark on Yarn
Flink on Yarn
### HDFS
### MR
分而治之
## Lambda架构
离线计算 MapReduce,Hive:
实时计算
## Apache Spark
生态圈完善
Spark core 批计算 取代MR,
1. 预先申请资源Spark申请资源的粗粒度的资源申请,启动任务速度快,task完毕executor 不会立即释放.MR细粒度资源申请,执行完毕后立即释放.
2. Spark基于内存计算cache persisit内存计算pipline,RDD存储逻辑,partion
Spark streaming 流计算 取代storm
1. 微批
2. 无状态,batch
3. 有状态计算updateStateByKey(checkpoint),flink
4. 无界有界,window窗口和水位线处理顺序问题
spark sql sql
Spark mlib 机器学习
批处理只是流数据的一个极限特例而已.
## Flink
1. 支持高吞吐,低延迟,高性能\
2. 支持时间时间(Event Time)概念,结合WaterMark处理乱序数据.
1. spark基于系统时间,数据到系统的时间,
2. flink基于用户带来的时间
3. 支持有状态计算,并且支持多种状态 内存,文件,RocksDB
4. 支持高度灵活的窗口,time,count,session
5. 基于轻量级分布式快照(CheckPoint)实现容错保证exactly-once语义
6. 基于JVM实现独立内存管理
7. Save points 保存点,方便代码升级
## Flink与Spark对比
### spark
pipline
spark与MR速度原因
有界与无界流
集群
1. master,管理集群中所有Worker进而管理了集群资源
2. worker管理各个节点上的资源mem core
1. WORKER_MEMORY
2. WORKER_CORE
3. Driver任务调度
4. Executor执行task
### Flink集群
1. JobManager(JVM进程)master
1. 资源调度
2. 任务调度,触发集群进行checkpoint,
2. TaskManager(JVM进程)slaver
1. TaskManager向JobManager注册资源
2. TackManager中资源使用Task slot进行隔离,隔离内存无法隔离核.
3. TaskManager 3G 3Core
4. 设置3个task slot 平分TaskManager
5. task slot 一组固定资源
## 开发
1. 准备环境,创建/获取
2. 数据处理逻辑
3. 启动Flink任务
## 提交集群
1. Yarn-Session
1. 提交前,需要yarn去启动一个flink集群(yarn-session)
2. 启动成功后,通过flink run 这个命令去往flink集群中提交任务
3. 当job执行完毕,yarn-session集群并不会关闭,等待下一个job提交,一直占用集群资源(JobManager),好处job启动时间变短
2. Run a flink job on yarn
1. 直接去yarn中提交一个flink job,在job执行之前,先去启动一个flink集群,集群启动成功,job在执行,当job执行完毕,flink集群一同关闭,释放资源
2. 每个job执行完,集群关闭,但是每个job启动时间变长.
### 搭建高可用集群
flink JobManager元数据checkpoint,数据存储,hadoop插件.
### JobManager分担压力Flink on yarn
1. jobManager任务管理,yarn资源管理.分担jobManager压力
2. 降低维护成本yarn
### 运行流程
RM,NM,yarn运行需要hdfs
1. 上传jar及配置文件
2. 为applicationMaster申请资源
3. 分配node资源,启动applicationmaster,下载jar及配置文件
4. applicationMaster为taskmanager申请资源
5. yarn分配node并启动TaskManager
6. 分配任务taskManager中运行
7. taskManager下载文件.
## HA
1. 主备
2. 重启
## 算子并行度
1. 配置文件中设置
2. 提交job的时候,通过-p选项来设置
3. 代码中设置parallelism
4. 算子上设置
## 任务调度算子链
本地化级别:PROCESS_LOCAL
1. 不同的Task下的subtask要分发到相同的TaskSlot中.降低数据传输,提高执行效率.尽可能实现算子链
2. 相同的Task下的subtask要分发到不同的TaskSlot中充分利用集群资源.
3. TaskSlot个数决定了job未来执行的并行度,job数不能大于TaskSlot数.
### 算子->函数
1. Stateful Stream Processing=========Low-level building block (streams,state[event]time)
2. DataStream/DataSetApi============Core Api
3. Table Api========================Declaretive DSL
4. sql=============================High-level Language
### flatMap代替filter
map,flat(扁平)
union 数据流何工,数据流中的数据必须一致.
connect假合并,数据流中数据可以不一样,comap
split 可以根据一定的条件拆分数据流.
side out
## 卡口数据
相同key的数据一定是由某一个subtask处理,一个subtask可能会处理多个key所对应的数据.
### 统计每分钟卡口流量
时间映射成分钟字段,直接count
每分钟每个卡口,组合key
富函数可获取上下文及生命周期.
process底层api
广播流
## 分区策略
1. shuffle==================增大分区,数据倾斜,增加并行度使用
2. rebalance================增大分区,数据倾斜,增加并行度使用
3. rescale==================减少分区,防止大量网络传输,降低并行度.
4. broadcast================广播,大量数据冗余,映射表
5. Forward=================上游分区与下游分区一一对应的分发,窄依赖
6. global===================上游中所有数据分发到下游中第一个分区中.
7. keyby===================可以根据用户指定的字段来分发
8. partiooncustom===========自定义分区策略
DataFlow
1. source
2. transformation
3. sink
## 恰好一次
幂等处理
## Flink State
会持久化到远端
1. Keyed State
1. value state
2. list state
3. map state
4. ReducingState
5. AggregationState替代FoldingState
2. No-Keyed State(Operator State)

65
flink/窗口.md Normal file
View File

@ -0,0 +1,65 @@
## 窗口
1. flink中窗口就是将无界流变为有界流
2. 支持基于时间分流未分流和元素个数
## 12种窗口
触发计算上一个窗口的数据
新窗口接收数据
### 滚动窗口
### 滑动窗口
### session窗口
### 增量聚和函数
reduce
aggregate
### 全量聚和函数(排序)
process
### Flink中支持三种时间语义
1. Process Time 当前元素进入窗口的系统时间(算子处理时间),默认时间语义
2. Event Time 事件时间,当前元素在数据源中产生的时间(数据自定义时间)
3. Ingestion time 摄取时间,元素进入flink source 的系统时间(元素进入source时间)
### 左闭右开
### 打水印
1. 周期性生成水印
2. 间歇性生成水印
### 添加水印后,只有水印能触发计算
1. window 触发 watermark>=window end
2. window触发 eventime>=window end
## AllowedLateness
延时多长时间能够再次执行上次窗口.
CacheFile
定时器定时拉取文件
readfile
MateStateDescription 管理员在修改配置文件的时候,需要将更改的信息同步值kafka配置到topic中,然后将kafka的配置流信息变成广播流,广播到业务流的各个线程中.

View File

View File

@ -0,0 +1,51 @@
方法区:类
堆:对象
## 装载:
class文件->字节流->类加载器(代码模块) 自定义类加载器 字节码增强 java agent
将一个字节流代表的静态存储结构转化成方法区运行时数据结构
在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区 的数据访问入口
## 链接
### 验证
文件格式验证,class文件,jvm版本
元数据验证,对于java语法的验证
字节码验证,数据流和控制流验证,运行时检查,栈数据类型和操作码
符号引用验证,将符号引用转为直接引用.(链接)
### 准备
常量赋值
### 解析
从运行时常量池中的符号引用动态确定具体值的过程(符号引用->直接引用).
对解析的结果进行缓存.
## 初始化
执行类构造器方法的过程.
声明类变量为定制的初始化值
使用静态代码块为类变量赋值
## 对象几种状态
1. 创建阶段
2. 应用阶段
3. 不可见阶段
4. 不可达阶段
5. 收集阶段
6. 终结阶段
7. 空间重分配阶段

45
jvm/垃圾收集算法.md Normal file
View File

@ -0,0 +1,45 @@
## 垃圾收集算法
### 标记清除算法
首次适应算法,最佳适应算法,最差适应算法,邻近算法
### 标记复制算法
两个相同大小
空间利用率低
### 标记-清除-整理(压缩)算法
随机整理,
线性整理,
滑动整理
双指针,头尾对撞强依赖对象大小相同.第一次移动位置不更新标记,第二次更新标记
## 分代回收三大假说
### 弱代带假说
绝大多数对象朝生夕死
### 强分代假说
活得越久的对象,也就是熬过很多次垃圾回收的对象是越来越难以消亡的
### 跨代引用假说
部分收集:不是完整的收集整个垃圾区域,而是只回收想要的一部分
新生代收集
老年代收集
Mixed GC:回收整个新生代,以及部分老年代的一种回收方式.
记忆集

36
jvm/类加载特性.md Normal file
View File

@ -0,0 +1,36 @@
# 类加载特性
### 类加载器
1. 负责读取java字节代码,并转换成java.long.class类的一个实例的代码模块
2. 类加载器除了用于加载类外,还可以用于确定类在java虚拟机中的唯一性.
全盘委托
父类委托
### 打破双亲委派
自定义类加载器
SPI(servie provider interface)
OSGI
### 运行时数据区
1. 程序计数器
2. 栈
1. 局部变量表
2. 操作数栈
3. 动态链接,将符号方法引用变为具体方法引用
4. 返回地址
5. 附加信息
3. 堆
4. 方法区
5. 运行时常量池
6. 本地方法栈
### 常量池
静态常量池,运行时常量池,字符串常量池

View File

@ -0,0 +1,8 @@
快慢指针.
回文
面试
1. 链表遍历与弹栈.
笔试
2. 修改右边指针往回指,分别从左右 开始遍历查看是否相同.

View File

@ -0,0 +1,8 @@
单链表环问题.
## 二叉树
### 先序
头左右
### 中序
左头右
### 后续
左右头

View File

@ -0,0 +1,9 @@
## 用队列栈实现宽度优先遍历
1. 队列弹出一个car并打印
2. car有左入左,有右入右.
## 用栈实现深度优先遍历.
1. 栈中弹出一个car并打印.
2. 有右入右,有做入左.

View File

@ -0,0 +1,14 @@
从一个节点开始,叶子节点都要,称作子树,否则称作拓扑.
### 二叉树递归套路
1. 假设以x节点为头,假设可以向x左树和x右树要任何信息
2. 在上一步的假设下,讨论以x为头节点的数,得到答案的可能性
3. 列出所有可能性后,确定到底需要向左树和右树要什么样的信息
4. 把左树信息和右树信息求全集,就是任何一颗子树都需要返回的信息S
5. 递归函数返回S,每一颗子树都这么要求
6. 写代码,在代码中考虑如何把左树信息和右树信息整合出整课数的信息
1. 思想边界提醒
2. 代码模板化

View File

@ -0,0 +1,2 @@
理清楚问题,在做..declare问题.

View File

@ -0,0 +1,5 @@
并查集:两个是否是同一个,两个联合。
往上到不能再往上,找父类.
并查集扫雷,感染并查集。
先写整体逻辑后分开写各各子实现。

View File

View File

@ -0,0 +1,7 @@
### 暴力递归
1. 把问题转换为规模缩小了的同类问题的子问题.
2. 有明确的不需要继续进行递归的条件
3. 有当得到了子问题的结果之后的决策过程
4. 不记录每一个子问题的解.
恢复现场

View File

@ -0,0 +1,3 @@
记忆化搜索
尝试策略,状态转移
1:28

View File

@ -0,0 +1,2 @@
重复线段问题.
1. 取.5判断多少线段包含.

View File

@ -0,0 +1,3 @@
前缀数:记录字符串出现频率.pass,end
桶排序
基数排序,按照个十百钱位 排序

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -0,0 +1,10 @@
比较器返回为负数,第一个在前.
左节点2*i+1
右节点2*i+2
父节点(i-1)/2
## 堆
完全二叉树.
PriorityQueue默认小根堆

View File

@ -0,0 +1 @@
指针指向及移动.