一、简答题

第1章 大数据概述

1. 简述大数据的4V特征及其含义

答:

  • Volume(数据量大):数据规模从TB级到PB、EB级持续增长
  • Velocity(处理速度快):要求实时或近实时处理,秒级甚至毫秒级响应
  • Variety(数据类型多):包括结构化数据、半结构化数据(JSON/XML)、非结构化数据(文本/图像/视频)
  • Value(价值密度低):海量数据中蕴含价值,但单位数据价值密度低,需要深度挖掘

2. 大数据技术栈主要包含哪些层次?各层次的核心技术是什么?

答:

  • 数据采集层:Flume(日志采集)、Sqoop(数据库导入)、Kafka(消息队列)
  • 数据存储层:HDFS(分布式文件)、HBase(列式数据库)、Redis(缓存数据库)
  • 计算引擎层:MapReduce(离线批处理)、Spark(内存计算)、Flink(流处理)
  • 数据分析层:Hive(数据仓库)、Presto(交互式查询)、Spark SQL
  • 机器学习层:Spark MLlib(分布式机器学习)

3. 简述OLTP和OLAP的区别

答:

  • OLTP(联机事务处理):面向业务操作,高并发事务处理,数据量小,实时性要求高,如银行转账、订单系统
  • OLAP(联机分析处理):面向数据分析,复杂聚合查询,数据量大,实时性要求较低,如报表系统、数据仓库

第2章 Python大数据分析

4. 简述Pandas中DataFrame和Series的区别

答:

  • Series:一维数据结构,类似数组,包含索引和值两部分
  • DataFrame:二维表格型数据结构,类似Excel表格,由多个Series组成(每列是一个Series)
  • DataFrame既有行索引也有列索引,Series只有一个维度的索引

5. Pandas处理缺失值的常用方法有哪些?

答:

  • 删除法:dropna()删除包含缺失值的行或列
  • 填充法:fillna()用指定值、均值、中位数、众数填充
  • 插值法:interpolate()根据相邻值进行线性或时间序列插值
  • 标记法:将缺失值作为特殊类别处理

6. NumPy数组和Python原生列表相比有哪些优势?

答:

  • 内存效率高:相同数据量占用内存更小
  • 运算速度快:向量化操作,避免Python循环开销
  • 功能丰富:支持矩阵运算、广播、统计等科学计算
  • 类型统一:数组元素类型一致,避免动态类型检查开销

7. 数据可视化在数据分析中的作用是什么?常用的Python可视化库有哪些?

答:

作用:探索数据分布、发现规律和异常、展示分析结果、辅助决策

常用库:

  • Matplotlib:基础绘图库,灵活度高
  • Seaborn:基于Matplotlib,统计可视化更友好
  • Plotly:交互式可视化,支持Web展示
  • Pyecharts:基于ECharts的Python接口

第3章 Kafka

8. 简述Kafka的核心组件及其作用

答:

  • Producer:生产者,向Broker发送消息
  • Consumer:消费者,从Broker拉取消息
  • Broker:Kafka服务器节点,存储和处理消息
  • Topic:主题,消息的逻辑分类
  • Partition:分区,Topic的物理分片,提高并行度
  • Offset:偏移量,消息在分区内的唯一标识
  • Consumer Group:消费者组,实现负载均衡和广播消费

9. Kafka的ISR机制是什么?有什么作用?

答:

ISR(In-Sync Replicas)是同步副本集合

  • Leader维护一个与自己保持同步的Follower副本列表
  • 只有ISR中的副本才有资格被选举为新Leader
  • ACKS=-1时需要ISR中所有副本都写入成功才确认
  • 作用:在数据可靠性和可用性之间取得平衡,避免慢副本影响性能

10. Kafka如何保证分区内消息的顺序性?

答:

  • 单个Partition内消息严格按写入顺序存储,Offset递增
  • 生产者发送消息时可指定key,相同key的消息路由到同一个Partition
  • 消费者按Offset顺序消费,单线程消费保证顺序
  • 注意:Kafka只保证分区内有序,不保证全局有序

11. Kafka消费者组的Rebalance机制是什么?触发条件有哪些?

答:

Rebalance是消费者组内分区所有权重新分配的过程

触发条件:

  • 消费者组成员数量变化(新增/离开)
  • Topic分区数量变化
  • 订阅的Topic数量变化
  • 消费者超时未发送心跳
  • 作用:实现负载均衡,保证分区被消费

第4章 数据存储

12. 简述HDFS的架构及各组件职责

答:

  • NameNode:主节点,管理元数据(目录树、文件块映射、块位置),处理客户端请求
  • DataNode:从节点,存储实际数据块,执行读写操作,定期向NameNode汇报
  • SecondaryNameNode:辅助NameNode合并fsimage和editlog,不是热备
  • 特点:主从架构、高容错、适合大文件存储

13. HDFS的副本放置策略是什么?

答:

默认3副本策略:

  • 第一个副本:写入客户端所在的DataNode(客户端在集群外则随机选)
  • 第二个副本:写入另一个机架的DataNode(机架容错)
  • 第三个副本:写入与第二个副本同机架的不同DataNode(同机架网络快)
  • 更多副本:随机放置
  • 作用:兼顾数据可靠性和读写性能

14. HBase的数据模型是什么?各组成部分的含义?

答:

  • RowKey:行键,唯一标识一行,二进制有序,按字典序排序
  • Column Family:列族,表创建时指定,物理上分开存储,一个列族包含多个列
  • Column Qualifier:列限定符,动态列,无需预定义
  • Version:版本号,默认是时间戳,一个单元格可保存多个版本的值
  • Cell:单元格,由RowKey+CF+CQ+Version唯一确定,存储具体值

15. HBase和传统关系型数据库的区别是什么?

