Hadoop与Spark参数如何高效配置与优化?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 参数 正文

Hadoop 核心参数配置

Hadoop 的参数主要配置在两个地方:

  1. hadoop-env.sh: 设置环境变量,如 JAVA_HOME
  2. 核心配置文件 (core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml): 定义 HDFS、YARN 和 MapReduce 的运行行为。

HDFS 相关参数 (hdfs-site.xml)

参数 描述 推荐值/调优建议
dfs.replication 数据块的默认副本数。 通常为 3,对于测试环境或热数据,可以适当降低;对于冷数据或高可靠性要求场景,可以设置为 3 或更高。
dfs.blocksize HDFS 数据块的大小。 根据文件类型调整
- 小文件场景: 128MB 或 256MB,减少元数据压力。
- 大文件场景: 256MB 或 512MB,减少寻址时间,提高 MapReduce/Spark 读取效率。
dfs.namenode.handler.count NameNode 处理客户端请求的线程数。 默认为 10,如果集群并发请求很高(如大量客户端同时访问),可以适当增加,例如设置为 50-100。
dfs.datanode.max.transfer.bytes DataNode 单次 RPC 传输的最大字节数。 默认为 0(无限制),如果网络不稳定,可以设置一个合理的值,如 128MB,防止单个请求占用过多资源。
dfs.datanode.balance.bandwidthPerSec DataNode 之间进行负载均衡时的最大带宽(字节/秒)。 根据网络带宽设置,如果网络是 1Gbps,可以设置为 64m128m,避免影响正常业务。

YARN 相关参数 (yarn-site.xml)

YARN 是 Hadoop 的资源管理器,其参数对 Spark 性能影响巨大。

参数 描述 推荐值/调优建议
yarn.nodemanager.resource.memory-mb 每个 NodeManager 可用的物理内存总量(MB)。 设置为 Node 物理内存的 80%-90%,为操作系统和其他进程预留资源。
yarn.scheduler.maximum-allocation-mb 单个 ApplicationMaster 或 Container 能申请的最大内存(MB)。 根据业务需求设置,防止一个任务耗尽整个 Node 的内存,通常设置为 yarn.nodemanager.resource.memory-mb 的 1/4 到 1/2。
yarn.nodemanager.resource.cpu-vcores 每个 NodeManager 可用的虚拟 CPU 核心数。 设置为 Node 物理 CPU 核心数
yarn.scheduler.maximum-allocation-vcores 单个 ApplicationMaster 或 Container 能申请的最大虚拟 CPU 核心数。 设置为 yarn.nodemanager.resource.cpu-vcores 的 1/2 到 1
yarn.nodemanager.pmem-check-enabled / yarn.nodemanager.vmem-check-enabled 是否检查容器使用的物理/虚拟内存。 建议设置为 false,Spark 的内存管理模型与 YARN 的内存检查不完全兼容,禁用可以避免因计算内存和堆内存混淆导致的任务失败。
yarn.resourcemanager.scheduler.class YARN 调度器类型。 默认为 CapacityScheduler,推荐使用,它支持多队列、资源容量和优先级,适合生产环境。
yarn.app.mapreduce.am.resource.mb MapReduce ApplicationMaster 的内存。 默认为 1536MB,如果任务复杂,可以适当增加。

MapReduce 相关参数 (mapred-site.xml)

参数 描述 推荐值/调优建议
mapreduce.map.memory.mb / mapreduce.reduce.memory.mb Map 和 Task 的默认内存(MB)。 需要根据 YARN 的配置进行调整,通常设置为 yarn.scheduler.maximum-allocation-mb 的 1/2 或更小,确保有资源运行多个 Task。
mapreduce.task.io.sort.mb 用于 Map 端排序的缓冲区大小(MB)。 默认为 100MB,对于大数据量的 Map 任务,增加此值可以减少磁盘溢写次数,提高性能,设置为 200-400MB。
mapreduce.reduce.shuffle.input.buffer.percent Reduce 任务中用于缓存 Map 输出数据的堆内存百分比。 默认为 0.7,Reduce 阶段数据量大,可以适当提高,如 0.8。
mapreduce.job.reduces 作业的 Reduce 任务数量。 *经验公式:`集群总核心数 2 ~ 2.5`**,合适的 Reduce 数量可以充分利用集群资源,避免数据倾斜导致的单个 Reduce 任务过慢。

Spark 核心参数配置

Spark 的参数主要通过 spark-submit 命令的 --conf 选项或 spark-defaults.conf 文件来设置,参数分为两类:静态资源分配动态资源分配

资源分配参数 (最关键)

