博客
关于我
Spark&Spark性能调优实战(zhuan)
阅读量:797 次
发布时间:2023-04-04

本文共 1594 字,大约阅读时间需要 5 分钟。

Spark性能调优实例分析:从40秒到2.7秒的优化之路

在Spark大规模数据处理中,优化性能是技术工作者的重中之重。本文将详细讲述一个实际案例,通过系统化的方法,从40秒的查询时间优化至2.7秒,总共减少了11倍的查询时间。


场景描述

项目目标是一个容量为300GB的客户信息表的查询优化。该表是一个大宽表,共有1800多列,但实际有效使用的只有20多列。查询任务需要在Spark集群上完成,面临以下主要挑战:

  • 数据量大:300GB的数据存储在磁盘上,内存无法一次性加载。
  • 大宽表特性:1800多列的冗余数据带来查询性能瓶颈。
  • 资源利用率低:CPU、内存和网络资源的利用率都存在不足。

  • 优化效果

    通过系统化的优化方案,查询时间从最初的40.232秒降低至2.7秒,性能提升显著。具体优化步骤如下:


    优化过程

    第一步:压缩数据文件

    在初始阶段,我们发现磁盘I/O等待时间(iowait)较高,表明数据读取速度较慢。通过分析日志文件,我们推算出数据文件的总大小为300GB,显然无法一次性加载到内存中。

    为了解决这一问题,我们采取了数据压缩的方法。结合数据特点(大量0和1),选择了Gzip算法进行压缩。此次优化后,数据文件的大小降至1.9GB,查询时间从40.232秒降低至20.12秒。

    第二步:优化数据加载方式

    进一步分析发现,大宽表中有1800多列的冗余数据,但实际查询中只使用了20多列。我们选择使用RCFile(关系式列存储格式),只加载必要的有效列。这种方式将有效列以行存储的方式优化,使得查询速度提升了12秒,查询时间从20秒降至12秒。

    第三步:优化序列化机制

    随着查询时间的逐步优化,我们发现CPU负载依然过高。通过JProfile分析工具,我们发现序列化机制存在性能瓶颈。Spark提供了两种主要的序列化框架:Java的默认序列化和Kryo序列化框架。

    通过切换到Kryo序列化框架,Spark的性能得到了显著提升。Kryo序列化框架以其快速、高效的特性著称,查询时间从12秒降低至7秒。

    第四步:资源分配优化

    进一步分析发现,Spark集群的资源分配存在不均衡。通过调整Spark的运行参数,我们优化了资源分配策略:

    • SPARK_WORKER_INSTANCES:设置为4,增加任务并行度。
    • SPARK_WORKER_CORES:设置为3,充分利用每个节点的CPU资源。
    • SPARK_WORKER_MEMORY:设置为6G,确保内存充分利用。

    此次优化后,CPU资源利用率提升至90%,内存利用率稳定在85%。查询时间从7秒降低至5秒。

    第五步:解决SharkServer端GC问题

    在此基础上,我们发现SharkServer端出现明显的Full GC问题。通过调整SharkMaster的内存参数SHARK_MASTER_MEM至2G,解决了内存泄漏问题。查询时间进一步优化至3秒。

    第六步:优化宽表查询方式

    在查询过程中,我们发现当两表关联时,CPU资源出现瓶颈。进一步分析发现,日表在查询时采用了Gzip压缩,增加了IO瓶颈。解决方案是将日表转换为内存表,避免了数据压缩带来的性能损失。查询时间从3秒降低至2秒。


    总结

    优化是一个逐步求精的过程,需要从以下几个方面综合考虑:

  • 内存管理:通过压缩和选择合适的存储格式,充分利用内存资源。
  • CPU资源分配:合理设置Spark的任务并行度和核心数,提升CPU利用率。
  • I/O效率:优化数据读取方式,减少磁盘I/O等待时间。
  • 序列化机制:选择高效的序列化框架(如Kryo),提升数据处理速度。
  • 资源调优:通过合理设置Spark运行参数,充分利用集群资源。
  • 每一步优化都需要细致的数据分析和实验验证,最终目标是实现资源的最优利用和查询性能的最大提升。


    作者:zcc_0015

    发表时间:2014-08-09 22:09

    转载地址:http://qjrfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>