答:

  • 数据模型:HBase是列式存储,稀疏多维映射;RDBMS是行式,二维表
  • Schema:HBase列动态扩展;RDBMS Schema固定
  • 索引:HBase只有RowKey索引;RDBMS支持多列索引
  • 事务:HBase只支持单行事务;RDBMS支持跨行跨表ACID
  • 扩展性:HBase水平扩展;RDBMS扩展困难
  • 查询:HBase适合简单查询和范围扫描;RDBMS支持复杂SQL

16. Redis支持哪些数据类型?各自的应用场景是什么?

答:

  • String:字符串/数字,缓存、计数器、分布式锁
  • List:链表,消息队列、最新列表
  • Set:无序集合,去重、交集并集运算、标签
  • Hash:哈希表,存储对象、用户信息
  • ZSet:有序集合,排行榜、带权重的队列
  • 附加:Bitmap、HyperLogLog、Geo、Stream

17. Redis的两种持久化方式RDB和AOF的优缺点对比

答:

  • RDB:定时快照,二进制文件,恢复快,文件小;缺点是可能丢失最后一次快照后的数据
  • AOF:追加写命令,数据完整,可读性好;缺点是文件大,恢复慢
  • 推荐:混合持久化,RDB全量+AOF增量,兼顾速度和完整性

18. Redis的过期键删除策略是什么?

答:

  • 定期删除:每隔一段时间随机抽取部分过期键删除,CPU友好但内存不及时
  • 惰性删除:访问键时才检查是否过期,内存友好但CPU不及时
  • Redis采用:定期删除+惰性删除结合
  • 内存不足时触发淘汰策略

第5章 图数据处理

19. 图数据库相比关系型数据库在处理关联数据的优势是什么?

答:

  • 原生图存储:节点和关系作为一等公民,物理上相邻存储
  • 免JOIN查询:关联查询通过指针跳转,无需昂贵的JOIN操作
  • 深度遍历高效:多层关系查询性能稳定,不随深度指数下降
  • 模型直观:实体-关系直接映射为节点-关系,符合业务直觉
  • 适合场景:社交网络、推荐系统、知识图谱、金融风控

20. Cypher查询语言中MATCH、CREATE、WHERE、RETURN的作用是什么?

答:

  • MATCH:匹配图模式,指定要查找的节点和关系结构
  • CREATE:创建新的节点或关系
  • WHERE:添加过滤条件,类似SQL的WHERE
  • RETURN:指定返回结果,类似SQL的SELECT
  • 示例:MATCH (p:Person)-[:FRIEND]->(f) WHERE p.age>20 RETURN p.name, f.name

21. Spark GraphX的核心抽象是什么?

答:

  • Graph:图结构抽象,包含VertexRDD和EdgeRDD
  • VertexRDD:顶点RDD,(VertexId, VD)键值对
  • EdgeRDD:边RDD,包含源顶点ID、目标顶点ID和边属性
  • Triplet:三元组,包含源顶点、边、目标顶点的完整信息
  • 特点:基于RDD,分布式、容错、可并行计算

22. PageRank算法的核心思想是什么?

答:

  • 基于链接分析的节点重要性评估算法
  • 核心假设:重要节点会被其他重要节点链接
  • 公式:PR(A) = (1-d) + d × Σ(PR(i)/C(i))

  - d是阻尼系数(一般0.85),表示随机跳转概率

  - C(i)是节点i的出链数

  • 迭代计算直到收敛,值越高节点越重要
  • 应用:网页排名、社交网络影响力分析

第6章 离线计算

23. MapReduce的编程模型及执行流程是什么?

答:

编程模型:

  • Map阶段:输入分片→<key, value>对→处理→输出中间结果
  • Reduce阶段:拉取Map输出→按key分组→聚合→输出最终结果

执行流程:

1. InputFormat:输入分片,创建RecordReader

2. Map任务:执行map函数,写入环形缓冲区

3. Shuffle阶段:分区、排序、Combiner、溢写、合并

4. Reduce任务:拉取数据、合并、排序、执行reduce函数

5. OutputFormat:写入输出文件

24. MapReduce中Shuffle阶段的作用是什么?包含哪些步骤?

答:

Shuffle是连接Map和Reduce的桥梁,将Map输出整理为Reduce输入

Map端Shuffle:

  • 分区(Partitioner):确定哪个Reduce处理
  • 排序(Sort):按key排序
  • 合并(Combiner):本地聚合,减少数据量
  • 溢写(Spill):内存满了写入磁盘
  • 归并(Merge):多个溢写文件合并

Reduce端Shuffle:

  • 拉取(Fetch):从各Map节点拉取数据
  • 合并(Merge):合并拉取的数据
  • 排序(Sort):最终排序

25. Spark RDD的五大特性是什么?

答:

  • 分区(Partition):数据集分片,并行计算的基础
  • 计算函数(Compute):每个分区的计算逻辑
  • 依赖(Dependencies):RDD间的血缘关系
  • 分区器(Partitioner):key-value RDD的分区策略
  • 优先位置(Preferred Location):计算任务的最优位置,数据本地化

26. Spark中宽依赖和窄依赖的区别是什么?

答:

  • 窄依赖:父分区只对应一个子分区,无Shuffle,如map、filter、union
  • 宽依赖:父分区对应多个子分区,发生Shuffle,如reduceByKey、groupByKey、join
  • 区别标志:是否发生数据混洗(Shuffle)
  • Stage划分:从后往前遇到宽依赖就划分新Stage

27. Spark的DAG调度流程是什么?

答:

1. Action算子触发Job提交

2. DAGScheduler:

   - 构建DAG图

   - 按宽依赖划分Stage

   - 生成TaskSet(每个Stage对应一组Task)

   - 提交TaskSet给TaskScheduler

