Hadoop在Ubuntu上的性能调优需围绕硬件配置、Hadoop参数、资源管理、数据策略、作业优化五大维度展开,以下是具体技巧:
硬件是性能基础,需根据集群规模匹配资源:
dfs.datanode.data.dir)。yarn.nodemanager.resource.memory-mb(NodeManager可用内存)、mapreduce.map.memory.mb(Map任务内存上限)、mapreduce.reduce.memory.mb(Reduce任务内存上限)等参数,避免内存溢出。yarn.nodemanager.resource.cpu-vcores(NodeManager可用CPU核心数)、mapreduce.map.cpu.vcores(Map任务CPU核心数)、mapreduce.reduce.cpu.vcores(Reduce任务CPU核心数)。/etc/sysctl.conf,调整vm.swappiness(降低至10-20,减少内存交换)、net.core.rmem_max/net.core.wmem_max(增大网络缓冲区,提升网络吞吐)。HDFS参数
dfs.blocksize设置),减少元数据操作和Map任务数量(每个Block对应一个Map任务)。dfs.namenode.handler.count(NameNode并发处理线程数,默认10,可调整至30+)、dfs.datanode.handler.count(DataNode并发处理线程数,默认10,可调整至20+),提升HDFS操作效率。dfs.replication(默认3,小集群可设为2,减少存储开销)。MapReduce参数
mapreduce.job.maps(Map任务数量,默认1,可调整为集群核心数×2)、mapreduce.job.reduces(Reduce任务数量,默认1,可调整为集群核心数×1),避免任务过少(等待)或过多(竞争资源)。mapreduce.map.output.compress(默认false)开启Map输出压缩(使用Snappy或Lzo编解码器,mapreduce.map.output.compress.codec),减少网络传输量。mapreduce.reduce.shuffle.input.buffer.percent(Reduce接收缓冲区占比,默认0.7,可增至0.8)、mapreduce.reduce.shuffle.merge.percent(缓冲区合并阈值,默认0.66,可增至0.7),减少磁盘IO。YARN参数
Capacity Scheduler(适合多租户)或Fair Scheduler(适合公平分配),通过yarn.scheduler.capacity.maximum-am-resource-percent(ApplicationMaster资源占比,默认0.1,可增至0.2)调整资源分配策略。yarn.scheduler.minimum-allocation-mb(容器最小内存,默认1GB,可调整至2GB)、yarn.scheduler.maximum-allocation-mb(容器最大内存,默认8GB,可调整至16GB),避免资源浪费。yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb控制容器资源上下限,避免单个任务占用过多资源导致其他任务饥饿。mapreduce.map.speculative(默认true)、mapreduce.reduce.speculative(默认false),对慢任务启动备份任务,提升整体作业完成速度(适用于易出现长尾的任务)。mapreduce.job.locality.wait(默认3秒,可调整至5-10秒)控制任务等待数据本地化的时间,尽量让Map任务运行在数据所在节点,减少网络传输。CombineTextInputFormat替代默认TextInputFormat,或通过hadoop archive命令合并小文件,减少Map任务数量(每个小文件对应一个Map任务,过多会降低并行效率)。SequenceFile(二进制格式,支持压缩)、ORCFile(列式存储,适合OLAP)或Parquet(列式存储,支持谓词下推),提升数据读取效率。job.setCombinerClass)合并中间结果,减少Reduce阶段输入数据量(适用于求和、计数等可聚合操作)。mapreduce.job.reduce.slowstart.completedmaps(默认0.05,可调整至0.8)延后Reduce任务启动,让Map任务先完成更多数据,均匀分布负载;或使用自定义分区器(Partitioner)优化数据分布。mapreduce.map.java.opts、mapreduce.reduce.java.opts,默认1GB,可调整至2-4GB),避免内存溢出;开启GC日志(-XX:+PrintGCDetails)分析GC情况,优化GC策略(如使用G1GC)。以上技巧需结合集群规模、业务场景(如批处理、实时分析)和数据特性(如文件大小、数据分布)灵活调整,建议通过基准测试(如TestDFSIO、TeraSort)验证优化效果。