大数据离线面试基础
什么是缓慢变化维?
在实际生成情况中,很多维度属性并不是一成不变的,比如机构维度,职级维度
解决方案:
1.属性值不变-啥也不用改,变化的维度并不产生影响
2.重写维度属性--如:更新机构维度数据,问题是无法保留历史的维度值
3.拉链表--如:代理人职级晋升记录,表中的记录变化不大
4.增加维度行--如当维度属性发生变化时新增一条新的维度记录
5.增加属性列--属性变化时,增加一个新的字段来表示
6.全量快照,每天保存一份全量快照表
ETL过程中数据清洗(脏数据处理)小结
1.空值处理:一般使用默认值 入职时间-离职时间
2.数据格式处理: yyyy-MM-dd
3.枚举值处理:统一枚举值信息 ,如性别 男 1 女 2
4.字段类型处理:比如id字段,有的是String,有的是int
5.注释处理:表名,字段名
6.敏感数据处理:加密脱敏 姓名,身份照,手机号等
7.数据单位统一
8.逻辑错误 :年龄>100
指标建设
分类:
原子指标:某一业务流程下的度量,不可再拆分的
派生指标:由原子指标+多个修饰词+时间周期 新增注册数,支付成功总数
衍生指标/复合指标: 比率型,比例型
目标:基于业务侧发起的需求进行开发工作,最后实现的业务需求真正达成想要的效果 如:为了实现代理人业绩增长考核 200分指标体系
过程:
1.拆解业务目标,梳理出整个指标的框架
2.指标分级分类
3.采用5W2H弥补迭代
数据仓库的规范做什么事?
重视流程和规范,提前打好基础,目的主要有两个:
1.前浪踩过的坑后浪不要踩,提高开发效率
2.需要小伙伴交接的时候,因为大家遵循的标准相同,可以迅速交接上手
主要从如下几个方面展开
数据模型分层设计(ods-dwd-dws-ads,dim)
层次调用:按照数据流向依次调用
命名规范:bas idld init ods sub
代码设计:脚本,复杂逻辑是否有备注,是否支持任务重跑,不允许引用临时表,是否存在笛卡尔积等
任务延迟原因及任务及时产出方案
1.模型层面
严格按照模型架构设计原则,避免链路过长
模型迭代:试运行再提交,避免select * 等操作
模型优化:检查链路那个任务产出时间晚,再进一步分析
2.调度层面
可能遇到的问题
1.上游任务跑完,下游任务过了很久才开始调用 检查调用时间,依赖
2.上游任务跑完,下游一直running 任务运行时间告警,占用资源告警
当天没跑完任务,第二天运维通知
数据质量监控-核心指标数据量,完成时间,任务状态
企业级数据质量是如何建设并落地的?
数仓建设真正的难点不在于数仓设计,而在于后续业务发展起来,业务线变的庞大的数据治理
数据治理的范围:数据安全,数据质量,数据架构,元数据,数据建模设计等
为什么要进行数据质量评估治理?
1.统计近7天用户的购买情况,发现很多数据发生了重复记录,甚至计量单位不统一
2.数据报表每天更新,突然发现某一天的数据量,暴涨暴跌,发现是当天数据缺失或重复
衡量标准
1.数据完整性,是否存在数据缺失的状况,或某个字段信息缺失
2.规范性,有没有遵循语法规则定义,时间格式定义为 yyyy-MM-dd
3.一致性,数据记录的规范和数据是否一致, 年龄 200
4.准确性,饱和度低
5.唯一性,数据大量重复
6.及时性,任务每天监测是否异常或延时
谈谈NameNode和SecondaryNameNode?
两个核心组件Fsimage(hdfs元数据的一个永久性检查点),Edits(hdfs所有更新操作)文件
1.namenode节点的磁盘需要经常进行随机访问,还有响应客户请求,必然效率过低,因此元数据必然放在内存,一旦断电,元数据必然丢失,必须要将元数据备份在磁盘中
2.当内存中的元数据更新时,如果同时更新Fsimage,必然效率过低,一旦断电必然丢失,因此引入了edits文件(只进行追加操作,效率很高),每当内存元数据更新时,修改的内存元数据就存入edits文件,这样可以通过Fsimage和edits合并元数据
3.但是,过长时间添加数据到edits中会导致edits文件过大,效率降低,且一旦断电,恢复时间较长,因此专门引入SecondaryName,用于合并操作
谈谈MapReduce工作流程
1.Read阶段 MapTask通过用户编写的RecordReader,从输入InputSpilt中解析出一个个key/value
2.Map阶段 将解析出来的key/value交给用户编写的Map函数处理,并产生新的key/value
3.Collect阶段 数据处理完后,一般调用OutPutCollect.collect()输出结果,并写入环形内存缓冲区中
4.Spill阶段 当环形内存缓冲区满后,会将数据写到本地磁盘上(对数据做一次本地排序,并在必要时对数据进行合并,压缩等操作),生成一个临时文件
5.Combine阶段 当所有数据处理完后,对所有临时文件进行一次合并
6.copy阶段 ReduceTask将各个MapTask上远程拷贝数据
7.Mergr阶段 启动两个线程对内存和磁盘的文件进行合并
8.Sort阶段 对多有数据进行一次归并排序
9.Reduce阶段 将计算结果写到hdfs上
hbase,hive,hadoop
hadoop本质上是一个分布式文件系统(hdfs)+分布式计算框架(Mapreduce)+调度系统(yarn)搭建起来的分布式大数据处理框架
hive是一个基于Hadoop的数据仓库,适用于一些高延迟性的应用,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql功能
hbase是一个hadoop的数据库,一个分布式,可扩展,大数据的存储。hbase是物理表,不是逻辑表,海量存储,列式存储,稀疏,不能支持条件查询,只能按照rowkey查询
谈谈Datanode工作机制
1.一个数据块block在datanode上以文件的形式存储在磁盘上,包括两个文件,一个数据本身,一个是元数据,包括数据块的长度,时间戳等
2.DataNode启动后,向NameNode注册,通过后,周期性的向Namenode上报所有的块信息
3.心跳机制监测datanode,有异常的则认为该节点不可用
当Datanode读取block的时候,计算checkSum,如果与创建时不一样,说明block损坏,client会读取其他Datanode上的block
谈谈hdfs文件上传:
1.client端通知namenode要上传文件,namonode检查文件名是否因存在,如果不存在通知可以上传,并且返回可以用于存储的datanode列表
2.client切割文件为block块(默认大小为128m),向namenode请求上传block1,namenode返回可用的Datanode信息
3.client和返回的第一个Datanode1建立通信管道,datanode1会和datanode2建立,datanode2会和datanode3建立,这样管道流就建立成功,之后开始上传文件内容,然后Datanode1会和datanode2同步数据,datanode2和datanode3同步数据
4.当统数据数据结束之后通知client上传完毕,client通知namenode块1上传完毕,Namenode会记录元数据信息(block1存在的Datanode位置)的时候进行block2上传
5.如果认为上传成功,namenode后续会指定其他DataNode与DataNode1同步副本数
谈谈hdfs下载文件:
1.client向Namenode提交get下载文件请求
2.Namenode返回相关数据的block list块列表,这个列表是排序过的,排序原则是根据距离client所在的机器的路由远及近和心跳检测
3.client获取离他最近的一个block的地址,与相关的Datanode建立通讯
4.通讯是socket stream 重复调用父类的dataInputStream的read方法直到读取完全部数据
5.读取完毕一个block会进行行数校验,check num,如果发现和Namenode记录的行数不一致会重新请求Namenode给一个新的block地址进行读取,会并行读取多个block块,最后合并成一个文件
谈谈Yarn的资源调度过程?
1.客户端向resourcemanager发送提交任务的请求
2.在resourcemanager端进行一系列的检查,检查输入和输出的目录、权限
3.所有的检查通过,resourcemanager会为当前的程序分配一个nodemanager节点,并在这个节点上启动container,并在这个container中启动MRAppMaster
4.MRAppMaster向resourcemanager申请资源,运行maptask任务和reducetask任务
5.resourcemanager向MRAppMaster返回资源,优先返回有数据的节点
6.MRAppMaster到相应的节点上启动container,然后再启动maptask和reducetask
7.maptask和reducetask启动后需要向MRAppMaster进行汇报自身的运行状态和进度
8.当maptask或reducetask运行完成,这个时候会向MRAppMaster进行注销自己,释放资源
9.当整个应用程序运行完后,MRAppMaster向resourcemanager注销自己,释放资源