3. TaskScheduler:

   - 分配Task到Executor

   - 考虑数据本地化

   - 监控Task执行,失败重试

4. Executor执行Task,返回结果

28. **RDD、DataFrame、DataSet三者的区别和联系?**

答:

  • RDD:无Schema,类型安全,面向对象API,编译期检查,优化少
  • DataFrame:有Schema,Spark SQL Catalyst优化,性能好,无类型安全
  • DataSet:结合两者优点,有Schema+类型安全,只有Scala/Java支持
  • 联系:DataFrame是DataSet[Row]的别名,三者可互相转换
  • 性能:DataFrame/DataSet > RDD,因为有 Catalyst优化和Tungsten执行引擎

Spark MLlib & OLAP

29. 机器学习流水线Pipeline包含哪些核心组件?

答:

  • DataFrame:ML的数据结构,存储特征和标签
  • Transformer:转换器,输入DataFrame输出新DataFrame,如特征处理
  • Estimator:评估器,fit()方法训练模型,输出Transformer(模型)
  • Evaluator:评估器,评估模型性能,如准确率、AUC
  • Pipeline:按顺序组装多个Stage,形成完整机器学习工作流

30. 数据仓库的维度建模中星型模型和雪花模型的区别?

答:

  • 星型模型:事实表直接连接多个维度表,维度表不拆分,查询简单,冗余大
  • 雪花模型:维度表规范化,拆分为多层,冗余小,查询复杂,JOIN多
  • 选择:数据仓库一般优先星型模型,查询性能更好,开发简单
  • 星座模型:多个事实表共享维度表,更复杂的业务场景

二、分析题(共20道)

存储与架构分析

1. 某企业数据量快速增长,需要设计存储方案。请分析HDFS、HBase、Redis分别适合什么场景?如何组合使用?

答:

适用场景分析:

  • HDFS:适合存储海量原始数据、日志文件、历史归档,大文件顺序访问,高吞吐低成本
  • HBase:适合海量结构化数据的随机读写、实时查询、稀疏数据,如用户画像、订单明细
  • Redis:适合热数据缓存、计数器、会话存储、低延迟访问,全内存高性能

组合方案:

  • 原始数据:采集后写入HDFS,作为数据湖存储
  • 实时查询:HDFS数据ETL后导入HBase,提供在线随机查询
  • 热点加速:HBase高频访问数据缓存到Redis,降低HBase压力
  • 数据流向:Kafka→HDFS(原始)→Spark ETL→HBase(服务)→Redis(缓存)

2. 分析HDFS小文件问题的成因、影响及解决方案

答:

成因:

  • 流式数据逐条写入,生成大量小文件
  • MapReduce/Spark任务分区过多,输出大量小文件
  • 实时计算微批输出,每个批次一个文件

影响:

  • NameNode内存压力:每个文件元数据约150字节,1亿文件占用15GB内存
  • Map任务过多:一个小文件一个Map,资源浪费调度开销大
  • 寻址开销大:大量小文件寻址时间超过读取时间

解决方案:

  • 写入端:合并后再写入HDFS,SequenceFile/HAR归档
  • 计算端:CombineTextInputFormat合并输入分片
  • 服务端:Hive自动合并、定时任务合并小文件
  • 替代方案:小文件存入HBase,不直接存HDFS

3. 分析Redis缓存穿透、缓存击穿、缓存雪崩的区别、成因及解决方案

答:

缓存穿透:

  • 现象:查询不存在的数据,请求直接打到数据库
  • 成因:恶意攻击、参数错误
  • 方案:布隆过滤器过滤不存在的key、缓存空值、接口层校验

缓存击穿:

  • 现象:热点key过期瞬间,大量请求击穿到数据库
  • 成因:热点数据过期时间集中
  • 方案:热点key永不过期、互斥锁(分布式锁)、后台异步更新

缓存雪崩:

  • 现象:大量key同时过期,数据库压力骤增
  • 成因:过期时间相同、缓存服务宕机
  • 方案:过期时间加随机值、多级缓存、缓存集群高可用、服务降级熔断

4. 分析HBase RowKey设计的重要性及设计原则,举例说明

答:

重要性:

  • RowKey是HBase唯一索引,决定查询性能
  • 决定数据分布,影响Region负载均衡
  • 设计不好导致热点问题、查询性能低下

设计原则:

1. 唯一性:必须唯一标识一行

2. 散列性:避免连续RowKey写入同一Region造成热点

   - 方法:哈希前缀、反转、加盐

   - 反例:时间戳开头,所有数据写入最新Region

3. 有序性:便于范围扫描,相关数据RowKey前缀相同

4. 长度原则:尽量短,建议10-100字节,过长占用存储空间

示例:用户行为表

  • 差设计:timestamp + user_id → 热点问题
  • 好设计:hash(user_id) + user_id + timestamp → 散列+有序
  • 效果:同一用户数据连续存储,便于范围查询,同时散列避免热点

5. 分析Kafka消息积压的原因、排查方法及解决方案

答:

原因分析:

  • 消费能力不足:消费者处理逻辑慢、消费者数量少
  • 分区数不足:分区数限制并行消费能力
  • 消息突增:业务峰值、流量洪峰
  • 异常阻塞:消费线程阻塞、死锁、外部依赖超时

排查方法:

  • 监控Consumer Lag:查看积压速率
  • 监控消费者CPU/内存:是否资源瓶颈
  • 查看消费者日志:是否报错或超时
  • 查看Topic消息流入速率:是否流量突增

解决方案:

1. 扩容:增加消费者数量(不超过分区数)、增加分区数

2. 优化:消费逻辑异步化、批量处理、跳过非重要消息

3. 限流:生产者端限流、削峰填谷

