大数据面试题库
2024-12-09 16:21:51 12 举报
大数据面试题库
作者其他创作
大纲/内容
Hive
基于hadoop的数据分析工具 只有使用数据 没有存储数据能力 存储是HDFS 计算MR 将数据披一层SQL的外层 我们尽管写SQL 就能操作数据
分区分桶
分区是将数据 根据数据的某个字段进行一个数据路径分区 主要思想就是分而治之 将大文件拆分多个小文件 减少查找数据的扫描量 底层是HDFS存储 文件太大存到一半 集群崩了 白存了
分桶是解决分区的一种优化方案 因为分区根据某个字段分 容易出现数据倾斜而分桶是根据数据的hash值对桶数取余 数据倾斜较小
开启分桶:INTO 分桶数 BUCKETS
数据倾斜
hive底层是MR计算引擎 所以当reduce阶段 shuflle的时候呢 存储数据不均匀造成数据倾斜
定位原因 如果是压缩引发的采用分割的压缩算法 null值不需要的情况先过滤 需要的话就+随机盐 join产生的问题就预先聚合 增加桶数
Orc和Parquet
两个都是hive的存储方式 只是分别应用的场景不同 ORC是Hadoop生态系统面向列的 与Hadoop环境中大多数框架兼容 性能高 读和写速度快 Parquet适合嵌套数据结构 兼容性更强
数据建模模型
ER模型和维度建模 ER模型遵循三范式 维度建模遵循以分析决策设计表
星形模型
一个事实表和多个维度表进行关联 多个维度集成到一个事实表中 大宽表一般都是事实表 包含了维度关联的主键和一些度量信息 维度表是事实表中维度具体的信息 一般join来组合数据 分析比较方便
雪花模型
基于星形模型基础上 维度表又跟维度表相关联 间接连接到事实表 通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能,去除了数据冗余 但操作复杂
星座模型
多个事实表连接一个维度表 不同事实表共享维度信息 常用于数据关系更复杂的场景
数仓分层
空间换时间 复杂问题简单化 一般分五层 ODS数据原始层-->将数据进行Json数据的预处理 DWD数据明细层--> 将ODS经过ETL清洗过滤 装载到此层 DWS数据设计层-->将DIM层的维度表跟DWD事实表Join所形成的宽表 ADS数据服务层--> 这一层的数据一般可以视图展示了
Hive优化
设计好的模型事半功倍 合理的分区分桶减少数据倾斜 设置合理的MR的task数 优化存储数据块 挑选合适的数据存储方式
SQL优化
谓词下推 投影下推 常量折叠 分区裁剪
Join优化
小表join大表 小表join小表
先将小表读进内存 然后在map阶段进行一个表匹配
小表放不了内存
使用桶的map join
大表join大表
SMB是基于桶的map join 的有序桶
Skew Join
先将产生数据倾斜的key单独使用mapJoin 其它的使用reduceJoin来实现 最后进行一个合并
推测执行
利用更多的资源换取时间 空间换时间
并行执行
当Stage之间没有依赖关系时 我们可以进行并行执行
常见开窗函数
滑动窗口
ROW BETWEEN UNBOUND PRECEDING AND CURRENT ROW
取值型窗口
LAG() 往前第几行默认什么代替 LEAG() 往后第几行 默认什么代替 First_VALUE() 取窗口中第一个值 Last_VALUE()取窗口中最后一个值
分析型窗口
rank 间断 disRank 不间断 row_number 不间断 不重复
小文件解决方案
小文件过多会造成HDFS的namenode元数据特别多 占用太多内存 影响性能 对于MR来说消耗资源 一个文件一个map任务
Sequence File
二进制存储 存储方式行存储 可分割 可压缩 作为中间存储格式 将大量小文件存到一个文件中 kv形式
concatenate
自动合并小文件 或 调整参数减少map数量 和 reduce数量
CombinerFileInputFormat
将多个小文件合并成一个切片
archive
归档工具 将多个小文件打包成一个har文件 减少元数据同时 仍然可以透明的访问 缺点一旦创建不能改变 需要重新创建一个har文件
union
合并操作
hive的排序以及区别
orderBy
全局排序 在一个Reduce排序 数据越多 效率越低
sortBy
内部排序 每一个Reduce内部产生排序文件 进行排序
distinctBy
控制map数据如何拆分到reduce端
clusterBy
具有distinctBy和sortBy的功能 只能顺序排 不能倒排
压缩格式区别:
压缩技术能够有效减少存储系统的读写字节数,提高网络带宽和磁盘空间的效率 运用得当能提高性能,但运用不当也可能降低性能
数据来源:bzip LZO (用压缩并且选择支持分片的压缩方式)
数据计算:LZO LZ4 Snappy(压缩/解压速度快 支持Hadoop Native库)
自定义函数
UDF
一对一
UDAF
聚合函数
UDTF
行转列
Hive的元数据存储在哪里?它的作用是什么?
元数据库(Mysql)
通过元数据、Hive可以将SQL查询转化为底层存储引擎可以理解的任务,并提供了查询性能优化的关键信息
如何加载数据到hive表中
数据位于本地系统
LOAD DATA
LOAD DATA INPATH
使用外部表
LOCATION
使用ETL工具
INSERT INTO TABLE
什么是Hive的ACID事务支持?如何配置和使用它?
提供数据库的事务的支持
配置
1.修改hive-site.xml文件
2.创建ACID表
需要使用支持ACID的存储格式,如ORC或Parquet
3.开始事务
使用BEGIN TRANSACTION语句来开始一个新的事务
4.执行事务操作
执行INSERT、UPDATE和DELETE等数据操作
5.提交或回滚事务
使用COMMIT语句来提交事务,或使用ROLLBACK语句来回滚事务
6.配置并发性
Spark
内存分布式的计算框架 可以解决大数据领域的各种计算任务
与Flink的区别
共同点
都是基于内存计算 都有SQLAPI 都是完善的容错机制 都有Exactly Once一致性
不同点
流的处理角度
Spark是准实时的 微批次处理 延迟性只能到达秒级 只支持基于时间的窗口 Flink是一有新数据就处理 真正的流式计算,支持毫秒级计算 基于时间驱动 基于数量驱动
迭代角度
Spark对机器学习的支持很好 可以在内存中缓存中间计算结果来加速机器学习算法的运行 但大部分机器学习算法是一个有环的数据流 Spark却用无环图来表示 Flink支持在运行时间中的有环数据流 更有效的对机器学习算法进行运算
架构角度
Spark的架构Master、Worker、Driver、Executor Flink的架构Jobmanager、Taskmanager 和 Slot
RDD序列化
原因是Job产生的任务会并行在 Executor去执行(算子内)但有些操作会在 Driver端执行(算子外) 算子内可能会用到算子外的数据
extends Serializable 序列化-->Java的序列化器 缺点-->Java的序列化能够序列化任何的类。但是比较重(字节多),序列化后,对象的提交也比较大 性能低
Kryo 序列化-->Spark2.0开始支持一种 Kryo序列化机制 速度是Serializable的 10 倍 当RDD在 Shuffle 数据的时候 简单数据类型 数组和字符串类型已经在 Spark内部使用Kryo来序列化 注意:即使使用 Kryo 序列化,也要继承 Serializable 接口
持久化
cache
保存到内存 效率高 数据不安全容易丢失 懒执行
persist
保存到磁盘(临时文件,作业结束后会删除),效率低,数据安全 懒执行
checkpoint
保存到磁盘 永久保存 HDFS,效率低,数据安全 可以切断RDD的依赖关系
依赖关系
RDD之间的依赖关系 避免重复计算 提高容错效率,如果有一个分区数据丢失,只需要从父 RDD 的对应 1 个分区重新计算即可
宽依赖
RDD 与 RDD 一对多 (会有Shuffle的产生) 会等所有分区都执行完毕 就开始 继承ShuffleDependency
窄依赖
RDD 与 RDD 一对一 关系 所以无需等待其它分区数据 即可继续往下执行 继承NarrowDependency
任务划分
任务划分就是靠宽窄依赖来划分的任务stage用的 遇到宽依赖就切割stage就是产生Shuffle Stage里面的Task的数量 是由 Stage中最后一个RDD的Partition数量决定的 最后一个Stage任务类型时 ResultTask 其它都是ShuffleMapStageTask
一个Application有多个Job 遇到行动算子 就触发一个Job 一个Job有多个Stage阶段 是由DAG有向无环图划分的 一个Stage阶段 有很多Task 数量是否分区决定 由TaskScheduler分配Task到对应阶段
累加器
Driver端声明了一个变量 所有Task需要修改这个变量 但是修改的只是Task自己内部的 修改不了Driver端 累加器作用就是修改Task变量 能影响到 Driver端的全局变量
广播变量
Driver端声明的变量 序列化传输到 Excutor中Task中 每一个Task都有这么一个变量 数据量太大 就会占用大量的Excutor的内存空间 广播变量作用就是Excutor端只会存储一份该数据提供多个Task使用 防止数据被修改 所以是只读变量
shuffle
大数据分而治之 多个节点都跑着任务 任务中间可能会进行一些 汇聚 数据打散重组等操作 中间过程是Shuffle 一个节点任务之间产生Shuffle只会产生磁盘I/O 多个节点任务之间之间产生Shuffle会产生网络 I/O和磁盘I/O Shuffle可能会产生数据倾斜
Hash Shuffle
不要求数据有序 将数据Partition 好,并持久化形成一个 ShuffleBlockFile 持久化减少内存存储空间压力,另一方面也是为了容错性
Sort Shuffle
引入了MR的shuffle机制 将所有的 Task 结果写入同一个文件,并且对应生成一个索引文件 只需要根据索引找文件
Tungsten Sort Shuffle
是对Sort Shuffle一种策略的实现
数据倾斜
key分布不均匀 导致shuffle的时候 一个节点负载过重 一旦数据倾斜就会就可能产生 网路I/O 磁盘I/O 硬件故障 内存过度
使用HiveETL预处理 过滤少数导致倾斜的key 提高shuffle操作的并行度 双重聚合 将reducejoin 转为 mapjoin 采样倾斜key并分析join操作 使用随机盐和扩容RDD进行join
调优
资源调优
在部署spark集群中指定资源分配的默认参数(尽量给当前的应用分配更多的资源)
代码调优
避免创建重复的RDD 对多次使用的RDD进行持久化 提前预聚合shuffle的操作 尽量使用高性能的算子 使用广播变量 使用Kryo优化序列化性能 优化数据结构
内存调优
调节Executor的堆外内存
并行度调优
可以降低资源浪费 提高spark任务的运行效率 task数量应该设置为sparkCPUcores的2-3倍 数据在HDFS中,降低block大小,提高RDD中partition数
RDD、DataFrame、DateSet之间的区别
用于处理结构化数据的模块 无论使用哪种方式 或 语言 执行引擎都是相同的 开发人员可以轻松地在不同的 API 之间来回切换 使数据处理更加地灵活
RDD
是Spark的基本数据结构 允许程序员以容错方式 在大型集群上执行内存计算 表结构类似于 没有字段名 并且只有一个字段 而且没分开
DataFrame(弱类型)
封装了RDD 只关心要做什么,而不用关心怎么去做,将一些优化的工作交由 Spark 框架本身去处理 表结构类似于 将RDD的数据炸开 然后每个数据都有对应的字段名 行转列
DateSet(强类型)
封装了DataFrame 具有RDD的优点(强类型 ) 支持强大的Lammsba函数 具有很多类型转换 以及 SparkSQL的优化执行引擎的优点 表结构类似于 将DataFrame列转行 并且有字段名
提交参数
Driver的核心数3~5 以及内存数量512M Executor的数量2 内存1G 核心数1
五大属性
分区列表 分区计算函数 血缘 RDD存储结构 计算向数据靠拢
spark如何保证宕机迅速恢复
适当增加spark standby master
编写脚本 定期检查master状态 出现宕机后对master 进行重启操作
reduceByKey和groupBykey的区别
都会产生shuffle reduceBykey的话他会分组+聚合 并且每个区内预聚合 减少shuffle的落盘量 groupBykey只能分组要聚合的话你得配合sum使用 数据量不会减少
如何解决HashShuffle时在map端产生的小文件
conslidate
根据CPU的数量来决定的 部分减少了文件和文件句柄 并行度很高的情况下还是会产生很多小文件
优化前是 T*R 优化后C*R
统一内存管理
90%
task计算
shuffle聚合
解压 反解压 序列化 反序列化
RDD的持久化和广播变量
预留10% 防止OOM溢出
Kafka
高吞吐量的分布式消息订阅系统 可以处理消费者流数据 支持离线和实时数据处理 每秒能达到100条消息传输 Kafka是无序的 只有一个partition内顺序读写
架构
1.生产者:将产生的消息存放到对应的Topic消息根据分区规则存放到不同的Partiton,然后同步到Replication
2.offest:唯一的标识一条消息 一个消息只能被一个组消费一次 一个组记录当前Topic消息消费的进度
3.topic:生产者发送的消息类别称为主题
4.partition:主题中的数据会被切分为至少一个或多个Partiton 每个分区中数据插入有序,新增的数据都会分配到队列尾部
5.replication:每一个分区都拥有副本保证数据的安全 Partiton为了数据的读写 Replication为了数据的备份,没有读取功能
6.consumer:消费者就是从Topic读取数据 消费者组一组共享一个Topic的偏移量 一个消费者组内包含一个或者多个消费者 不同的组可以同时消费相同的Topic
7.zookeeper:存储KafaKa的元数据信息 帮助进行Leader的选举
8.broker:Kafaka集群的每一个服务器都叫Broker
2.offest:唯一的标识一条消息 一个消息只能被一个组消费一次 一个组记录当前Topic消息消费的进度
3.topic:生产者发送的消息类别称为主题
4.partition:主题中的数据会被切分为至少一个或多个Partiton 每个分区中数据插入有序,新增的数据都会分配到队列尾部
5.replication:每一个分区都拥有副本保证数据的安全 Partiton为了数据的读写 Replication为了数据的备份,没有读取功能
6.consumer:消费者就是从Topic读取数据 消费者组一组共享一个Topic的偏移量 一个消费者组内包含一个或者多个消费者 不同的组可以同时消费相同的Topic
7.zookeeper:存储KafaKa的元数据信息 帮助进行Leader的选举
8.broker:Kafaka集群的每一个服务器都叫Broker
数据不重复
幂等性
核心就是引入了生产者id 和 sequence number 新的生产者初始化的时候都会被分配一个PID,这个PID对用户而言是完全透明的 对于每个PID,消息发送到的每一个分区都有对应的序列号,这些序列号从0开始单调递增 生产者每发送一条消息就会将对应的序列号的值加1 broker端会在内存中维护一个序列号 新的+1比旧的大 broker接收 新的比旧的超过2 broker报错 新的比旧的小 broker不接收
事务性
事务主要是为了解决幂等性无法跨Partition运作的问题,事务性提供了多个Partition写入的原子性 允许应用可以把消费和生产的 batch 处理 多个分区 要么全部成功 要么全部失败
分区分配策略
RangeAssignor(默认):以一个主题为单位 均匀分配 多的 前面的往下多分一个区 一个组分配的区时连续的 缺点-->如果每个主题刚好都多一个 那么每次都是第一个消费者都会多分配一个 主题越多就会出现部分消费者过载的情况
RoundRobinASSignor:将所有消费者 以及 订阅的所有消费主题 按照字典序排序 然后轮询分配 相对均匀 差值不超过1 订阅多个主题相对数据比较混乱 适合单个主题
Sticky粘性的:均匀 不变 订阅哪些主题 消费哪些 进可能保持均匀
数据不丢失ACK机制 精准一次消费
当数据到Partition后 Partition返回ACK给Producer Producer接收到ACK确定后发送下一条 否则返回重新发送
0-->最多一条:producer无需等待Partiton返回ACK结果 直接发送第二条 Broker故障丢失数据 1-->只有一条:Partition分区接收到数据 写到本地log 返回ACK结果 Follower同步的时候 leader故障 丢失数据 -1-->最少一条:Partition分区接收数据 写到本地log 广播 所有Follower都同步了 才返回ACK结果 安全 效率低
使用最少一次+幂等性+事务+架构 = 保证数据精准一次消费
高吞吐的本质
文件存储设计特点
Kafka把topic中一个Parition大文件分成多个小文件segment,通过多个小文件segment,就容易定期清除或删除已经消费完的文件,减少磁盘占用。 为了进一步的查询优化,Kafka默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。索引文件通过稀疏存储,降低index文件元数据占用的空间大小 针对数据压缩 新增的二级对数索引
顺序写入
为了提高读写硬盘的速度,Kafka使用顺序I/O 收到消息后Kafka会把数据插入到文件末尾,每个消费者对每个Topic都有一个offset用来表示读取的进度
pageCache
操作系统实现的一种主要的磁盘缓存,以此用来减少对磁盘I/O的操作 就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问 内存作为磁盘缓存,甚至会将所有可用的内存用途磁盘缓存,这样当内存回收时也几乎没有性能损失,所有对于磁盘的读写也将经由统一的缓存
零拷贝
基于sendfile实现零拷贝,数据不需要在应用程序做业务处理,仅仅是从一个DMA设备传输到另一个DMA设备。此时数据只需要复制到内核态,用户态不需要复制数据,然后发送网卡
为什么快
pageCache
操作系统实现的一种主要的磁盘缓存,以此用来减少对磁盘I/O的操作 就是把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问 内存作为磁盘缓存,甚至会将所有可用的内存用途磁盘缓存,这样当内存回收时也几乎没有性能损失,所有对于磁盘的读写也将经由统一的缓存
零拷贝
基于sendfile实现零拷贝,数据不需要在应用程序做业务处理,仅仅是从一个DMA设备传输到另一个DMA设备。此时数据只需要复制到内核态,用户态不需要复制数据,然后发送网卡
框架中kafka起到了什么作用 不用kafka有什么影响
会把消息持久到磁盘 有效避免消息丢失的风险
对生产者和消费者的一个解耦 并且中间做了一个缓冲解决了生产者与消费者处理速度不一致的问题
影响
不能保证消息的有序性
实时的消息易丢失 没有kafka做削峰 会造成数据堵塞
kafka消息数据积压 kafka消费能力不足怎么办?
如果是处理速度及时 必须 消费者数=分区数
如果是处理速度不及时 提高每批次拉取的数量
kafka挂掉原因以及怎么恢复
硬件故障
恢复
软件故障
通过查看日志是否有错误消息
资源耗尽
增加硬件
数据损坏
通过备份恢复数据
监控系统
通过监控系统及时发现问题 以及解决
生产者端的Request流程,消息打批之后发出?
当batch大小达到了闻值(batch.size) 或batch积累消息的时间超过了linger.ms时batch被视为“已完成或"准备就绪”。batch.size和inger.ms都是Producer端的参数。batch.size默认值是16KB,而linger.ms默认值是0毫秒。一旦达到了batch.size值或越过了linger.ms时间,系统就会立即发送batch。
上下游切换
允许您在Kafka中建立一个灵活的消息管道,将数据从一个主题传递到另一个主题,并进行任何必要的数据转换和处理
业务数据如何在kafka存储的
单表单主题
一个分区
数据主键分区
多表单主题
根据主键
根据表名的hash去传递
Flink
流批一体 所有流式计算场景 正确性保证 分层API 聚集运维 大规模计算 性能卓越
水位线
是度量事件时间的 解决分布式环境下网络延迟 背压造成数据乱序的
周期型
周期型会不停的发射水位线 去尝试触发触发器 触发成功窗口结束计算
有序
数据按照生成的顺序进入流中 水位线就是自增的 但一对一消耗资源 所以我们周期内取最后一条作为当前窗口水位线
无序
正常情况 数据都是乱序进入流中的 所以我们找周期内最大的那个时间戳作为水位线
定点型
在事件触发的方法中发出水位线 定点生成器会不停的检测OnEvent()中的事件 当发现带有水位线信息的特殊事件时 才发出水位线
延迟数据处理
对于延迟到的数据我们可以用水位线延迟时间 但是延迟太久会影响实时性和效率
lateness
允许窗口延长关闭 正常情况窗口触发完成计算之后就会销毁 但是他会等延迟时间到达之后会再次触发窗口计算 窗口时间+水位线时间=计算第一次 计算第一次结果+延迟时间=计算第二次
测容器
保证消费一次如果迟到数据还没到 为了保证数据至少一次 创建侧输出库 让迟到数据存储到侧输出库 通过测输出流输出 必须是迟到数据
精准一次消费
source端
能够进行重复消费 将偏移量记录在State中 与下游的算子一起 经过checkPoint机制 实现快照统一 我们只能说事件发生多次 我们只能反映一次给状态后端一次 有效一次
least+去重
每个算子维护一个事务日志 跟踪已处理事件 重放失败事件 在进入下一个算子之前 删除重复事件
least+幂等
依赖sink端存储的去重性 和 数据特性 实现简单 开销较低 缺点依赖存储和数据特性太强
分布式快照
转换
基于分布式快照算法 实现了整个数据流中各算子的状态数据快照统一
sink端
数据不能重复 采用幂等写入方式任意多次向一个系统写入相同数据,只对目标系统产生一次结果影响 结合事务和 checkPoint机制 保证只对外输出保证一次影响
预写日志
不支持事务的存储系统 使用预写日志 不能百分百精确一次 它有二次确认 当数据成功写入 会再次确认相应的检查点 需要将二次确认持久化 用于后面的故障恢复 有确认消息才能保证数据成功 缺点就是二次确认 检查点和写入都成功 确认消息失败 会导致重复写入
两阶段提交
第一阶段消费数据时 协调者向所有参与者发起是否可以执行预提交操作,等待所有参与者的响应 所有参与者执行事务操作 存储checkPoint并持久化 如果参数者事务操作执行成功 对协调者返回同意 反之 返回终止 第二阶段 协调者获取到所有消息 都是同意才发出提交请求 参与者完成操作 释放事务期间占用的资源 向协调者发送事务完成消息 协调者反馈消息 完成事务 如果一个失败或超时了发出回滚请求 参与者进行最近的checkPoint回滚 释放事务期间占用的资源 向协调者发送回滚完成消息 协调者反馈消息 取消事务
窗口机制
1.首先是否分组 分组每个组达到要求才能显示 不分组只有一条主流 主流达到要求进行显示
2.windowAssigner:分配器类型-->定义如何将数据流分配到一个或多个窗口 基于时间的滑动 滚动 会话 基于计数的滚动 滑动
3.Trigger:指定触发器类型-->满足什么样的条件触发计算 触发时机 每一个窗口分配器都有一个默认的触发器
4.Evictor:数据剔除器 在触发器触发之后 窗口函数使用之前或之后 从窗口中清除元素
5.Lateness:时延设定-->是否处理迟到数据,当迟到数据达到窗口是否触发计算
6.OutPut:输出标签-->通过getSideOutput将窗口中的数据根据标签输出
7.window Funtion:窗口上处理逻辑 增量 全量聚合
2.windowAssigner:分配器类型-->定义如何将数据流分配到一个或多个窗口 基于时间的滑动 滚动 会话 基于计数的滚动 滑动
3.Trigger:指定触发器类型-->满足什么样的条件触发计算 触发时机 每一个窗口分配器都有一个默认的触发器
4.Evictor:数据剔除器 在触发器触发之后 窗口函数使用之前或之后 从窗口中清除元素
5.Lateness:时延设定-->是否处理迟到数据,当迟到数据达到窗口是否触发计算
6.OutPut:输出标签-->通过getSideOutput将窗口中的数据根据标签输出
7.window Funtion:窗口上处理逻辑 增量 全量聚合
checkPoint Barrier
将数据进行分割 拍快照的 定期生成 会跟随数据一起流动 广播给下游的所有算子 当算子收到barrier 说明上一批数据已经走完 开始拍摄快照 存储到HDFS持久化 下一批数据继续传输 保证实时性
barrier对齐
等到上游所有的并行子分区barrier都到齐 才去保存当前任务的状态 缺点:先到达的分区要做缓存等待,会造成数据堆积(背压)
barrier对不齐
解决Barrier对齐 当一个barrier先到达 不用等barrier到齐 不缓存等待 继续向下走 但是这些数据都会打一个标记 然后等后面的barrier到了 然后将这些标记数据在拿到一起计算
检查点超时
原因是反压
因为CheckPoint barrier跟随普通数据一起流的 不会越过普通数据 导致端-端期间的时长边长 为了保证准确一次 多个管道就需要对齐 接收到较快的管道数据后 后面的数据就会缓存起来不处理 放到state里面 导致checkPoint变大 还有问题可能定期生成器出问题了 就是代码问题
解决办法
降低Source的并发度、拉取频率、拉取量;提高checkpoint发送频率;提高同时能够进行的checkpoint数量;提高checkpoint超时时间;启用非对齐checkpoint
双流Join
join
先将数据缓存在state中 当窗口触发计算时进行join操作 为了满足流处理的实时性要求(等待所有参与join的事件到达后再进行处理) 也为了实现容错性(将状态持久化到可靠存储系统中)
CoGroup
除了输出匹配的元素对以外,未能匹配的元素也会输出 谁调的方法 谁就是左表
Interval Join
基于一个上界开区间 下界闭区间 在此范围的就可以做连接 数据必须先keyby才能进行连接
状态
类似于有点Spark的RDD的血缘 程序出错 我们如果从头开始计算 效率低 没有时效了 有这个状态之后 Flink只需要获取到上一步的状态 重新计算即可 状态分有状态无状态 无状态就是算子用不到状态 有状态就是需要用到历史数据做计算的 状态一般都是Flink运行时帮我们管理 序列化 故障恢复等都实现好了 也可以自己管理 自己开闭一个内存空间 但是太麻烦了 状态又分为算子状态 和 键分区状态 算子状态是可以用于所有算子 一个并行度一个状态对应一个槽 就是说当前并行度的算子共享一个状态 键分区状态 只能用于分区算子 相同的key共享一个状态 但是一个槽里面可能有多个key 状态可以存在内存 文件 RockDB 或者 远端持久化到HDFS 状态存太久了 也太浪费资源 所以状态的TTL就是来管理它过期如何处理 怎么过期 等等
反压是什么
生产数据的速率比Task消费速率快 反压传播是从下游到上游传播 反压是流处理系统中用来保障应用可靠性的一个重要机制 上游处理单元降低数据发送的速率,以缓解下游处理单元的压力 反压会造成检查点时长拉长 变大 反压可以静态反压 动态反压 静态反压就是自己调参数 缺点就是调大还是会有压力 调小有效利用资源 基本都是动态反压 消费者动态告诉生产者处理能力 处理的条数Spark 缓冲区剩余空间 反压流程是1.5以前是将你的资源全部堵塞 资源耗尽才会停止发送数据 问题就是Socket阻塞的问题 导致其它的任务也无法发送任务 1.5以后呢就是上游会给下游发送一个消息 告诉下游这次要发送多少条 下游会根据条数申请足够的资源 如果下游资源不够 就会发送一个消息返回0 上游就会停止发送任务 不会堵塞每个阶层 提高了socket的复用性
解决反压
通过WebUI界面点开算子右边 backPressure看反压
解决
Metrics 配置
也可以通过WebUI定位到第一个黑色节点的位置 但是由于可能该节点的瓶颈可能不会高反压 但是导致上游节点反压 如果不是第一个 就是紧接的下游节点 系统资源问题CPU 网络 磁盘I/O-->优化代码 增加并发和机器 GC垃圾回收问题-->性能问题常常源自过长的GC时长 可以通过打印日志 或者 使用分析GC的工具 CPU瓶颈或者线程争用-->使用代码分析工具来定位热点线程 CPU分析工具对于探查这类问题也很有用 负载不均-->瓶颈是数据倾斜造成的,可以尝试删除倾斜数据 改变数据分区策略将造成数据的key值拆分 也可以进行本地聚合/预聚合
Flink优化
资源调优
设置参数的时候内存调大 然后并行度也可以设置 测试出高压力下单并行度的处理上限 然后使用你这次任务需要用到多少QPS/单并行度=并行度条数了
并行度调优
source端的并行度一般跟数据源的并行度保持一致 转换端分组前与source保持 分组后并行度*2 防止数据倾斜 sink端并行度要与下游的抗压决定
状态后端
多使用RockDB 基于LSMTree 有长窗口 可以存储较大的数量(2G) 可以进行增量检查点
多使用ParameterTool工具 是可以序列化的 可以读取外部配置 作为参数传递
看反压 资源利用率 关键指标 检查点时长 GC等等
flink的内存管理是如何做的
堆上内存
分配给Java 由java的垃圾回收来管理 存储用户定义的状态 数据结构 和 操作符状态 flink的内存管理器会为每个算子分配内存 回收内存
堆外内存
JVM之外的内存的 存储大量的数据 减轻JVM内存的压力 如RockDB的数据
内存分配策略
静态分配和分段内存分配
内存管理监控和调优
提供了监控API 用于监控内存的性能和指标 有助于识别内存问题
Flink的分布式缓存
允许将外部文件或数据加载 到任务中 方便访问
通过getRumTimeContext.getCache放到每个taskManager中
通过getRumTimeContext.getDistributedCache().getFile()访问缓存中的数据
缓存数据不会自动清理 只能手动清理
使用广播变量的注意事项
数据要足够小
适应TaskManager内存 不然会导致内存不足的问题
适用场景
适合静态变量 不适合变化特别快的数据
性能影响
避免广播大数据集 广播的数据需要序列化 需要性能开销
资源管理
需要调大TaskManager内存
测试和监控
使用广播变量之前 进行充分的测试和性能评估 以便在程序中不会造成影响
在使用window时 出现数据倾斜 怎么解决
不同的窗口内积攒的数据量不同 数据的产生速度导致的
解决
重新设计Key 在窗口计算前预聚合
flink的并行度有了解嘛 哪几种级别
配置文件级别
fink.conf.yml
执行环境级别
setParallism()设置在方法后面设置 默认环境内所有都是此配置
算子级别
通过setParallism()定义单个算子
代码运行时
通过在linux上面执行任务时 设置的并行度
数据倾斜
通过webUI定位到多个task的subTask判断是否倾斜 如果某个subTask接收数据量大于其它的 基本数据倾斜了
解决
keyBy后造成的数据倾斜
先通过状态进行一个进行一个搜集 存入状态 进行一个聚合 然后在发送下去
keyBy 之前发生数据倾斜
使用其它的重新分区函数
keyBy 后的窗口聚合操作存在数据倾斜
key拼接随机数前缀或后缀,进行keyby、开窗、聚合
Flink如何做压测
主要测:吞吐量、延迟、稳定性。
1.明确定义性能指标和目标
2.数据贴合真实数据
把前几天的历史数据拿出来跑
3.如果没有达到理想状态 开始调优
4.开始测试 然后测试出吞吐量、延迟、稳定性
5.持续监控
监控工具和日志记录来及时发现和解决性能问题
6.负载测试
增加负载,模拟高负载情况下的性能表现
7.文档和报告
记录测试结果和性能优化的措施,并生成性能测试报告
FlinkCDC
是一种用于捕获和处理数据库变化的技术,将数据库变化以流的形式提供给Flink应用程序
ClickHouse
优点
列式存储数据库 快 线性扩展 高可靠性 简单方便 功能多 采用LSM Tree 的结构 定期合并 定期删除历史数据 数据导入时全部是顺序 append 写 数据压缩 磁盘存储数据 多核并处理 SQL支持 向量化引擎 实时数据更新 支持近似计算 数据复制和对数据完整性的支持
缺点
CPU瓶颈 不支持高并发 不适合Join操作 事务不全 缺少、仅批量删除或修改数据 聚合结果必须小于一台机器的内存大小 不适合Key-value存储,不支持Blob等文档型数据库 支持有限操作系统
项目中常见引擎
接口类型
merge-->主要用于将多张表进行异步查询 最终合成一个结果集返回 要求要在同一个数据库内 相同表结构 引擎可以不同
日志类型
Log-->由数据文件 元数据文件 数据标记组成
内存类型
将全量数据放入内存中 memory引擎-->直接将数据放在内存中 不压缩 不会格式转换 重启数据丢失
set引擎-->去重 先写入内存 在写入磁盘 Join引擎-->连接表
外部存储
从其它存储系统读取数据 HDFS JDBC Kafka Mysql
常见变种引擎
repliacing
覆盖
summing
单维聚合
aggregating
多维聚合
collasping
以增代删
versionedCollasping
加强版以增代删
为什么快
单条查询就能利用整机的CPU 竭尽所能榨干硬件能力,提升查询速度
是列式存储数据库
CH是自底向上的、追求极致性能的设计思路
着眼硬件,先想后做-->group by 都是在内存进行 使用hashtable装载数据
算法选择是性能首要考量指标:对于常量使用 Volnitsky(字符串搜索算法) 对于非常量使用 CPU 的向量化执行 SIMD(一个控制器来控制多个处理器)暴力优化;正则匹配使用 re2(一切从简) 和hyperscan 算法(自动机理论为基础 分为编译器和运行期) 而且一有新算法 尝试性能不错 直接换
不断测试 不断的优化 实验得结果
ClickHouse具有智能的内存管理机制,可以有效地管理内存资源
并发量
因为CH单条查询就能利用整机的CPU 当单个查询比较短时,建议100QPS 不支持高并发
Redis
局限性
受到物理内存的限制,不能用作海量数据的高性能读写
AOF和RDB
RDB
快照,指定时间间隔内将数据保存到一个二进制文件中
AOF
日志文件,Redis以追加方式记录到AOF文件中
优缺点
AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据
AOF 比 RDB 更安全也更大
RDB 性能比 AOF 好
为什么要用 Redis 而不用 map/guava 做缓存?
Map/Guava是本地缓存 每个实列各自保存一份缓存
Redis是分布式缓存 具有一致性 各实列共有一份缓存
Redis 为什么这么快
完全基于内存
数据结构简单
单线程 没有多线程的CPU堵塞 上下切换 锁的烦恼
使用非阻塞I/O
Redis 的内存用完了会发生什么?
写命令会返回错误的消息 读不影响 如果配置的淘汰机制 会冲刷掉旧的内容
Redis 如何做内存优化?
使用散列表存储 使用的内存非常小
Redis事务
Redis事务不完全
带有隔离性、不保证原子性,且没有回滚
什么是缓存预热
初始化Redis数据
Redis的缓存相关问题
击穿
高并发情况下 某个热点key过期或删除 多个请求同时访问数据库 导致数据库负载激增
解决
互斥锁来控制并发访问
使用布隆过滤器
穿透
恶意攻击者故意发送不存在于缓存中的请求、以观察系统的行为或引发数据库的负载增加
解决
过滤器 过滤掉不存在的数据
雪崩
某个时间点 大量热点key过期或失效 导致大量请求直接访问后端存储系统
解决
设置缓存键的失效时间
Flume
Flume组件有哪些 ,怎么使用的?
source
负责接收event
常用tailDir
断点续传
channel
负责缓存event
KafkaChannel
减少sink阶段,提高效率
sink
负责输出event
avroSink
批次传输
tailDir可以断点续传嘛?
通过记录偏移量,允许在传输中断后恢复传输而不必重新开始
可以
Flume 采集数据会丢失吗?
不会,Channel 存储可以存储在 File 中,数据传输自身有事务
离线数仓
数据治理
Atlas
连续活跃区间表的实现思路
1.我们项目中做这种连续活跃使用的是维度设计原则的缓慢变化维 也就是拉链表 用它原因能方便查询任意一条在任意一天的数据 又能方便查询到整个表任意一天的全量状态 节省空间 设计思路的话就是将数据Schma增加两个字段开始时间和结束时间(结束时间设计9999) 当新数据进来的时候 我们进行一个连接 判断历史拉链表数据的结束日期为9999 并且 新增数据相同id不为空 表示该数据已经更新 就会封闭拉链表里面的数据 然后将新增的数据全部查询出来 设置开始日期 和 结束日期 在将两个查询的结果进行union 生成新的拉链表
2.当时我们也是为了尝试不同的嘛 所以我们当时也是用了BItMap位图来做连续活跃 BitMap数据结构就是0,1表示嘛 我们当时活跃了设置为1 没活跃设计为0 当时我们以一个月为周期定位的 对比拉链表的话 周期是未知的 使用拉链表合适 已知的话我们用BitMap合适点
为什么要用级联采集
1.我们项目中行为数据采集是用的FLume的级联采集 因为日志采集我们要存到hdfs和kafka里面 还要根据数据的事件时间 要写入不同的文件夹 用于后面入仓分区管理 还有就是nginx服务器所在的子网跟HDFS不在一个网段 需要中转传输 所以需要flume级联将数据传到不同的节点 更好的提高容错性 也提高了传输效率 避免单点故障 支持不同类型 当然我们当时用级联也产生了一些问题 比如数据积压 上游太快 下游接收速度太慢了 解决办法sink的主备复用
拦截器的编写思路是什么
1.我们项目中用到拦截器 主要是提取数据里面的事件时间 写入不同文件夹 用于数仓分区方便管理 减少扫描量 提高查询效率 离线做太久了 具体的思路我记不太清了 大概的思路有一点印象 好像就是重写event的方法吧 因为他是Json数据嘛 根据k获取到他value值 设置到他的header里面 就是event的tag上面 通过正则根据header写到不同的文件夹
数据零点漂移问题
1.就是说本来今天该到的数据 由于数据的延迟导致第二天到达 经过ETL处理的时候可能数据就会被 过滤掉 但是我们项目是通过拦截器提取了数据的时间 就算晚到达也只会进入同一时间的文件夹 不会进入到第二天的文件夹 数据丢失性减少了 但是会出现处理不到的现象 我们准确性要求的不是很高 丢个几百条 也不是很大问题 而且我们flume做了级联 效率提高了 数据丢失减少可能会更小
DataX在使用HDFSWriter的时候如何配置HDFS的HA
1.里面有个参数是hadoopConfig 是可以配置HA 我们平时拉取数据的datax的文件配置的都是高可用 需要配置nameservice服务 根据服务配置高可用namenode的名称 分别配置namenode的地址 在根据nameservice服务配置高可用的一个类似于驱动的参数
DataX可以做并发数据同步吗,怎么做
3.0以后提供了并发同步 核心就是将一个job拆分多个task 然后将task组装成一个taskgroup 一个taskgroup默认5个并发 然后并发执行task 主要的做法就是配置datax文件参数 在文件的头部有个设置本次任务的配置job job.setting.speed.channel设置并发量
Json数据入仓方案有哪些,怎么进行选择
1.入仓方案还是比较多吧 数据的敏感度不是特别的强 可以用市面上的ETL工具 进行一个数仓 因为ETL工具本身就有数据清洗过滤的特性 当然敏感度强的话也可以手写API 我们项目行为数据设计的是JSon数据格式 离线的话方案有spark解析 通过spark解析json文件然后写入hive中 还有就是 将整个Json看作一个字段先存入Hive表中,再通过Hive自带的函数(getJsonObject)解析再写入另一张表 最后一种是我们常用的一种 也是开发效率最高的一种 就是通过Hive兼容的Json解析器直接将Json数据解析到一张表中(Hive3.0之后提供原生的JsonSerDe) 业务数据不是JSON数据 实时的话直接通过FLink将数据转为dataBean 然后通过连接器JDBC入仓
在Spark中ETL的过程有哪些,能说说是怎么实现的吗
1.首先过滤不需要的字段 脏数据 然后将数据转为dataBean方便操作 添加几个字段 新老用户的标识 该数据的唯一ID 省市区 临时会话字符串 用于后面的使用
2.首先切分会话 按照事件时间且切割 半个小时算一个会话 根据sessionID分组 组内进行一个排序 放到集合里面 通过UUID生成一个随机时间戳 遍历集合 赋值给临时会话字符串字段 然后前面两个元素的时间戳相差大于三十 就重新生成一个UUID赋值
3.地理位置集成 通过Geohash编码 将经纬度信息转换成一个字符串 然后根据字符串去数据库里面查询对应的省市区 如果查询不到的话 就通过IP2Region工具包 将IP解析成省市 先拿到数据库的省市区 广播到excutor端 然后读取到HDFS上的Ip工具包 然后先将数据的经纬度通过GEOhash解析成字符串 去判断数据库里面是否包含 包含就获取到字符串对应的省市区 然后回补 如果没有的话 我们就是IP 通过搜索器去搜索对应ID 然后回填
4.唯一ID的话 主要就是给那些匿名登录的绑定一个id 对于后面的用户行为分析的准确性有非常大的影响 漏斗 留存等等 会先设计一张绑定评分表 评分权重的 用于给匿名用户回填哪个ID 每天来的数据就会根据评分表进行一个关联 如果今天该设备此用户登录了 我们给他百分比增加权重 没登陆百分比减少权重 将设备ID权重最大的临时账号回补给匿名用户 然后根据临时账号去reids查询对应的guid 如果存在就赋值 不存在就用设备ID查 都不在重新创建一个自增的guid
5.新老用户: 打个标记 统计当天数据之前 先获取redis里面前一天最大的guid 赋值给标记 如果今天的guid如果大于标记 说明是新用户 标记新用户
活跃、留存、流失、回流分别代表什么意思
我们项目中活跃的定义就是连续登录超过7天 表示活跃用户 留存的话就是当天注册的新用户 7天内登录了第二次表示为留存用户 流失就是三十天内没有登录表示流失用户 回流就是注册开始三十天外再次登录第二次表示回流用户
IP转地理位置信息的思路是什么
1.我们项目用的就是Github上面的Ip2Region 是一个离线IP地址定位库和IP定位数据管理框架 通过Ip查找算法先将工具包里面的每个市的开始ip和结束ip转成整数 生成一个区间 然后将数据ip转换为一个整数 通过二分查找法找到对应的区间的索引 根据索引就找到省市区了
2.还有一种方法就是高德地图API的一个插件AMap.CitySearch 可以通过IP定位获取当前城市信息 这个我们还没嵌入到项目中
什么是漏斗分析模型,有什么作用,计算思路是什么
1.形如漏斗 定义一条业务线 比如我们项目中的浏览商品 加入购物车 结算购物车 支付 完成这条业务线的每一步的人数不增只会减 我们分析每一步的转化率 作用就是如果有一步转化率太低了 我们得考虑原因 是什么显示效果 提供得功能不友好等等
2.计算思路是我们根据用户ID分组 找到这条业务线的所有事件 根据每个事件的事件时间 进行一个排序 找到每个用户在这条业务线最大的步骤的事件名称 和 最大步骤步数 在根据最大的步骤事件名称和步数 进一个分组 sum人数(开窗 排序 使用滑动窗口函数 窗口最后一行到当前行统计人数 因为现在是每个用户的最大步骤 但是走到最后一步了 决定经过了前面几步 所有我们得滑动窗口统计) 最后每步的人数 / 最大人数求出转化率
什么是事件归因分析,有什么作用,计算思路是什么
1.一个业务目标事件的达成 究竟是由哪些原因引起的 原因也分线性归因 首次触发 末次触发 时间衰减 位置归因 能够计算出每一个用户在指定目标事件上的,各待归因事件的影响大小 我们项目中主要用于点击到商品页 通过什么方式 是广告 还是轮播图 还是通过搜索 还是因为 促销活动各个原因等
2.计算思路:根据全局的唯一ID分组 然后找到所有归因的事件 根据每个事件的事件时间排序 获取到数据的唯一标识 获取到数据的目标事件和所有归因事件 放到一个元组 然后遍历归因事件 因为我们考虑的是线性归因平分权重
行转列,列转行的思路是什么
1.多行业务 描述一个业务就可以行转列 灵活性更强 像我们的事件归因使用纵表就比较方便 因为我们只需要关注一个字段里面的某一个事件 过滤掉不需要的数据 就需要行转列 缺点就是数据库数据推积众多
2.列转行的思路 一条数据就可以描述一个用户记录 数据比较清晰 像我们项目中一般DWD的表都是横表 用于多维分析 分组效率都比较快 但是扩展性比较低 如果要增加一个字段 整个表都需要重构
在生产过程中有没有碰到过什么问题
在实际生产过程中维度建模怎么做的?
1.根据阿里的分层思想来的 我们是分的五层 ODS数据原始层-->将数据进行Json数据的预处理 DWD数据明细层--> 将ODS经过ETL清洗过滤 装载到此层 DWS数据设计层-->将DIM层的维度表跟DWD事实表Join所形成的宽表 ADS数据服务层--> 这一层的数据一般可以视图展示 DIM维度层-->用于一些多维计算等等 分层主要目的还是空间换时间 复杂问题简单化
从0到1的数仓搭建怎么做?
1.根据甲方爸爸分析需求 分析行为域 业务域数据 决定数仓的建设 需要用什么技术来建仓 自下而上的设计思想 开始划分各个主题 用户主题 流量主题等等 设计原子指标 统一口径 开始梳理指标体系 整个体系同样要以业务为核心进行梳理。同时梳理每个业务过程所需的维度。维度就是观察业务的角度,指标就是衡量业务结果好坏。 然后根据指标去收集需要的数据 业务的动作 我们构建ER建模 便于后面的维度建模 维度表设计就是维度 多层维度 开始分层 什么样的层放什么样的数据 然后自下而上设计 模型建立ETL 数仓建设必须从业务中来,到业务中去 无论哪种建模方式,其核心是业务实体; 按领域建设能快速交活,后遗症将会在2年之后爆发,且难以解决 数仓建设应该把75%的时间投入到设计阶段 数仓本身也可以迭代 传统数仓并没有一种叫做“宽表模型”的模型 大数据时代新诞生的名词 因为很多大数据组件join代价极高 实际上是范式退化
数据湖
1.存储企业各种各样的元数据 结构化(表结构) 非结构化(txt,图片,音频) 半结构化(json,xml,有自己的格式)的都可以 很多人觉得数据湖就是hadoop集群 是一种存储的概念 hadoop是实现这个概念的技术 处理的好(数据洋) 处理的不好(数据洼)
数据仓库
主要处理历史的 结构化数据 数仓的指标都是产品经理提前规定好的
数据中台
前台和后台 前台就是直接与用户交互的界面Web页面 还包括实时响应的请求 搜索 订单查询 后台就是与运营人员打交道的 就是订单状态的更改 已经上架商品 下架商品 一些控制功能 让企业员工和客户和伙伴能够方便应用数据 数据中台就是连接前台和后台的
数据集市
小型数据仓库 多个数据集市组成数据仓库 每个部门的一个数据集合
数据孤岛
业务系统之间各自为政 相互独立造成的数据孤岛 举个例子 就是一个小组写代码一样 写到后面集合的时候特别难集合 可能都写这个部分 导致冲突 长时间后面 重复的越多 如果我们用gitee或者github管理系统 不断的上传 提交 看到什么没写 沟通然后写 效率 成本提高
实时项目
flink的taskManager 4G
实时连表
使用Redis进行一个不频繁变动表的缓存 减少外部表的一个交互
实时数据同步方案
kafka-flink-clickhouse的端到端一致性怎么保证
我们项目中kafka中消费数据的偏移量是记录在状态中与下游的的checkPoint存在一起的 是能够保证数据重复消费的 flink的转换是利用的状态保证恢复到未处理的状态 sink的话我们CH是事务性不强的 所以我们用的是CH中的mergetree的变种引擎replacing的去重特性 通过数据的处理时间来保留最新的时间数据 但是由于CH底层的原理 他是定期合并重复数据 所以需要无时无刻查询最新的 需要手动合并 获取使用fianl关键字 但是效率低 数据量大不建议
链路中各个组件的选型和技术的横向对比
维度建模怎么做
维度表
患者维度:包括患者的基本信息,如患者ID、性别、年龄、地理位置等。
医生维度:包括医生的信息,如医生ID、姓名、专业领域、地理位置等。
咨询时间维度:包括咨询发生的日期和时间,可能包括年、月、日、时段等。
咨询类型维度:包括咨询的类型,例如初诊、复诊、特殊病例等。
地理位置维度:包括咨询和医生所在的地理位置信息
医生维度:包括医生的信息,如医生ID、姓名、专业领域、地理位置等。
咨询时间维度:包括咨询发生的日期和时间,可能包括年、月、日、时段等。
咨询类型维度:包括咨询的类型,例如初诊、复诊、特殊病例等。
地理位置维度:包括咨询和医生所在的地理位置信息
事实表
咨询次数
患者支付费用
医生收入
咨询时长
咨询成功率
患者支付费用
医生收入
咨询时长
咨询成功率
粒度
咨询次数可能以每次咨询为粒度,而医生收入可以以每日总额为粒度
星型模式
患者、医生、时间、地点等维度表都与咨询事实表相连
开发中遇到困难的/有挑战的/影响深刻的/复杂的任务
实时任务怎么部署,资源怎么分配?
1.像我们的任务的话 还是得看任务吧 任务一般比较大的 我们就是部署yarn模式中的application-mode这样任务独享一个空间 让任务不受影响跑完 像跑小任务比较多的话 我们一般用session模式 不用每次提交作业都去申请资源 使用开辟的资源即可
2.资源分配的话大任务我们一般自己yarn根据任务的大小去分配资源的 小任务的话可能分配jobmanager taskmanager 分配1~3g吧 槽数量看并行度的情况
经纬度坐标转地理位置信息的实现思路
我们项目中是通过高德的逆编码去实现这个经纬度转换的 主要还是通过去本地数据库里面去查询地理位置信息 如果数据库里面没有 我们在异步I/O去高德的API去查询 从高德获取地理位置信息 先存入本地数据库里面 通过本地数据库返回(因为高德有配额 生产环境数据量特别大的时候 放到本地 提高复用性 性能也有一定的提升)
流式计算分组统计的实现思路
reduceByKey和groupBykey的区别
都会产生shuffle reduceBykey的话他会分组+聚合 并且每个区内预聚合 减少shuffle的落盘量 groupBykey只能分组要聚合的话你得配合sum使用 数据量不会减少
map和mapPartition的区别
1.map将处理的数据逐条映射转换 将返回值构成新的 RDD 主要目的将数据源中的数据进行转换和改变 map算子是分区内一个数据一个数据的执行 性能低
2.mapPartiton是以分区为单位进行数据转换操作 会将整个内存的数据加载到内存 数据较大 会出现OOM内存溢出 是以分区单位进行批处理 性能高 会长时间占用内存 内存溢出
布隆过滤器怎么实现去重
工作流程
需求
项目经理
理解业务和开发进行沟通,开会
产品经理或更高
大的需求需要进行拆解
1.前端 2.后端 3.大数据
根据正常时间和计划时间 算出多少天
在次需求
离线、实时
和产品和技术进一步沟通数据口径对不上、想法出奇
开发
git---gitlab---维护/部署---对应的web服务
代码---拆解需求---和业务逻辑紧密相关---link/Spark/HiveSql
框架
写代码,公司会有一套自己的框架
无框架就正常开发
测试
本地劳---dev测---test测
集群
物理集群、有机房
Xshell
云服务器ecs、无机房
Xshell
云服务
开箱即用 存算分离
存储
阿里云 OSS
腾讯云 COS
华为云 ODS
计算
队列 1CU=1核 4G内存
半托管
emr
hadoop集群
mrs
调度
spark代码=>shell=>调度=>海豚=>调度周期,时间,依赖作业
云服务/自建服务 dataworks=>web界面,去写sql=>调度按钮
业务数据
处方药
抗病毒表
呼吸科药表
解热镇痛表
......
非处方药
维钙营养表
止通镇痛表
止痛镇痛表
......
护具器械
血压针表
血糖仪表
家庭护理表
......
患者信息表
地域维度表
医院信息表、医生信息表
处方表、处方详情表
订单表、订单详情表
行为数据
患者行为
商城事件
医生行为
数据量
进程
独立的执行单位、独立的内存空间(栈堆)、进程之间是隔离的、创建和销毁需要更多的系统资源所有开销非常大、进程之间通信可以通过IPC机制(共享内存、管道)
线程
一个进程有多个线程、线程之间共享相同的代码和数据、但拥有独立的堆栈用于存储本地变量和函数调用信息、线程的创建和销毁开销较小,线程切换开销也相对较小
内核
一个CPU有多少核
逻辑处理器
决定了服务器同时并发量、一个内核可以虚拟1~2个逻辑处理器、一个逻辑处理器上可以运行多个线程、不同进程的线程可以运行在一个逻辑处理器上
QPS
每秒查询
ProToBuf
是一种压缩格式 google开发的 高性能和跨平台支持
图数据库
存储和管理图数据的系统
常用于 一张表的某一个字段和另一张表的关系
数据地图
一种概念 描述用于管理和可视化数据资产的工具、平台或技术
Atlas可以被视为一个特定的数据地图工具,因为它专注于数据治理和元数据管理
常见列式数据库
StarRocks
多维数据建模 列式存储 多数据源
CH
具有出色的性能和压缩功能
Doris
大规模数据分析和实时查询提供高性能和高可用性的解决方案
常见分布式SQL查询引擎
Trino
用于数据湖查询、数据探索、实时分析和交互式报表等各种数据分析任务
实时
Impala
专门用于在Hadoop分布式文件系统上执行SQL查询
离线
Hive
用于处理和查询存储在Hadoop HDFS(分布式文件系统)中的大规模数据
离线
Kylin 与 Druid
优点
预计算,界面可视化
缺点
依赖较多,运维成本高 预计算量大,消耗资源 不适合即席查询
Kylin 的 cuboid,cube 和 segment 的关系?
一个Cube由多个Cuboid组成
一次维度的组合计算的结果就是一个Cuboid
全量构建Cube只有一个Segment,增量构建一次就有一个Segment
kylin 你一般怎么调优
Cube优化
剪枝优化
聚合组
可以将维度拆分成多个聚合组 只在组内计算 Cube 分开计算
联合维度
包含两个或多个维度 分组产生的任何Cuboid中 要么一起出现 要么都不出现
层次维度
上卷+空
强制维度
分组产生的所有的Cube中每一个Cuboid都会包含该维度
衍生维度
简单来说 就是不参与计算
Row编码优化
将字符串存储的一些数据 改为数字来表示 减少空间占用
并发粒度优化,降低度量精度
及时清理无用的 segment
Kylin cube 的构建过程是怎么样的?
1.读取数据
2.根据读取的数据和设置的维度构建维度表
3.创建HBase表
4.根据维度表构建字典表
5.构建Cuboid 0,1,2,3
6.将Cuboid组装Cube 生成HFile
7.将HFile加载到HBase
8.清理内存 清理垃圾 结束任务
Kylin 对维度表的的要求有哪些
要具有数据一致性,主键值必须是唯一的
维度表越小越好 因为会加载到内存中执行
改变频率低
维度表最好不要是 Hive 视图
Kylin 与 Druid 优缺点
Kylin
处理多维度的大规模数据并可以容忍较高的查询延迟
批处理
Druid
实时或近实时的事件数据分析,并且希望获得低延迟的查询性能
实时处理
DophinScheduler
什么是DolphinScheduler?
是一个分布式任务调度系统 将所有Task根据DAG流式方式组成起来
核心特点
简单易用 丰富的使用场景 高扩展性
相对其它调用系统 高可用性、易用性、性能等
架构
MasterServer
负责DAG任务切分 任务提交监控
WorkerServer
主要负责任务的执行和提供日志服务
ZooKeeper
进行集群管理和容错
Alert
警告接口 负责接收任务的成功或失败
DolphinScheduler支持哪些任务类型?
Shell任务、Hive任务、Spark任务
任务调度器和执行器之间的通信机制是什么?
kafka
1.任务调度器作为生产者
2.执行器作为消费者
3.执行器执行成功或失败 将log返回到kafka中
4.任务调度器监听消息队列上的任务状态回调消息,了解任务的执行情况
DolphinScheduler的监控和日志管理是如何实现的?
1.日志收集
Flume
2.日志存储
HDFS MYSQL
3.日志展示和查询
ELK(日志管理和分析平台)
4.监控指标采集
Prometheus
5.告警与通知
6.日志压缩和清理
7.权限控制
什么是DolphinScheduler的HA(高可用性)机制?
主从架构 主备切换
如何处理任务失败和重试?
有错误日志
有告警
有重试机制
调度策略 可以跳过
你在使用DolphinScheduler时遇到的挑战和解决方法是什么?
最多得问题就是任务失败,挑战就是性能优化
问题
随着任务越来越多,性能也达到瓶颈 影响执行效率
解决
增加硬件配置
JVM调优
垃圾回收策略 堆内内存
数据库性能优化
数据池 索引优化
日志归档
Azkaban与Ooize
Azkaban
是一个轻量级的工作流调度系统,适用于相对简单的任务调度和工作流管理
项目较小且需要快速部署
Ooize
适用于复杂的数据处理流程 配置较为复杂
项目需要更丰富的任务类型和复杂的依赖关系
DophinScheduler
处理大数据任务时提供更高的性能和可用性
项目需要高可用性和大规模的任务调度
Superset
Superset与其他数据可视化工具(如Tableau、Power BI)相比有哪些优势?
免费
灵活 支持多种数据源
SQL支持
扩展性强
功能
可以将数据通过 仪表盘( 饼状图 折线图 柱状图 ) 展示出来 更好看出数据的趋势
Superset支持哪些数据源?
MySQL、PostgreSQL、Druid
Superset如何处理大数据量?
1.确保数据源的性能优化。使用性能高效的数据库引擎
2.编写高效的SQL查询。避免不必要的JOIN操作和复杂的子查询
3.使用分页和分片来限制每次查询返回的数据量
4.查询结果缓存 提高性能
5.复杂和耗时的查询,可以将其设置为异步执行
Superset如何确保数据安全性?
提供了基于角色的控制 可以限制用户和角色对特定数据源、数据表、仪表盘和切片的访问权限
支持多种身份验证方式,包括基本身份验证、OAuth、LDAP
可以在仪表盘和报表中使用数据脱敏技术
可以生成审计日志,记录用户的操作和查询历史
Prometheus 与 Ganglia
Prometheus的监控目标是什么?
数据库、队列、CPU、内存、磁盘、网络、Kafka、Redis
操作系统、云服务、自定义
Prometheus与Ganglia区别
Prometheus更适用于具有多维度数据模型、高级查询需求、动态环境以及云原生和容器化部署的场景
实时
Ganglia更适用于传统的系统性能监控,特别是对历史数据绘图的需求较多的情况
离线
Altas 与 Ranger
Atlas与数据治理的关系是什么?
Atlas是数据治理的一部分,它提供了管理、跟踪、保护和优化数据资产的关键能力
Altas 与 Ranger区别
Altas
关注数据的元数据管理 了解数据在整个生命周期中的使用和变化
适用于需要了解数据资产的元数据、数据血缘和数据影响分析的用例,以支持数据管理、合规性和数据质量
Ranger
关注数据的安全和访问控制 确保只有授权用户可以访问敏感数据
适用于需要确保数据安全性和合规性的用例,以实施细粒度的访问控制和审计
可以相互集成在一起
你在使用Apache Atlas时,可能会遇到的一些挑战和解决方法是什么?
确保Apache Atlas中的元数据得到适当的保护和访问控制可能是一个挑战
解决
配置Apache Ranger以提供细粒度的权限管理和访问控制。定义策略以确保只有授权用户可以访问和修改元数据
Cannal 与 MaxWell 与 FlinkCDC
Cannal
优点
增量同步 高性能,大规模、稳定
缺点
配置复杂 只能增量
MaxWell
优点
增全量 简单易用、配置简单
缺点
更新慢 增全量变更时 数据可能会丢失
FlinkCDC
优点
灵活性、实时性、增全量无缝切换
缺点
资源消耗
0 条评论
下一页