大数据相关面试题每日五问(九)
- YARN的资源调度器在多租户场景下的核心区别是什么?如何选择?
- Spark Shuffle过程中,数据倾斜通常有哪些表现?你会采取哪些优化手段?
- Hive中分区表Partition和分桶表Bucket的设计目的是什么?实际使用时如何抉择?
- MySQL的索引在哪些场景下会失效?请举例说明常见的索引优化误区。
- 数据仓库中处理缓慢变化维SCD时,类型1和类型2策略的核心差异是什么?如何实现类型2维表的历史数据保留?
✅ 1. YARN 的资源调度器在多租户场景下的核心区别是什么?如何选择?
YARN 提供了三种主流资源调度器:CapacityScheduler、FairScheduler 和 FIFO,其中 CapacityScheduler 按队列设置容量和权重,适合多租户之间资源隔离和稳定保障;FairScheduler 则强调公平分配资源,空闲资源自动分配给需要的任务,适合资源动态抢占、并发任务高的场景;而 FIFO 是默认调度器,按任务提交顺序执行,适合简单单租户环境。在多租户场景中,若任务具有 SLA 要求,需保障资源分配,优先选择 CapacityScheduler;若追求资源高利用率和公平性,可选用 FairScheduler。
✅ 2. Spark Shuffle 过程中,数据倾斜通常有哪些表现?你会采取哪些优化手段?
Spark Shuffle 过程中数据倾斜主要表现为:某些 task 执行时间远高于其他 task,导致整体 stage 被拖慢,常发生在 groupByKey、reduceByKey、join 等宽依赖操作中,尤其是 key 分布不均时。优化方法包括:1)使用 map-side 聚合(如 combineByKey 替代 groupByKey)减少数据量;2)对热点 key 做“key 拆分+随机前缀+后聚合”;3)采用广播 join,避免大表与小表 shuffle;4)通过 repartition 或 coalesce 合理调整分区数;5)设置 spark.sql.adaptive.enabled=true
启用 AQE 动态优化,自动处理倾斜。
✅ 3. Hive 中分区表 Partition 和分桶表 Bucket 的设计目的是什么?实际使用时如何抉择?
Hive 中的分区(Partition)是将表按某列的值水平划分为多个目录,减少扫描范围,提升查询性能,适用于大范围过滤字段(如按天、地区查询);分桶(Bucket)是将数据按某列 hash 后再分成若干文件,提升 join、采样查询效率,适用于分布均匀、join 频繁的列。实际使用中,若查询常根据某字段过滤,应使用分区;若需高效 join 或 map-side join,可使用分桶;两者也可结合使用,但过多分区或分桶会导致元数据膨胀和小文件问题,需权衡使用。
✅ 4. MySQL 的索引在哪些场景下会失效?请举例说明常见的索引优化误区。
MySQL 的索引会在以下场景中失效:如 where 条件中对索引列使用函数或运算(如 where year(create_time)=2023
)、模糊匹配左侧加通配符(如 like '%abc'
)、范围查询后再排序(如 where age > 20 order by name
)、组合索引未按最左前缀原则使用。此外,错误使用覆盖索引、盲目建立过多索引、忽略更新代价等都是常见误区。例如给频繁变动的低基数字段建索引反而拖慢写入性能,需综合分析字段选择性和业务场景来优化索引设计。
✅ 5. 数据仓库中处理缓慢变化维 SCD 时,类型 1 和类型 2 策略的核心差异是什么?如何实现类型 2 维表的历史数据保留?
缓慢变化维(SCD)处理维表字段随时间变化的问题,其中类型1策略直接覆盖旧值,不保留历史,适用于不关心历史变更的维度(如手机号);而类型2策略保留历史版本,新增一条记录标记生效时间和失效时间(或添加当前标志字段),适用于分析历史状态变化(如客户等级、地区)。实现方式为:新增字段如 start_date
、end_date
、is_current
,每次更新新插入一条记录,并将旧记录标记为历史,保证维度追溯性。
努力找实习中,整理一些大数据相关面试题和大家分享,共同学习进步,有建议或批评欢迎留言!