4. 应急:临时增加消费线程、消息丢弃/降级处理

Spark & 计算引擎分析

6. 分析Spark数据倾斜的现象、原因及解决方案

答:

现象:

  • Spark UI中某个Stage任务执行时间远长于其他任务
  • 某个Task处理的数据量远大于平均值
  • 作业长时间卡在某个Stage,最后OOM

原因:

  • key分布不均匀,少数key对应大量数据
  • 业务数据本身倾斜,如某些热门商品、大V用户
  • Shuffle算子:groupByKey、reduceByKey、join等

解决方案:

1. 过滤异常key:过滤null或无效key

2. 两阶段聚合:先加盐局部聚合,再去盐全局聚合

3. Map端Join:小表广播,避免Shuffle

4. 调整并行度:增加shuffle.partitions

5. 动态加盐:大key拆分处理,小key正常处理

6. 倾斜Join:大表拆分,小表扩容后Join

7. 分析Spark cache()和persist()的区别及存储级别选择策略

答:

区别:

  • cache() = persist(MEMORY_ONLY),默认只存在内存
  • persist()可指定存储级别,更灵活

存储级别:

  • MEMORY_ONLY:只存内存,序列化Java对象,最快,内存占用大
  • MEMORY_ONLY_SER:内存+序列化,省空间,CPU序列化开销
  • MEMORY_AND_DISK:内存不够溢写到磁盘
  • MEMORY_AND_DISK_SER:序列化+溢写磁盘
  • DISK_ONLY:只存磁盘

选择策略:

  • 数据小、频繁访问:MEMORY_ONLY
  • 数据大:MEMORY_ONLY_SER,节省空间
  • 计算昂贵:MEMORY_AND_DISK,避免重算
  • 注意:缓存不是越多越好,占用内存影响其他任务,不用时unpersist()

8. 分析Spark作业运行慢的排查思路及优化方向

答:

排查思路:

1. 查看Spark UI:哪个Stage慢?哪个Task慢?

2. 查看资源使用:CPU/内存/磁盘IO是否瓶颈?

3. 查看Shuffle数据量:是否Shuffle过大?

4. 查看数据倾斜:是否有Task执行时间异常?

5. 查看GC:是否频繁GC?

优化方向:

1. 资源优化:合理设置Executor数量、内存、CPU核数

2. 算子优化:

   - 避免Shuffle:用reduceByKey替代groupByKey

   - 用mapPartitions替代map,减少初始化次数

   - 广播小表,用MapJoin替代ReduceJoin

3. 数据倾斜优化:加盐、过滤、调整并行度

4. 序列化:Kryo序列化,比Java序列化快体积小

5. 缓存:常用数据cache/persist

6. GC优化:调整Executor内存比例,CMS/G1垃圾回收

9. 分析MapReduce和Spark的区别及各自适用场景

答:

架构区别:

  • MapReduce:磁盘计算,Map+Reduce两阶段,中间结果落盘
  • Spark:内存计算,DAG引擎,中间结果在内存,迭代计算快

性能对比:

  • Spark比MapReduce快10-100倍(内存计算)
  • 迭代计算(机器学习、图计算)Spark优势明显
  • 简单批处理差距不大

适用场景:

  • MapReduce:超大规模批处理、稳定性要求高、资源紧张的场景
  • Spark:迭代计算、交互式查询、流处理、机器学习
  • 选择:数据量特别大(PB级)且不需要迭代,可选MapReduce;其他优先Spark

10. 分析Spark的宽窄依赖对容错和性能的影响

答:

对容错的影响:

  • 窄依赖:某分区丢失只需重算对应父分区,恢复开销小,可并行恢复
  • 宽依赖:某分区丢失需要重算所有父分区,恢复开销大
  • 设计:Lineage容错机制,宽依赖开销大,所以宽依赖会自动写Checkpoint

对性能的影响:

  • 窄依赖:无Shuffle,Pipeline执行,性能好
  • 宽依赖:Shuffle开销大(磁盘IO、网络IO、序列化)
  • 优化:尽量减少宽依赖,调整宽依赖的并行度

架构与业务分析

11. 分析Lambda架构和Kappa架构的原理、优缺点及适用场景

答:

Lambda架构:

  • 原理:批处理层+速度层+服务层,批流分开计算,结果合并
  • 优点:成熟稳定,批处理准确,流处理低延迟
  • 缺点:两套逻辑维护成本高,结果合并复杂,最终一致性
  • 适用:对准确性要求高,批流结果需要融合的场景

Kappa架构:

  • 原理:以流处理为核心,批处理是流的特例,历史数据重放
  • 优点:一套代码,维护简单,架构统一
  • 缺点:历史数据重放开销大,流处理引擎要求高
  • 适用:实时性要求高,数据量大,希望简化架构的场景

选择:

  • 传统数仓、对准确性要求极高:Lambda
  • 实时数仓、流处理为主:Kappa(主流趋势)

12. 分析数据仓库建模中星型模型设计的步骤及注意事项

答:

设计步骤:

1. 选择业务过程:确定分析主题,如订单、支付、登录

2. 声明粒度:每行数据代表什么,如一个订单、一次浏览

3. 确定维度:分析角度,如时间、用户、商品、地区

4. 确定事实:度量指标,如订单金额、数量、PV/UV

注意事项:

  • 维度表:主键、维度属性,尽量退化,避免雪花化
  • 事实表:外键关联维度表,指标可加性
  • 日期维度:必须有,年/季/月/日/周等属性
  • 缓慢变化维:处理维度属性变化,SCD1/SCD2/SCD3
  • 避免大宽表:维度过多影响性能和维护

13. 分析实时数仓和离线数仓的区别及技术选型

答:

