1.为什么维度表名不用Maxwell采集,需要另外用一个flink cdc采集?
因为如果用Maxwell采集,那么来一条数据,无法判断是否是维度表,是否要存储到hbase
如果用flink cdc ,那么可以先读,变成广播流,广播到其它并行度,这样来一条数据,就可以判断出来是维度表的数据,还是事实表的数据了。
2.hbase和MySQL比较
优点:
- 可以存很多行数据,因为可以切分为region
- 可以存很多列数据,因为可以按照列族切分store,所以每个列族下面不要有太多的列
- 可以灵活配置列,每一行的列可以不一样
缺点:
- 如果按照其他字段查询,效率低
3.状态、检查点、状态后端区别
- 状态
- 存储中间数据的变量
- 检查点
- 备份状态
- 状态后端
- 设置状态存储到什么位置
- 设置检查点存储到什么位置
4.状态和检查点可以保存到的位置
- hash
- 状态保存到taskmanager内存
- 检查点默认保存到jobmanager内存,也可以配置到HDFS
- rocksdb
- 状态默认存储在TaskManager的本地数据目录里
- 检查点保存到磁盘,也可以配置到HDFS
5.键控状态和算子状态的区别
- 键控状态是每一个分组一个状态
- 算子状态是每一个并行度一个状态
6.Flink CDC的offset保存到什么地方?
flink cdc offset 保存到检查点
7.Flink CDC和Maxwell的区别
- Flink CDC
- 可以获取历史数据
- 可以按照binlog读取变化的数据
- 不能单独指定要从头读取哪个表,而是会用select全部扫描
- Maxwell
- 可以获取历史数据
- 可以按照binlog读取变化的数据
- 可以单独指定一个表,用select扫描,就是bootstarp
8.广播流设置几个并行度
1个
9.Flink-设置重启策略
//这种设置方法的意思是:只有3次重启机会,每隔3秒重启
//如果7月5号重启2次,10月5号重启1次,那么3次机会用完了,到11月5号再错就不会重启了
//3秒指的是,重启一次没成功,那么会等3秒再试着重启
// env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,3000L));
//这种设置方法的意思是:每30天有3次重启机会
//到30天会归零,如果还有1次机会,那么30天之后,会重置成3次机会
//后面那个3秒是重启间隔
env.setRestartStrategy(RestartStrategies.failureRateRestart(3, Time.days(30),Time.seconds(3)));
10.设置操作Hadoop的用户
-
System.setProperty("HADOOP_USER_NAME","atguigu");
- 在idea中添加JVM选项
-
-DHADOOP_USER_NAME=atguigu
-
11.实时数仓用的是什么模型?
- 离线数仓
- 星型模型
- 不遵守3范式
- 可以维度退化
- DIM因为是每日全量同步,可以拿到全部数据,并且是最新的
- 实时数仓
- 雪花模型
- 遵守3范式
- DIM存储在Hbase,维度表每变化一次,就更新Hbase中的表
12.需要先读取配置流怎么实现?
- 通过关闭Maxwell控制主流,等配置流读取完毕,再启动Maxwell
- 在open方法中,通过jdbc从MySQL中将配置数据读取出来,存储到map成员变量中
13.Flink的水位线为什么要减1ms
- 因为水位线代表,在当前时间之前的所有数据都到齐了
- 窗口触发计算
- 定时器
- 参考:http://t.csdn.cn/TUPqo
14.Flink的初始的最大时间戳为什么要加1ms
因为如果用long的最小值,迟迟没有数据到来,那么,在200ms后发送水位线的时候,水位线会减去1,那么水位线会变成一个极大值,所以先加1
15.kafka生产者分区分配策略中,可用分区是指什么?
指的是闲置分区,batch没满的,时间到了,sender线程没来得及拉取的
16. kafka生产者分区分配策略,粘性分区策略
kafka粘性分区,是一直往某个分区发数据, 等这个分区的batch满了,或者linger.ms到了,就再随机选择一个可用分区
17.kafka监控中各个参数含义?
- lag:是指条数,数据积压了多少条
- offset:是指消费者消费到了哪个位置
18. Flink分区、分组、分流的区别
- 分区
- 不同的并行度
- 分组
- 按照key分组,keyBy
- 分流
- 侧输出流,只是在主流上打了个标记,可以通过主流获取侧输出流
19.Flink设置检查点间隔时间,和每多少秒备份一次不冲突吗?
不冲突
两个检查点间隔:第一个检查点结束的时间到第二个检查点开始的时间;
也就是说第一个检查点备份完成,必须等间隔时间过去,再开始第二次备份
每多少秒(5)备份一次,是指每5秒备份一次检查点,如果5秒到了,还没备份完,以间隔时间为准。
20.Flink设置uid的目的?
uid为了检查点恢复的时候可以找到算子
21.侧流需要加花括号,防止泛型擦除
22.状态是单例的
23.只能在open方法初始化状态
因为在外面初始化,算子的生命周期还没开始,没有上下文
24.FlinkSQL的状态过期可以续命
因为可以设置,读的时候也可以续命
左表 右表 * 内连接 onCreateAndWrite onCreateAndWrite * 左外联结 onReadAndWrite onCreateAndWrite * 右外联结 onCreateAndWrite onReadAndWrite * 全外联结 onReadAndWrite onReadAndWrite
25. 对于join,不同窗口的情况对比
- 滚动窗口
- 缺点:容易关联不上
- 滑动窗口
- 容易重复关联
- 会话窗口
- 缺点:容易关联不上
26.intervaljoin的特点
- 有上下界,范围join,双向,从状态中找时间范围的
- 只支持事件时间
- 左表是3-8,右表是-3到-8,左流和右流的时间范围不一样,加了个负号(源码)
27.slot是一个进程吗?
答:taskmanager是一个进程,slot不是一个进程。
slot是内存隔离,CPU共享,每个并行度的最大的事件时间都不一样是因为:每个并行度都会创建一个对象,放到taskmanager的堆内存中,每个并行度持有不同的对象引用。
28.flink sql优化
设置状态过期时间
29.Flink API只支持内连接
30.连接器和source的区别
在API中叫source,在SQL中叫连接器
31.关联hbase时,用处理时间的原因
希望获取hbase的最新版本数据
FOR SYSTEM_TIME AS OF e.proc_time d
32.对于内连接,外连接,状态默认是永远不会删除,所以要设置状态的过期时间
33.intervaljoin的状态删除策略
永远不可能再来我的范围内的数据了,所以可以把我从状态中删除。因为源码是把右表的上下界反转了,所以左表会找左边5秒的数据,右表的当前数据也不在左表的范围内,所以可以把右表的当前数据从状态中删除。
当到达上界的时候,会把对应的数据删除。
34.使用intervaljoin时,需要在创建表的时候指定水位线是哪个字段
35.实时数仓为什么要划分域?
有域让数仓更加清晰
36.rocksdb的备份策略
状态默认是在自己的库中
检查点备份在指定Linux目录中
37.sink需要设置读已提交吗?
不用
只需要kafkasource指定就行,为了防止读到脏数据,sink不用指定
38.flink会自己维护kafka的offset
不会触发kafka的再平衡
是kafkasource的一个成员变量,会保存到状态中
39.怎么解决kafka数据重复问题?
可以用抵消的思想。
比如先来了一条左表有值,右表为null的数据,直接传递到下游,并且存到状态中,设置过期时间为10秒,再来一条右表有值的数据,那么会先发送一条-500的数据到下游,抵消原来的值,再把右表有值的数据发送到下游。
如果落不到一个窗口怎么办?
可以设置乱序时间,比如13秒的数据来的时候触发计算,那么前一个窗口触发计算,13秒的数据会落到下一个窗口,所以临界值也没问题。
40. 你们实时数仓都有哪些亮点?
- DIM
- 存储到hbase
- 使用配置表动态创建hbase表
- 动态判断数据是否是维度数据
- DWD
- 动态分流,使用MySQL中的配置表,将简单的事实数据,直接存储到对应的dwd表中
- DWS
- 维度关联,使用了旁路缓存,异步编排
- 对DWD的数据进行去重,采用抵消的思想
41. 你们实时数仓的时效性是多少?
时效性10秒
因为窗口10秒聚合一次,sugar 10秒刷新一次,调用一次接口
42.Maxwell和flink cdc区别
- 稳定性
- Maxwell更加稳定,因为flink cdc是刚出来的技术
- 灵活性
- Maxwell可以指定表进行全量同步,flink cdc无法指定,只能一次同步所有表
- 架构不同
- flink cdc必须基于flink,Maxwell可以写到kafka中
43.taskmanager默认几个slot?
默认1个slot
44.并行度和slot的关系?
每个并行度对应一个slot,如果并行度设置超过了slot数量,会报错。
slot和CPU核的分配原则是,一个CPU分配1个或者2个slot
slot是内存隔离,CPU不隔离
给taskmanager分配4G内存,启动4个slot,每个slot分配1G内存,给jobmanager分配2G