硬件选择与配置
确保master节点(如NameNode、JournalNode)的配置(CPU、内存、磁盘)优于slave节点(如DataNode、TaskTracker),以承担更重的元数据管理任务;优先使用SSD替代传统机械硬盘,显著提升HDFS的读写性能;根据集群规模和业务需求增加内存,尤其是NameNode和DataNode的内存,以处理更大规模的数据存储和任务执行。
操作系统调优
调整系统参数以增加同时打开的文件描述符数量(fs.file-max,如设置为800000)和网络连接数(net.core.somaxconn,如设置为32767),避免因资源限制导致任务失败;彻底关闭swap分区(通过sysctl vm.swappiness=0或修改/etc/fstab),防止Hadoop守护进程将数据交换到磁盘,严重影响性能;优化磁盘预读取缓冲区大小(使用blockdev --setra命令),减少磁盘寻道时间,提升IO效率。
JVM参数调优
针对Hadoop版本调整JVM堆内存大小(如Hadoop 2.x系列的NameNode内存可设置为服务器内存的3/4),避免内存溢出;选择合适的垃圾回收器(如G1GC,通过-XX:+UseG1GC启用)并优化其参数(如-XX:MaxGCPauseMillis=200),减少垃圾回收导致的停顿时间,提升JVM运行效率。
Hadoop配置参数调优
HDFS参数:根据数据规模调整NameNode的心跳并发数(dfs.namenode.handler.count,如设置为20*log2(集群节点数)),提升元数据管理能力;根据数据访问特性调整块大小(dfs.block.size,如128MB或256MB),减少元数据数量并提高大文件处理效率;合理设置副本因子(dfs.replication,如生产环境常用3),平衡数据可靠性与存储开销。
YARN参数:根据集群内存资源调整NodeManager的资源分配(yarn.nodemanager.resource.memory-mb,如设置为物理内存的80%)、CPU核心数(yarn.nodemanager.resource.cpu-vcores,如设置为物理核心数的80%);合理设置Container的最小/最大内存分配(yarn.scheduler.minimum-allocation-mb、yarn.scheduler.maximum-allocation-mb),避免资源浪费或不足。
MapReduce参数:根据任务数据量调整Map/Reduce任务的内存上限(mapreduce.map.memory.mb、mapreduce.reduce.memory.mb)和CPU核心数(mapreduce.map.cpu.vcores、mapreduce.reduce.cpu.vcores);优化Shuffle阶段的环形缓冲区大小(mapreduce.task.io.sort.mb,如100MB),减少磁盘IO次数;合理设置Reducer数量(mapreduce.job.reduces,如根据数据倾斜情况调整),提升并行处理能力。
数据压缩技术
选择高效的压缩算法(如Snappy、LZO,通过io.compression.codecs参数配置),在保证压缩比的同时降低CPU开销;对MapReduce任务的中间结果(mapreduce.map.output.compress=true)和最终输出(mapreduce.output.fileoutputformat.compress=true)进行压缩,减少网络传输量和磁盘存储开销。
数据本地化优化
通过机架感知策略(dfs.network.script配置机架信息)提高数据本地化处理率,尽量让任务在数据所在节点执行,减少网络传输;合理设置副本策略(如将副本分布在不同机架),进一步提升数据本地化效率。
网络优化
调整TCP/IP参数(如net.core.rmem_default、net.core.wmem_default,均设置为64MB),增大网络缓冲区大小,提升数据传输效率;若网络设备支持,启用Jumbo帧(如MTU设置为9000),减少网络包头开销,提高大文件传输速度。
性能监控与测试
使用Hadoop自带的监控工具(如ResourceManager Web UI、NodeManager Web UI、JMX)实时监控集群资源使用情况(内存、CPU、磁盘IO、网络带宽)和任务执行状态(任务耗时、失败率);定期使用Hadoop自带测试工具(如hadoop jar hadoop-mapreduce-client-jobclient-*-tests.jar TestDFSIO进行读写测试)验证优化效果,根据监控结果调整参数。