区别:

  • 延迟:离线T+1,实时秒级/分钟级
  • 计算引擎:离线Spark/MapReduce,实时Flink/Spark Streaming
  • 存储:离线HDFS/Hive,实时Kafka/HBase/ClickHouse
  • 建模:离线维度建模,实时宽表为主

技术选型:

  • 采集:Fluentd/Logstash → Kafka
  • 计算:Flink(流处理)+ Spark(批处理)
  • 存储:ODS(Kafka)、DWD(Kafka/HDFS)、DWS(ClickHouse/Doris)、ADS(MySQL/Redis)
  • 查询:Presto/ClickHouse

架构:

  • Kappa架构,流批一体
  • 分层:ODS→DWD→DWS→ADS,每层实时化

14. 分析机器学习中过拟合和欠拟合的现象、原因及解决方法

答:

过拟合:

  • 现象:训练集效果好,测试集效果差,模型太"聪明"
  • 原因:模型太复杂、训练数据太少、噪声太多
  • 解决:增加训练数据、正则化(L1/L2)、Dropout、早停、简化模型

欠拟合:

  • 现象:训练集和测试集效果都差,模型太"笨"
  • 原因:模型太简单、特征太少、训练不足
  • 解决:增加特征、增加模型复杂度、增加训练轮数

诊断方法:

  • 学习曲线:训练误差和验证误差随样本量变化
  • 验证曲线:不同超参数下的训练/验证误差

15. 分析推荐系统中协同过滤算法的原理、分类及优缺点

答:

原理:

  • 物以类聚,人以群分,相似用户喜欢相似物品

分类:

1. 基于用户(UserCF):找相似用户,推荐他们喜欢的物品

   - 优点:推荐新颖,社会化,适合用户少物品多

   - 缺点:用户兴趣变化快,稀疏性问题,冷启动

2. 基于物品(ItemCF):找相似物品,推荐用户喜欢物品的相似品

   - 优点:物品相似度稳定,可预计算,解释性好

   - 缺点:热门物品相似度高,推荐多样性差

3. 基于模型(ModelCF):矩阵分解、机器学习模型

   - 优点:性能好,可处理稀疏数据,泛化能力强

   - 缺点:解释性差,训练复杂

选择:

  • 电商:ItemCF为主(物品稳定)
  • 社交:UserCF为主(社交关系)

16. 分析图计算在社交网络分析中的应用场景及优势

答:

应用场景:

1. 社交关系发现:好友推荐、二度人脉

2. 影响力分析:PageRank计算用户影响力

3. 社区发现:连通分量、Louvain算法发现社群

4. 异常检测:金融反欺诈、传销识别

5. 路径分析:最短路径、关联度计算

优势:

1. 模型直观:用户是节点,关注/好友是关系

2. 查询高效:多层关系查询无需JOIN

3. 算法丰富:社区发现、标签传播、中心性计算

4. 并行计算:Spark GraphX/Neo4j分布式处理

示例:

  • 好友推荐:共同好友数+Jaccard相似度
  • 谣言传播:图传播算法模拟传播路径

17. 分析Redis和Kafka作为消息队列的区别及选型

答:

Redis消息队列:

  • 实现:List结构(LPUSH+BRPOP)、Pub/Sub、Stream
  • 优点:轻量、低延迟、部署简单
  • 缺点:不保证不丢、无回溯、堆积能力弱
  • 适用:简单队列、即时通知、非关键路径

Kafka消息队列:

  • 优点:高吞吐、持久化、回溯消费、堆积能力强、高可用
  • 缺点:部署复杂、延迟稍高、重量级
  • 适用:大数据场景、日志采集、解耦系统、可靠消息

选型:

  • 大数据链路、可靠传输:Kafka
  • 简单业务、低延迟、数据量小:Redis
  • 注意:Redis 5.0+ Stream功能增强,但仍不如Kafka专业

18. 分析Hive、Spark SQL、Presto的区别及查询场景选型

答:

Hive on MR/Tez/Spark:

  • 特点:稳定、成熟、适合大规模ETL
  • 延迟:分钟级
  • 适用:T+1离线批处理、数据清洗转换

Spark SQL:

  • 特点:内存计算、速度快、兼容Hive元数据
  • 延迟:秒级到分钟级
  • 适用:交互式查询、中等规模ETL、混合处理

Presto:

  • 特点:MPP架构、纯内存计算、多数据源联邦查询
  • 延迟:亚秒级到秒级
  • 适用:Ad-hoc查询、多数据源关联、BI报表

选型建议:

  • 大规模离线ETL:Hive
  • 数据探索、交互式分析:Spark SQL
  • BI报表、即席查询:Presto/ClickHouse

19. 分析数据质量监控的重要性及监控维度

答:

重要性:

  • 垃圾进垃圾出,数据质量决定分析可信度
  • 数据问题发现越晚,修复成本越高
  • 影响业务决策,甚至造成损失

监控维度:

1. 完整性:数据是否完整,是否丢失

   - 监控:数据量波动、主键非空、关联匹配

2. 一致性:同一数据不同来源是否一致

   - 监控:多源校验、主键重复、枚举值合法

3. 准确性:数据是否正确

   - 监控:数值范围、格式校验、业务规则

4. 及时性:数据是否按时产出

   - 监控:任务完成时间、延迟告警

5. 唯一性:数据是否重复

   - 监控:主键去重、唯一索引

实现:

  • 规则引擎+告警通知
  • 数据质量报告+SLA

20. 分析大数据平台高可用设计的关键点

答:

组件高可用:

  • HDFS:NameNode HA(Active/Standby)、ZKFC自动故障转移
  • YARN:ResourceManager HA
  • HBase:HMaster HA、RegionServer故障转移
  • Kafka:多Broker、副本机制、Controller选举
  • Redis:主从+哨兵、Cluster集群

