Linux下Hadoop性能调优技巧
Hadoop在Linux环境中的性能表现受硬件配置、操作系统参数、Hadoop自身设置及数据处理策略等多因素影响。以下是针对性的优化技巧:
硬件是性能基础,需根据集群规模和业务需求选择合适的硬件:
net.core.somaxconn增大socket监听backlog,net.ipv4.tcp_max_syn_backlog提升SYN队列长度),减少节点间数据传输瓶颈。调整Linux内核参数,适配Hadoop的高并发需求:
ulimit -n 65536命令增加系统允许同时打开的文件描述符上限(默认1024太小),避免HDFS大量文件打开时报错。vm.swappiness=0(在/etc/sysctl.conf中),关闭操作系统使用swap分区,防止内存不足时频繁换页导致性能下降。net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT连接)、net.ipv4.tcp_fin_timeout=30(缩短FIN等待时间),提升网络吞吐能力。dfs.blocksize(默认128MB),根据数据访问模式增大至256MB或512MB(如批处理场景),减少NameNode的元数据压力(块越大,元数据越少)。dfs.replication(默认3),根据数据重要性降低至2(非关键数据)或提高至4(关键数据),平衡可靠性与存储成本。mapreduce.map.memory.mb(默认1024MB,可根据128MB数据/G内存原则调整至2048MB)、mapreduce.reduce.memory.mb(默认1024MB,调整至4096-8192MB),避免任务因内存不足被杀死。mapreduce.map.cpu.vcores(默认1)、mapreduce.reduce.cpu.vcores(默认1),计算密集型任务可增加至2-4核。mapreduce.task.io.sort.mb(默认100MB,调整至200MB)减少溢写次数;调整mapreduce.reduce.shuffle.parallelcopies(默认5,调整至10)提升Reduce拉取Map数据的并行度;设置mapreduce.reduce.input.buffer.percent(默认0,调整至0.2)允许Reduce直接从Map端缓冲区读取数据,减少磁盘IO。yarn.nodemanager.resource.memory-mb(节点可用内存,如16GB)、yarn.nodemanager.resource.cpu-vcores(节点可用CPU核数,如8核),合理分配给Container;调整yarn.scheduler.maximum-allocation-mb(单个任务最大内存,如8192MB),避免单个任务占用过多资源。mapreduce.job.locality.wait(默认3秒)设置任务等待数据本地化的时间,尽量让计算任务在存储数据的节点上运行,减少网络传输开销(可降低30%以上网络流量)。hdfs balancer命令定期均衡集群数据,避免部分节点负载过高(如数据倾斜导致某些节点CPU利用率达100%)。mapreduce.map.output.compress=true、mapreduce.output.fileoutputformat.compress=true),选择Snappy(速度快)或LZO(压缩率高)编码器(如Snappy可将数据压缩至原大小的1/3-1/2,减少IO和网络传输)。CombineTextInputFormat替代默认TextInputFormat,合并小文件(如小于128MB的文件),减少Map任务数量(如1000个小文件可合并为10个Map任务);自定义分区函数(实现Partitioner接口),避免数据倾斜(如按key哈希分区时,某些key的数据量过大)。CombineTextInputFormat(设置mapreduce.input.fileinputformat.split.minsize,如256MB),将多个小文件合并为一个InputSplit,减少Map任务数量(如1000个10MB文件可合并为40个Map任务)。.har文件(如hadoop archive -archiveName myhar.har -p /input/dir /output/dir),减少NameNode元数据压力(如100万个小文件可归档为1个HAR文件)。