Hadoop在Linux系统上的性能优化策略
ulimit -n 65536命令增大系统文件描述符上限,并修改/etc/security/limits.conf使设置永久生效。/etc/sysctl.conf文件:net.core.somaxconn = 65535 # 增大socket监听backlog上限
net.ipv4.tcp_max_syn_backlog = 65535 # 增大SYN队列长度
net.ipv4.ip_local_port_range = 1024 65535 # 扩大可用端口范围
执行sysctl -p使配置生效。/etc/sysctl.conf设置vm.swappiness = 0(禁用Swap),并执行sysctl -p生效。blockdev命令为Hadoop数据目录所在磁盘设置合理预读取缓冲区大小(如blockdev --setra 65536 /dev/sdb),减少磁盘寻道次数,提升顺序读性能。HDFS块大小调整:默认128MB的块大小适合小文件较多的场景,若处理大规模数据(如TB级),可将块大小增至256MB或512MB(通过dfs.blocksize参数设置),减少NameNode元数据压力。
副本因子优化:默认3副本适用于高容灾场景,若数据重要性较低(如临时数据),可将副本数减至2(通过dfs.replication参数设置),降低存储开销和网络传输成本。
MapReduce内存分配:合理分配Map/Reduce任务内存,避免因内存不足导致频繁GC或任务失败。例如:
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value> <!-- Map任务内存 -->
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value> <!-- Reduce任务内存(通常大于Map) -->
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3276m</value> <!-- Map任务JVM堆内存(不超过task.memory.mb的80%) -->
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144m</value> <!-- Reduce任务JVM堆内存 -->
</property>
YARN资源管理:优化YARN资源分配,提高集群利用率。例如:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>16384</value> <!-- NodeManager可用内存 -->
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value> <!-- NodeManager可用CPU核心数 -->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value> <!-- 单个任务最大可申请内存 -->
</property>
mapreduce.job.locality.wait参数(默认3秒)设置任务等待数据本地化的时间,优先将任务调度到存储数据的节点,减少网络传输开销。balancer工具定期均衡集群数据,避免部分节点负载过高(如数据倾斜),确保各节点资源利用率一致。mapreduce.task.io.sort.spill.compress)和最终输出(mapreduce.output.fileoutputformat.compress)启用压缩,减少磁盘I/O和网络传输量。推荐使用Snappy压缩算法(速度快,压缩比适中):<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
noatime选项(如mount -o noatime /dev/sdb1 /data),避免每次文件访问都更新访问时间,减少不必要的磁盘写操作。capacity-scheduler.xml)合理分配资源,设置不同业务的资源配额(如mapreduce.job.queuename),避免资源争抢。job.setCombinerClass),在Map端对相同key的数据进行本地聚合,减少Shuffle阶段的数据传输量。mapreduce.job.jvm.numtasks参数(默认1)设置JVM重用次数(如设置为3),减少JVM启动开销(适用于短生命周期的任务)。