计算高可用:

  • Spark:Application Master重试、Speculative Execution推测执行
  • 任务重试机制、失败告警

数据高可用:

  • 多副本:HDFS 3副本、Kafka副本
  • 跨机房同步、定期备份
  • 数据校验:CRC、MD5

监控告警:

  • 全链路监控:主机、组件、任务、业务
  • 多级告警、值班机制、应急预案

容灾备份:

  • 冷备:定期快照
  • 热备:双机房同步
  • 灾备演练

三、设计题(共10道)

1. 设计一个日增10TB的用户行为日志采集和存储方案

要求:基于PPT涉及的技术,考虑高吞吐、可靠性、扩展性

设计方案:

技术选型:

  • 采集端:Filebeat(轻量日志采集)+ Flume(汇聚)
  • 消息队列:Kafka(解耦、削峰、高吞吐)
  • 存储层:HDFS(原始日志)+ HBase(用户明细)+ Redis(实时统计)

架构设计:

1. 接入层:

   - 应用服务器部署Filebeat,实时采集本地日志文件

   - Filebeat输出到Kafka,Topic按业务划分

   - 流量大的Topic增加分区数,提高并行度

2. 缓冲层:

   - Kafka集群3副本,ACKS=1保证性能和可靠性平衡

   - 消息保留7天,支持回溯消费

   - 监控Consumer Lag,及时扩容

3. 消费层:

   - 实时消费:Flink/Spark Streaming实时清洗、统计、告警

   - 离线消费:定时批量导入HDFS,按日期分区存储

   - 双消费链路,互不影响

4. 存储层:

   - 原始数据:HDFS,按天分区,Parquet列式存储,Snappy压缩

   - 明细数据:清洗后写入HBase,RowKey=hash(uid)+uid+timestamp

   - 统计数据:Redis实时计数器、分钟级统计结果

优化点:

  • Kafka分区数=消费者数,最大化消费能力
  • HDFS小文件定时合并
  • HBase预分区避免热点
  • 端到端监控,数据质量校验

2. 设计一个电商用户画像系统的技术架构

要求:支持标签加工、标签存储、标签查询

设计方案:

整体架构:

数据源 → 数据加工 → 标签存储 → 标签应用

1. 数据源层:

  • 用户行为数据:浏览、点击、加购、购买日志
  • 用户属性数据:注册信息、人口属性
  • 业务数据:订单、支付、客服数据

2. 数据加工层:

  • 事实标签:统计类标签,Spark SQL批量计算(T+1)

  - 例:近30天购买次数、客单价、活跃天数

  • 模型标签:算法标签,Spark MLlib训练

  - 例:用户价值分层、流失概率、性别预测

  • 实时标签:Flink实时计算

  - 例:实时活跃度、实时意向商品

3. 标签存储层

  • HBase:用户标签宽表,RowKey=user_id,列族=标签类别

  - 支持随机查询、批量扫描

  • Elasticsearch:标签索引,支持组合条件筛选人群

  - 支持多维组合查询、人群圈选

  • Redis:热点用户标签缓存,低延迟查询

4. 标签应用层:

  • 人群圈选:按标签组合筛选目标用户
  • 个性化推荐:用户标签+物品标签匹配
  • 精准营销:营销系统调用标签接口
  • 数据分析:用户画像分析、标签分布统计

关键设计:

  • 标签生命周期管理:标签上线、下线、版本
  • 标签质量监控:覆盖率、准确率、稳定性
  • 接口服务:RESTful API,支持高并发查询

3. 设计一个高并发秒杀系统的数据层架构

要求:基于Redis、Kafka、MySQL等技术,支持10万QPS

设计方案:

分层架构:

1. 流量控制层:

  • 前端:CDN静态化、按钮置灰、验证码防刷
  • Nginx:限流、IP黑白名单
  • 应用层:令牌桶限流、降级开关

2. 缓存层(Redis):

  • 库存预热:活动开始前将商品库存载入Redis
  • 分布式锁:SETNX+Lua脚本原子扣减库存
  • 结果缓存:秒杀结果缓存,防重复查询
  • 用户限流:用户维度频率控制
  • 设计:Redis Cluster集群,主从+哨兵高可用

3. 异步层(Kafka):

  • 扣减库存成功后,发送创建订单消息到Kafka
  • 消费者异步创建订单、扣减数据库库存
  • 解耦前端请求和后端处理,提高吞吐量
  • 消息重试+幂等,保证订单不丢不重

4. 数据库层(MySQL):

  • 主从架构,读写分离
  • 订单表分库分表,按用户ID哈希
  • 库存行锁优化,避免超卖
  • 最终一致性:Redis+DB最终一致,定时对账

5. 状态查询层:

  • 用户轮询秒杀结果,优先查Redis
  • 订单创建成功后异步更新Redis状态
  • 长连接/WebSocket主动通知结果

关键优化:

  • 热点隔离:秒杀商品单独集群
  • 异步处理:能异步不同步
  • 降级机制:非核心功能降级
  • 容量预估:压测+扩容预案

4. 设计一个企业级实时数仓架构

要求:基于Kappa架构,支持实时ETL、实时指标、实时报表

设计方案:

Kappa架构分层设计:

ODS层(原始数据层):

  • 数据采集:Fluentd采集业务日志、Canal采集Binlog
  • 消息队列:Kafka,按数据源分Topic
  • 保留策略:3天原始数据,支持重放

DWD层(明细数据层):

  • 计算引擎:Flink SQL流处理
  • 处理逻辑:数据清洗、格式转换、维度关联、数据脱敏
  • 输出:清洗后明细数据写回Kafka,同时落盘HDFS
  • 特点:实时ETL,一次清洗多处使用

DWS层(汇总数据层):

  • 计算引擎:Flink窗口计算
  • 处理逻辑:多维度聚合、指标计算
  • 窗口类型:滚动窗口(分钟/小时)、滑动窗口、会话窗口
  • 输出:ClickHouse/Doris,列式存储+MPP查询

ADS层(应用数据层):

  • 实时指标:写入MySQL/Redis,供接口查询
  • 实时报表:ClickHouse提供BI报表查询
  • 实时大屏:Flink聚合后推送到WebSocket

关键设计:

  • 流批一体:同一套SQL,实时离线逻辑一致
  •  Exactly Once:Flink两阶段提交+事务Sink
  • 维表关联:广播维表+定时更新
  • 数据质量:实时校验、异常告警

5. 设计一个海量图片存储和检索系统的存储方案

要求:支持10亿级图片存储、毫秒级检索

设计方案:

存储方案:

1. 原始图片存储:HDFS

  • 小文件问题解决方案:

  - 图片文件按批次打包成SequenceFile

  - 文件名+偏移量作为图片唯一标识

  - 索引单独存储在HBase

  • 优点:节省NameNode内存,高吞吐存储
  • 冷热分离:热数据存SSD,冷数据存SATA

2. 图片元数据存储:HBase

  • RowKey设计:md5(图片内容) + 时间戳
  • 列族:basic(基本信息)、feature(特征向量)、meta(业务属性)
  • 支持:按MD5去重、按时间范围查询、按属性筛选

3. 图片特征检索:Redis + 向量引擎

  • 特征提取:CNN模型提取图片特征向量
  • 检索方案:

  - 小规模:Redis缓存相似图片

  - 大规模:Milvus/FAISS向量搜索引擎

  - 召回:局部敏感哈希(LSH)快速召回候选

  - 精排:余弦相似度精确计算

4. 图片缓存:Redis + CDN

  • 热点图片缓存到Redis,LRU淘汰
  • 访问图片走CDN,回源到应用服务器
  • 多级缓存,降低HDFS访问压力

访问流程:

上传:应用→HDFS→HBase写元数据→提取特征

下载:CDN→Redis→HBase查位置→HDFS读文件

检索:上传图片→提取特征→向量检索→返回相似图

6. 设计一个Spark作业性能优化方案

要求:针对典型Spark作业,从资源、代码、数据三个维度优化

设计方案:

一、资源层面优化

1. 资源参数配置:

--num-executors 50        # Executor数量

--executor-cores 4        # 每个Executor CPU核数

--executor-memory 16G     # 每个Executor内存

--driver-memory 8G        # Driver内存

--conf spark.default.parallelism=400    # 默认并行度

--conf spark.sql.shuffle.partitions=400 # Shuffle分区数

  • 原则:CPU:内存 = 1:4~1:8
  • 并行度 = 总CPU核数 × 2~3

2. 序列化配置:

--conf spark.serializer=org.apache.spark.serializer.KryoSerializer

--conf spark.kryo.registrationRequired=true

  • Kryo序列化比Java快10倍,体积小
  • 注册自定义类,避免自动检测开销

二、代码层面优化

1. 算子优化:

  • 用reduceByKey/aggregateByKey替代groupByKey
  • 用mapPartitions替代map,减少初始化次数
  • 用foreachPartition替代foreach,批量写数据库
  • 避免Shuffle:小表broadcast后map-side join

2. 缓存优化:

  • 多次使用的RDD/DataFrame cache/persist
  • 选择合适存储级别:MEMORY_ONLY_SER
  • 及时unpersist释放内存

三、数据层面优化

1. 数据倾斜处理:

  • 过滤异常key:过滤null或无效key
  • 两阶段聚合:加盐局部聚合→去盐全局聚合
  • 倾斜Join:大key拆分,小key正常处理

2. 输入输出优化:

  • 输入:小文件合并,列式存储(Parquet/ORC)
  • 输出:压缩(Snappy/Gzip),合理分区数

四、Shuffle优化:

--conf spark.shuffle.file.buffer=64k

--conf spark.reducer.maxSizeInFlight=96m

--conf spark.shuffle.io.maxRetries=5

  • 增加Shuffle缓冲区,减少溢写
  • 调整重试次数,避免网络波动失败

7. 设计一个推荐系统的召回层架构

要求:支持多路召回、融合排序,基于Spark MLlib

设计方案:

召回层架构:多路召回→粗排→精排

一、多路召回策略(百级→千级)

1. 热门召回:

  • 全局热门、分类热门、趋势热门
  • 适用:新用户、冷启动
  • 实现:Spark统计T+1热门,Redis缓存

2. 协同过滤召回:

  • ItemCF:基于物品相似度召回

  - 模型:余弦相似度、共现矩阵

  - 更新:T+1离线计算相似度矩阵

  • UserCF:基于用户相似度召回

  - 适用:社交属性强的场景

3. 内容召回:

  • 基于标签:用户标签匹配物品标签
  • 基于向量:用户Embedding匹配物品Embedding
  • 实现:ANN向量检索(Faiss/Milvus)

4. 行为召回:

  • 浏览历史相似、购买历史相似
  • 序列召回:DIN/Transformer用户行为序列

二、粗排层(千级→百级)

  • 轻量级模型:LR、GBDT
  • 特征少、速度快
  • 过滤明显低质物品
  • 平衡性能和精度

三、精排层(百级→十量级)

  • 复杂模型:深度神经网络(Wide&Deep、DIN)
  • 丰富特征:用户特征、物品特征、上下文特征、交叉特征
  • 目标:CTR/CVR预估
  • 实现:TensorFlow/PyTorch训练,TensorFlow Serving在线服务

