面试题答案
一键面试1. 数据从HBase读取
- 基本原理:通过HBase的
InputFormat
实现从HBase表中读取数据。一般使用TableInputFormat
,它会依据HBase表的分区信息,将数据按区域(Region)划分为多个输入分片(Input Split),每个分片对应一个Map任务的输入数据。 - 优化点:
- 合理设置扫描范围:避免全表扫描,通过指定行键范围、列族和列限定符等,减少读取的数据量。
- 批量读取:启用批量读取(
scan.setBatch()
),减少HBase RPC调用次数,提高读取效率。
2. Map阶段处理
- 基本原理:每个Map任务处理一个输入分片的数据。Map函数将从HBase读取的每一行数据(
KeyValue
对形式)解析,根据业务逻辑进行转换、过滤等操作,并输出中间结果(<key, value>
对)。 - 优化点:
- 数据本地化:MapReduce框架尽量将Map任务调度到存储数据的节点上执行,减少数据传输开销。
- 减少中间数据输出:在Map函数内进行必要的过滤和合并操作,避免输出大量不必要的中间数据。
- 使用Combiner:如果Map输出的数据在本地可以进行部分聚合,可定义Combiner函数,在Map端提前聚合,减少传输到Reduce的数据量。
3. Reduce阶段聚合
- 基本原理:Reduce任务接收Map任务输出的中间结果,按照相同的键进行分组,然后对每个键对应的所有值进行聚合操作,生成最终的输出结果。
- 优化点:
- 合理设置Reduce任务数量:避免Reduce任务过多或过少,过多会增加调度开销,过少可能导致数据倾斜。可以根据数据量和聚合逻辑估算合适的Reduce数量。
- 处理数据倾斜:对于倾斜的键值,可采用预聚合、随机打散等方法,使数据更均匀地分配到各个Reduce任务。
- 优化聚合算法:选择高效的聚合算法,如使用
HashMap
进行快速的键值查找和聚合。