面试题答案
一键面试优化思路
- 数据本地化:
- 思路:尽量让Map任务在数据存储的节点上执行,减少数据在网络中的传输。HBase的数据存储在RegionServer上,通过数据本地化策略,MapReduce任务可以直接在存储数据的RegionServer节点上处理数据,避免了跨节点的数据传输。
- MapReduce相关:MapReduce框架会尝试将Map任务调度到数据所在的节点执行。通过配置
mapreduce.jobtracker.taskScheduler
为org.apache.hadoop.mapred.FairScheduler
(公平调度器)或org.apache.hadoop.mapred.CapacityScheduler
(容量调度器),这两个调度器在一定程度上会考虑数据本地化因素,优先将任务分配到数据所在节点。 - HBase相关:HBase本身的Region分布机制有助于数据本地化。确保RegionServer负载均衡,避免Region过度集中在少数节点,可通过
hbase.regionserver.balancer.period
(默认值为300000,即5分钟)等参数调整负载均衡执行的周期,使Region分布更合理,利于数据本地化。
- 压缩数据:
- 思路:在数据传输前对数据进行压缩,减少数据传输量,从而降低网络传输延迟。
- MapReduce相关:设置
mapreduce.map.output.compress
为true
开启Map输出的压缩,mapreduce.map.output.compress.codec
指定压缩编解码器,如org.apache.hadoop.io.compress.GzipCodec
(压缩率高,但压缩和解压缩速度相对较慢)、org.apache.hadoop.io.compress.SnappyCodec
(压缩和解压缩速度快,但压缩率相对较低)。对于Reduce输出,设置mapreduce.output.fileoutputformat.compress
为true
,mapreduce.output.fileoutputformat.compress.codec
指定相应的编解码器。 - HBase相关:HBase表可以在创建时指定压缩方式,如
HColumnDescriptor.addCompressionType(Compression.Algorithm.SNAPPY)
,使用Snappy压缩算法,这样在数据写入HBase时就进行压缩,减少存储和传输的数据量。
- 调整网络配置:
- 思路:优化网络带宽、调整网络拓扑结构等,从硬件层面提升网络性能。
- MapReduce相关:通过
mapreduce.task.io.sort.mb
参数调整Map任务排序时使用的内存大小,合理设置该值可以减少磁盘I/O,间接减少网络传输压力。因为排序过程如果内存足够,就不需要频繁地将数据写入磁盘再读出,进而减少数据在网络中传输的机会。 - HBase相关:
hbase.regionserver.handler.count
(默认值为30)表示RegionServer处理请求的线程数,适当增加该值可以提高RegionServer处理网络请求的能力,但要根据服务器硬件资源合理调整,避免线程过多导致系统资源耗尽。
- 优化数据读取和写入:
- 思路:减少不必要的数据读取和写入,只传输和处理需要的数据。
- MapReduce相关:在Map阶段,可以通过设置
InputFormat
来过滤数据,如org.apache.hadoop.mapreduce.lib.input.NLineInputFormat
可以按行数读取数据,避免读取过多不必要的数据。在Reduce阶段,合理设置Reduce
任务的数量,通过mapreduce.job.reduces
参数调整,避免Reduce任务之间过多的数据混洗(Shuffle),减少网络传输。 - HBase相关:在读取HBase数据时,使用
Scan
对象设置合理的列族和列限定符,只读取需要的列数据,如Scan scan = new Scan(); scan.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1"))
,避免全表扫描读取大量不必要的数据。在写入HBase时,使用BufferedMutator
批量写入数据,减少写入操作的次数,从而减少网络传输。可以通过BufferedMutatorParams
设置批量写入的缓冲区大小等参数,如BufferedMutatorParams params = new BufferedMutatorParams(TableName.valueOf("table1")); params.writeBufferSize(1024 * 1024 * 5)
(设置缓冲区大小为5MB)。