四、重排层

  • 业务规则:打散、去重、多样性
  • 上下文:位置偏差、时效性
  • 探索与利用:EE策略,推新

技术实现:

  • 离线:Spark训练模型、计算相似度
  • 存储:Redis存召回结果、HBase存特征
  • 在线:召回服务→粗排→精排→重排→返回

8. 设计一个多租户大数据平台的资源隔离方案

要求:支持多部门共享集群,资源隔离不互相影响

设计方案:

一、计算资源隔离(YARN)

1. 队列隔离:

  • 按部门划分YARN队列:root.data、root.algorithm、root.bi
  • 配置队列容量:

  ```xml

  <name>yarn.scheduler.capacity.root.data.capacity</name>

  <value>40</value>

  ```

  • 最大容量:允许弹性共享,如max-capacity=60
  • 访问控制:ACL控制哪些用户可以提交到队列

2. 资源限制:

  • 每个用户最大应用数
  • 每个队列最大资源占比
  • 任务优先级配置

二、存储资源隔离(HDFS)

1. 目录隔离:

  • 按部门划分HDFS目录:/user/data/、/user/bi/
  • 目录权限:700,只有部门用户可访问
  • HDFS Quota:空间配额+文件数配额

  ```bash

  hdfs dfsadmin -setSpaceQuota 100T /user/data

  hdfs dfsadmin -setQuota 1000000 /user/data

  ```

2. HBase租户隔离:

  • 按部门命名空间:namespace data_ns
  • 表级权限:grant权限控制
  • RegionServer分组:重要部门独占RegionServer

三、查询资源隔离

1. Hive权限:

  • Ranger/Sentry权限控制
  • 库、表、列级权限
  • 行级过滤、列级脱敏

2. 查询限流:

  • Presto/Spark SQL资源组
  • 每个用户最大并发查询数
  • 大查询自动kill

四、监控与计费

  • 资源使用监控:CPU、内存、存储
  • 计量计费:按资源使用量计费
  • 超用告警、资源调整
  • 租户SLA保障

9. 设计一个金融风控的实时特征计算架构

要求:支持毫秒级特征计算、特征回溯、特征一致性

设计方案:

一、实时特征分层架构

1. 特征数据源:

  • 实时事件:交易、登录、行为事件→Kafka
  • 维表数据:用户信息、设备信息→MySQL/HBase
  • 历史数据:用户历史行为→HDFS

2. 实时计算层(Flink):

  • 窗口特征:

  - 滚动窗口:近5分钟/1小时交易次数

  - 滑动窗口:近24小时交易金额

  - 会话窗口:用户会话内行为统计

  • 累计特征:

  - 历史累计交易次数、金额

  - 注册至今行为统计

  • 复杂特征:

  - 序列特征、交叉特征、统计特征

3. 特征存储层:

  • 在线特征:Redis Cluster,毫秒级查询

  - Key:user_id + feature_name

  - TTL:特征自动过期

  • 离线特征:HDFS,Parquet存储,用于模型训练
  • 特征仓库:Feature Store,特征管理和共享

二、关键技术点

1.  Exactly Once保证:

  • Flink Checkpoint
  • Kafka源幂等
  • Redis Sink两阶段提交

2. 特征回溯:

  • 离线回溯:Flink批处理重跑历史数据
  • 时间旅行:按时间点回溯特征值

3. 特征一致性:

  • 流批一体:同一套特征计算逻辑
  • 特征校验:实时离线特征值对比
  • 版本管理:特征版本化,可回滚

三、特征服务

  • 特征服务接口:REST/gRPC
  • 高并发:万级QPS,毫秒级响应
  • 特征拼接:自动拼接用户所有特征
  • 缓存:热点特征缓存

应用:

  • 实时风控决策:交易时拉取特征→模型打分→决策
  • 离线模型训练:批量特征导出

10. 设计一个数据中台的数据集成方案

要求:支持多源数据接入、统一元数据、数据血缘

设计方案:

一、数据接入层

1. 批量数据接入:

  • 关系型数据库:MySQL/Oracle → DataX/Sqoop → HDFS
  • 文件数据:FTP/OSS → 定时同步 → HDFS
  • 增量同步:CDC方式,Canal采集Binlog

2. 实时数据接入:

  • 日志数据:Filebeat/Fluentd → Kafka
  • 业务事件:SDK埋点 → Kafka
  • 数据库变更:Canal → Kafka

3. 接入方式:

  • 可视化配置:Web界面配置同步任务
  • 统一调度:Airflow定时调度
  • 监控告警:同步状态、数据量、延迟

二、元数据管理

1. 元数据采集:

  • 技术元数据:库表结构、字段类型、存储位置
  • 业务元数据:业务含义、负责人、标签
  • 操作元数据:读写权限、访问频率

2. 元数据服务:

  • 数据地图:全局数据搜索、表详情
  • 数据血缘:表级/字段级血缘关系
  • 数据词典:业务术语统一
  • 数据质量:质量报告、SLA

三、数据开发层

1. 统一计算引擎:

  • 离线计算:Spark SQL
  • 实时计算:Flink SQL
  • 交互式查询:Presto

2. 开发工具:

  • SQL编辑器:在线写SQL、语法检查
  • 任务调度:DAG依赖配置
  • 版本管理:SQL版本、回滚
  • 调试测试:测试环境、数据采样

四、数据服务层

1. 数据API:

  • 表自动生成API
  • SQL查询API
  • 支持分页、条件过滤

2. 数据输出:

  • 推送到业务库:MySQL/Elasticsearch
  • 数据订阅:Kafka消息推送
  • 文件导出:Excel/CSV下载

核心价值:

  • 数据统一接入,避免烟囱式开发
  • 元数据统一管理,数据可发现可理解
  • 开发效率提升,自助式数据分析

更多推荐