温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spark 在 Linux 上如何进行性能调优

发布时间:2025-09-14 02:38:57 来源:亿速云 阅读:126 作者:小樊 栏目:系统运维

以下是Spark在Linux上的性能调优关键策略,涵盖资源、配置、代码及工具层面:

一、资源分配优化

  • Executor配置
    • --num-executors:根据集群资源设置(建议50~100),避免过多导致资源碎片。
    • --executor-memory:分配6~10GB内存,大任务可提高至16GB,需预留部分堆外内存(spark.executor.memoryOverhead,建议为内存的10%~20%)。
    • --executor-cores:设置为2~4核,提升并行度,避免单核负载过高。
  • 动态资源分配:启用spark.dynamicAllocation.enabled=true,按需伸缩Executor数量,减少空转资源浪费。

二、并行度与任务调度优化

  • 调整分区数
    • spark.default.parallelism:设为Executor总CPU核数的2~3倍(如Executor有100核,可设200~300),平衡任务分配。
    • spark.sql.shuffle.partitions:默认200,数据量大时可调至800~1500,避免Shuffle数据倾斜。
  • 避免小文件问题
    • 通过spark.sql.files.maxPartitionBytes控制分区大小(如128MB),减少小文件读取开销。

三、数据倾斜处理

  • 加盐技术:对倾斜Key添加随机前缀(如key+随机数),分散到不同分区,再通过reduceByKey聚合。
  • 广播小表:使用broadcast(df)将小表广播到所有节点,避免Shuffle(需设置spark.sql.autoBroadcastJoinThreshold,默认10MB,可调至50MB)。
  • 两阶段聚合:先局部聚合(map端),再全局聚合,适用于倾斜的groupByKey场景。
  • 启用AQE:Spark 3.x默认开启自适应查询执行(spark.sql.adaptive.enabled=true),自动优化Join策略和分区。

四、序列化与内存管理

  • 使用Kryo序列化:设置spark.serializer=org.apache.spark.serializer.KryoSerializer,并注册自定义类,减少序列化开销。
  • 缓存策略:对重复使用的RDD/DataFrame使用cache()persist(StorageLevel.MEMORY_AND_DISK),避免重复计算。

五、Shuffle与I/O优化

  • 调整Shuffle参数
    • spark.shuffle.file.buffer:增大Map端缓冲区(默认32KB,可设64KB~128KB),减少磁盘I/O。
    • spark.reducer.maxSizeInFlight:增大Reduce端拉取数据块大小(默认48MB,可设96MB~128MB),提升拉取效率。
  • 存储格式优化:优先使用列式存储(Parquet/ORC),启用向量化读取(spark.sql.parquet.enableVectorizedReader=true)。

六、监控与调优工具

  • Spark UI:通过http://<driver-node>:4040监控Stage执行时间、Shuffle数据量、Executor内存使用等,定位长尾任务或数据倾斜。
  • 日志分析:查看Executor GC日志,若频繁Full GC,需增加spark.executor.memoryOverhead或优化缓存使用。

七、硬件与环境优化

  • 存储设备:使用SSD替代HDD,提升I/O速度。
  • 网络配置:确保集群节点间网络低延迟,避免跨节点数据传输瓶颈。

参考来源

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI