写在前面
🍁个人主页:HNUJSY
✨本期专栏:《史上最全经典面试题总结》欢迎订阅学习~
📌Xmind文件获取:GitHub 持续更新中,别忘了 star 喔~
目录
「Java学习+面试指南」思维导图,计算机自学指南,包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结构、操作系统等,后台技术栈/架构师之路/全栈开发社区,阿里,腾讯,百度,美团,头条等春招/秋招/校招/面试
思维导图(png格式可下载放大)
数仓知识
shell
ps -ef
top
- 查看进程
natstat
- 查看端口号
df -h
- 查看磁盘空间
4个工具
- awk
- sort
- sed
- cut
hadoop
入门
- 端口号
- 9870
- hdfs
- 50070
- hdfs
- 8088
- yarn
- 19888
- 查看任务情况
- 9000、8020、9820
- 外部访问
- 9000、8020
- 外部访问
- 9870
- 配置文件
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- workers
- slaves
hdfs
- 读写流程
- 小文件
- 危害
- namenode受不了
一个文件块150字节
128g/150bytes=128 1024m1024kb*1024bytes=9亿 - 一个文件块->一个maptask 1g内存
- namenode受不了
- 解决
- CombineTextinputformat
- 减少maptask
- har归档
- 类似文件压缩
- jvm重用
- 配置文件
- CombineTextinputformat
- 危害
- 副本
- 3
- 块大小
- 1.x 64m
- 2.x 3.x 128m
- 本地 32m
- 企业开发 128m、256m
- 块大小根据传输速率设置
mapreduce
- shuffle
- map方法之后,reduce方法之前混洗的过程
- map
- getpartition 标记数据是哪一个分区的
- 环形缓冲区 100m 80% 溢写
- 归并
- 写入磁盘
- 拉取到内存,不够持久化到磁盘
- 归并
- reduce
- reduce之后压缩:
永久保存,压缩越小
下一个map输入:数据量小:快 spappy/lzo 数据量大:切片 bzip2/lzop
- 分组
- 归并
- 默认拉取5个 优化性能高10-20个
- 优化增加内存
- 拉取到内存,不够持久化到磁盘
- 优化:压缩,减少磁盘io
快 spappy/lzo
- 写入磁盘
- 默认一次拉取10个,可优化20个
- 归并
- 优化 200m 90%,影响溢写文件个数
- 排序:快排
对key的索引排序
按照字典顺序排- 溢写文件
- 对溢写文件提前combiner 不影响最终结果
- 环形缓冲区 100m 80% 溢写
- 优化:自定义分区
- map之前压缩
数据量小:快 spappy/lzo
数据量大:切片 bzip2/lzop
- getpartition 标记数据是哪一个分区的
- 排序
- map 快排、归并
- reduce 归并、分组
- 内存参数
- nodemanager
- 默认8g->100g
- 单任务默认内存8G 分布式
128M数据->1G内存- maptask 1G
128M数据->1G内存 - reducetask 1G
128M数据->1G内存
- maptask 1G
- nodemanager
yarn
- 工作机制
- client
- resourcemanager
接受appid请求并返回集群路径 - 向路径提交
- xml
- 配置文件 参数
- jar
- 代码
- 切片
- 决定maptask数量
- xml
- resourcemanager
申请 appmaster task- task管理
- nodemanager container 空闲就来领取task 成为appmaster
- 从路径获取文件
- 切片决定maptask数量
- 向resourcemanager申请maptask
- nodemanager container 空闲就来领取task 由appmaster开启maptask 完成之后持久化到磁盘等待reduce
- 开启reducetask
- nodemanager container 空闲就来领取task 由appmaster开启maptask 完成之后持久化到磁盘等待reduce
- 从路径获取文件
- nodemanager container 空闲就来领取task 成为appmaster
- task管理
- resourcemanager
- client
- 调度器
- fifo
- 先进先出
- 单队列,串行,几乎不用
- 先进先出
- 容量调度器
- 底层是fifo
- 支持多队列,可以借用其他队列资源
- 先进入的任务优先执行
- 默认1个队列,按照分析引擎创建队列(spark、flink、hive),按照业务分:登录、注册、购物车
- 先进入的任务优先执行
- 支持多队列,可以借用其他队列资源
- 底层是fifo
- 公平调度器
- 支持多队列,可以借用其他队列资源
- 公平享有队列资源,谁的缺额多,分配资源多
- 支持多队列,可以借用其他队列资源
- apache 默认容量调度
- 并发度要求比较高,选择公平,中大型
并发度低,服务器性能差,选择容量
- fifo
zookeeper
- 选举机制
- 半数机制
- 安装台数
- 10-3
- 20-5
- 50-7
- 100-7
- 台数越多,增加可靠性,效率低
flume
组成
- source、channel、sink、put、take
- taildirsource
- 断点续传、多目录
- 1.7实现
- 自定义实现source
- offset持久化到磁盘
- taildirsource挂了
- 不会丢数据、有可能有重复数据
- 自身
- 采用事务方式、效率低
- 下一级处理
- hive、dwd、sparkstream,groupby,开窗取窗口第一条
- 自身
- 不会丢数据、有可能有重复数据
- 不支持递归遍历文件夹
- 不支持
- 自定义
- 递归+读取数据
- 自定义
- 不支持
- channel
- file channel
- 基于磁盘,可靠性高,性能低
- memory channel
- 基于内存,可靠性低,性能高
- kafka channel
- 数据存储在kafka里面,磁盘,可靠性高
- 优于memory,直接进入kafka
- 下一级kafka选择memory
下一级不是 可靠选file、性能选memory
- file channel
- hdfs sink
- 小文件
- 大小128m、时间1-2小时,event格式禁止0
- 小文件
- 拦截器
- etl拦截器
- 提前过滤
- 时间戳拦截器
- 获取日志里面的数据时间,根据这个时间创建hdsf目录
- 自定义拦截器
- 定义类实现interceptor接口,重写里面4个方法初始化、关闭、单event、多event,builder
- 可以不用,到下一步再处理
- etl拦截器
- 选择器
- replicating 默认
- 把数据发往下一级所有通道
- muliplexing
- 把数据选择性发往指定通道
- replicating 默认
- 监控器
- 监控put/take事务尝试提交的次数远远的大于最终提交成功的次数说明flume异常。
- 自身:增加内存
- 找兄弟:增加服务器
- 优化
- file channel 能配置多目录就配置多目录
- taildirsource
三个器
- 拦截器、选择器、监控器
挂了怎么办
- channel
- memory
- 100个
- file
- 100w个
- memory
- taildir source
- 不会丢失,可能重复
kafka
基本信息
- producer
- brokder
- consumer
- zookeeper
- broker
- id
- comsumer
- offset
- 没有producer
- 安装多少台
- 2*(生产者峰值生产速率*副本/100)+1=3
- 压测:生产者峰值生产速率、消费者峰值消费速率
- broker
- 副本
- 2-3个
- 默认一个 一般2
- 副本多:可靠性高,性能降低
- 2-3个
- 数据量
- 100万日活 100条 1k 每天一亿条
- 一亿条/(24h*3600s)=1150条/s
- 1m/s
- 7-12点 20m/s-50m/s
- 数据保存多久
- 7-3天
- 磁盘空间
- 100g2个副本3天/0.7
- 分区
- 提高并发度
- 先设置一个
- 生产者峰值生产速率tp、消费者峰值消费速率tc
- 期望的吞吐量t
- 期望的吞吐量t 100m/s 分区数=t/min(tp,tc)
- 100/20= 5个分区
- 提高并发度
- 分区分配策略
- range 默认
- 统一发生数据倾斜
- roundrobin
- 采用hash方式打散,再采用轮询的方式执行
- range 默认
- isr
- 解决leader挂了谁当老大
- 延迟时间
- 旧版本:采用延迟时间、延迟条数
- 新版本:采用延迟时间
- 延迟时间
- 解决leader挂了谁当老大
- topic合适
- 满足下一级所有消费者
挂了
- 短期flume channel缓冲数据
- 长期:日志服务器保留30天日志
丢了
- ack
- 0 发过来数据,不需要应答
- 可靠性最差,传输性能最好
- 1 发过来数据,leader应答
- 可靠性一般,传输性一般
- -1 发过来数据,leader和follower共同应答
- ……
- 0 发过来数据,不需要应答
重复了
- 事务、幂等性+ack=-1
- 幂等性
- 单分区单会话内数据不重复
- 关闭就重启
- 利用id判断重复
- 效率低
- 单分区单会话内数据不重复
- 事务
- 同步,效率低
- 幂等性
- 下一级处理
积压了
- 增加分区,增加消费者对应cpu核数
- 1个cpu两个线程,消费两个分区
- 增加消费者batchsize
- 日志是1k,1000条/s
- 提高消费速度
- 日志是1k,1000条/s
优化
- 日志保存3天
- 两个副本
- 增加通信延迟
- 减少重传
- 内存
- 默认1G,不要超过6G
高效读写
- 是集群、分区
- 顺序读写600m/s 随机速写100m/s
- 零拷贝
- 内存到内核,内核到内存
传输了一条2m日志文件
- 卡顿现象
- 调整最大字节数
过期数据清理
- 删除或者压缩
数据是否有序
- 单分区有序,多分区分区与分区间无序
hive
组成
- 元数据
- 多人开发 mysql
- 客户端
- 4个器 编译器、解析器、优化器、执行器
sql变换- mapreduce
- hdfs
- mapreduce
- 4个器 编译器、解析器、优化器、执行器
与mysql区别
- hive
- 大数据
- 数据量大快
- 海量数据查询
- 数据量大快
- 大数据
- mysql
- 小数据
- 数据量小块
- 小数据量查询
- 数据量小块
- 小数据
内部表和外部表
- 内部表
- 删除数据:元数据、原始数据
- 外部表
- 删除数据:元数据
- 企业中,临时使用创建内部表,绝大多数外部表
4个by
- order by
- 全局排序 (数据倾斜)
- 很少使用
- 全局排序 (数据倾斜)
- sort by
- 排序
- depart by
- 分区
- 企业一般分区+排序
- 分区
- class by
- sort by+depart by
系统函数
- date_add
- date_sub
- next_day
- last_day
- get_json_object
- last_day
- next_day
- date_sub
自定义函数
- 自定义UDF函数
- 1进1出 一行
- 定义类,继承UDF,重写evaluate方法
- 1进1出 一行
- 自定义UDTF函数
- 多进多出 一进多出
- 定义类继承G…UDTF,重写里面3个方法初始化(定义名称、校验返回值类型)、close process
- 打包+上传HDFS=》在hive客户端创建
- 定义类继承G…UDTF,重写里面3个方法初始化(定义名称、校验返回值类型)、close process
- 多进多出 一进多出
窗口函数
- rank
- over
- topn
优化
- mapjoin 默认打开,不要关闭
- 行列过滤 join where=》where join
- 分区
- 小文件
数仓
采集通道
- 前端埋点产生日志行为数据logfile
- flume
- kafka
- flume/java
- hdfs
- flume/java
- kafka
- flume
- 后台产生的业务数据mysq
- sqoop/datax/kettle
- hdfs
- sqoop/datax/kettle
数仓建模
- hdfs
- hive、spark
数据分析
- 即时查询 kylin、prosto
可视化
- superset
输出
- 报表系统、用户画像、推荐系统
权限管理
元数据管理:atlas
数据质量
- shell griffin