参数 描述 推荐值/调优建议
--executor-cores 每个 Executor 使用的 CPU 核心数。 根据 CPU 密集型或内存密集型任务调整
- CPU 密集型: 设置为 2-4,让每个 Executor 充分利用 CPU。
- I/O 或 Shuffle 密集型: 设置为 1-2,减少单个 Executor 的内存压力,增加并行度。
注意: --executor-cores * --num-executors 不能超过 YARN 的总核心数。
--executor-memory 每个 Executor 的内存大小。 公式: (可用物理内存 per Node - YARN 容器开销) / 每个节点的 Executor 数量,通常设置为 4GB, 8GB, 16GB 等 2 的幂次方。
--num-executors 启动的 Executor 总数。 核心调优参数,公式:集群总核心数 / --executor-cores,需要根据 YARN 的可用资源进行调整,一个 20 核的集群,--executor-cores=5,则 --num-executors=4
--driver-memory Driver 进程的内存。 默认为 1G,Driver 需要处理大量数据(如 collect() 操作或广播大变量),需要增加,2G, 4G。
--conf spark.dynamicAllocation.enabled 是否启用动态资源分配。 对于交互式查询或批处理任务,强烈建议启用 true,它可以根据负载自动增减 Executor,提高资源利用率。
--conf spark.shuffle.service.enabled 启用 Shuffle 服务(配合动态分配使用)。 spark.dynamicAllocation.enabled=true 时,必须设置为 true,以便释放的 Executor 可以被其他任务回收。
--conf spark.dynamicAllocation.minExecutors / maxExecutors / initialExecutors 动态分配的最小、最大和初始 Executor 数。 initialExecutors 可以根据作业规模设置一个初始值,快速启动任务。
maxExecutors 防止资源无限增长,保护集群。
minExecutors 保证作业有最基础的资源。

内存管理参数

参数 描述 推荐值/调优建议
--conf spark.executor.memoryOverhead 每个 Executor 额外分配的非堆内存(用于 JNI、Spark 内部开销等)。 *默认为 `executorMemory 0.1,至少为 384MB**,如果任务出现OutOfMemoryError`,特别是 GC 问题,可以适当增加此值。
--conf spark.memory.fraction Executor 内存中用于执行和缓存的堆内存比例。 默认为 0.6,即 60% 用于执行,40% 用于缓存(如 cache()),如果缓存数据多,可以适当提高此值;如果计算密集,可以降低。
--conf spark.memory.storageFraction 缓存内存中可被执行器借用的比例。 默认为 0.5,即 50% 的缓存内存是“硬”的,不能被借用;50% 是“软”的,当执行器需要时可以借用。

Shuffle 性能参数

参数 描述 推荐值/调优建议
--conf spark.shuffle.partitions Shuffle 阶段产生的分区数。 默认为 200,这是影响 Reduce 阶段并行度的关键参数,对于大数据集,可以设置为 --num-executors * --executor-cores * 2 ~ 3,以增加并行度,缓解数据倾斜。
--conf spark.sql.shuffle.partitions Spark SQL 中 Shuffle 的分区数。 默认为 200,同样可以根据数据量调整。
--conf spark.shuffle.io.preferDirectBufs Shuffle 读写是否使用直接内存。 默认为 true,对于大内存节点,使用直接内存可以减少拷贝,提高性能,但如果内存紧张,可以设为 false 使用堆内存。

序列化参数

参数 描述 推荐值/调优建议
--conf spark.serializer 使用的序列化类。 默认为 org.apache.spark.serializer.JavaSerializer,性能较差强烈建议在生产环境中设置为 org.apache.spark.serializer.KryoSerializer,Kryo 序列化速度更快,体积更小。
--conf spark.kryo.registrationRequired 是否要求 Kryo 注册类。 设置为 true 可以更安全,避免序列化问题,然后使用 --conf spark.kryo.classesToRegister 来注册自定义类。

Hadoop 与 Spark 参数的联动与最佳实践

  1. YARN 是基础: Spark 运行在 YARN 上,YARN 的资源配置 (yarn.nodemanager.resource.memory-mb, yarn.scheduler.maximum-allocation-mb) 是 Spark 资源分配的上限。必须先确保 YARN 配置合理,再调优 Spark 参数

  2. Spark 参数在 YARN 限额内: --executor-memory * --num-executors 的总和不能超过 YARN 的总可用内存。--executor-cores * --num-executors 的总和不能超过 YARN 的总可用 CPU。

  3. 动态分配是利器: 对于生产环境的批处理和交互式查询,开启 Spark 的动态资源分配 (spark.dynamicAllocation.enabled=true) 是提高集群资源利用率最有效的方法之一,它能根据作业负载自动伸缩 Executor 数量。

  4. 监控与调优循环: 参数调优不是一蹴而就的,需要结合监控工具(如 Spark UI, YARN UI, Ganglia, Prometheus)来观察作业的运行情况,如 GC 时间、Shuffle 读写时间、任务执行时间等,然后针对性地调整参数。

  5. 关注 Shuffle: Shuffle 是 Spark 性能的瓶颈之一,通过调整 spark.shuffle.partitions 可以有效控制 Shuffle 的并行度和数据量,从而缓解数据倾斜。

  6. 内存管理是核心: Spark 的内存模型相对复杂,当遇到 OutOfMemoryError 时,首先要分析是堆内存不足还是非堆内存(memoryOverhead)不足,然后相应地调整 --executor-memory--conf spark.executor.memoryOverhead

希望这份详细的参数列表和建议能帮助你更好地理解和调优你的 Hadoop 和 Spark 集群!

-- 展开阅读全文 --
头像
智能机器人如何精准实现跟随应用?
« 上一篇 今天
Vostro 14 3000拆机步骤详解?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]