Spark性能调优

Spark性能调优——基础篇 本文要解决的问题: Spark在使用过程中不可避免的需要进行一系列的性能优化,本文就Spark性能调优的基础部分进行总结和归纳(开发调优和资源调优),参考了不少前辈的文章,在此非常感谢。目的在大数据的领域,Spark已经成为了不可或缺的一部分,被越来越多的人使用。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常 阅读详情

文章转载:http://gad.qq.com/article/detail/20239

通常我们对一个系统进行性能优化无怪乎两个步骤——性能监控和参数调整,本文主要分享的也是这两方面内容。

一、性能监控工具
【Spark监控工具】
  Spark提供了一些基本的Web监控页面,对于日常监控十分有用。
1、Application Web UI
  http://master:4040(默认端口是4040,可以通过spark.ui.port修改)可获得这些信息:
  (1)stages和tasks调度情况;
  (2)RDD大小及内存使用;
  (3)系统环境信息;
  (4)正在执行的executor信息。
2、history server
  当Spark应用退出后,仍可以获得历史Spark应用的stages和tasks执行信息,便于分析程序不明原因挂掉的情况。配置方法如下:
(1)

$SPARK_HOME/conf/spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.retainedApplications=50
Dspark.history.fs.logDirectory=hdfs://hadoop000:8020/directory"

  说明:spark.history.retainedApplica-tions仅显示最近50个应用spark.history.fs.logDirectory:Spark History Server页面只展示该路径下的信息。
(2)

$SPARK_HOME/conf/spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop000:8020/directory #应用在运行过程中所有的信息均记录在该属性指定的路径下

3、spark.eventLog.compress true

(1)HistoryServer启动
$SPARK_HOMR/bin/start-histrory-server.sh
(2)HistoryServer停止
$SPARK_HOMR/bin/stop-histrory-server.sh

4、ganglia通过配置ganglia,可以分析集群的使用状况和资源瓶颈,但是默认情况下ganglia是未被打包的,需要在mvn编译时添加-Pspark-ganglia-lgpl,并修改配置文件 SPARKHOME/conf/metrics.properties。5、Executorlogs  Standalone模式: SPARK_HOME/logs
  YARN模式:在yarn-site.xml文件中配置了YARN日志的存放位置:yarn.nodemanager.log-dirs,或使用命令获取yarn logs -applicationId。监控工具】
1、Nmon(http://www.ibm.com/developerworks/aix/library/au-analyze_aix/)
Nmon 输入:c:CPU n:网络 m:内存 d:磁盘

2、Jmeter(http://jmeter. apache.org/)
  通常使用Jmeter做系统性能参数的实时展示,JMeter的安装非常简单,从官方网站上下载,解压之后即可使用。运行命令在%JMETER_HOME%/bin下,对于 Windows 用户,直接使用jmeter.bat。
  启动jmeter:创建测试计划,设置线程组设置循环次数。
  添加监听器:jp@gc - PerfMon Metrics Collector。

  设置监听器:监听主机端口及监听内容,例如CPU。

  启动监听:可以实时获得节点的CPU状态信息,从图4可看出CPU已出现瓶颈。

3、Jprofiler(http://www.ej-technologies.com/products/jprofiler/overview.html)
  JProfiler是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程式。它把CPU、线程和内存的剖析组合在一个强大的应用中。JProfiler的GUI可以更方便地找到性能瓶颈、抓住内存泄漏(memory leaks),并解决多线程的问题。例如分析哪个对象占用的内存比较多;哪个方法占用较大的CPU资源等;我们通常使用Jprofiler来监控Spark应用在local模式下运行时的性能瓶颈和内存泄漏情况。

  上述几个工具可以直接通过提供的链接了解详细的使用方法。

二、Spark调优
【Spark集群并行度】
  在Spark集群环境下,只有足够高的并行度才能使系统资源得到充分的利用,可以通过修改spark-env.sh来调整Executor的数量和使用资源,Standalone和YARN方式资源的调度管理是不同的。
 

 在Standalone模式下:
1、每个节点使用的最大内存数:SPARK_WORKER_INSTANCES*SPARK_WORKER_MEMORY;
2、每个节点的最大并发task数:SPARK_WORKER_INSTANCES*SPARK_WORKER_CORES。
  在YARN模式下:
1、集群task并行度:SPARK_ EXECUTOR_INSTANCES* SPARK_EXECUTOR_CORES;
2、集群内存总量:(executor个数) * (SPARK_EXECUTOR_MEMORY+ spark.yarn.executor.memoryOverhead)+(SPARK_DRIVER_MEMORY+spark.yarn.driver.memoryOverhead)。
  重点强调:Spark对Executor和Driver额外添加堆内存大小,Executor端:由spark.yarn.executor.memoryOverhead设置,默认值executorMemory * 0.07与384的最大值。Driver端:由spark.yarn.driver.memoryOverhead设置,默认值driverMemory * 0.07与384的最大值。

  通过调整上述参数,可以提高集群并行度,让系统同时执行的任务更多,那么对于相同的任务,并行度高了,可以减少轮询次数。举例说明:如果一个stage有100task,并行度为50,那么执行完这次任务,需要轮询两次才能完成,如果并行度为100,那么一次就可以了。
  但是在资源相同的情况,并行度高了,相应的Executor内存就会减少,所以需要根据实际实况协调内存和core。此外,Spark能够非常有效的支持短时间任务(例如:200ms),因为会对所有的任务复用JVM,这样能减小任务启动的消耗,Standalone模式下,core可以允许1-2倍于物理core的数量进行超配。

【Spark任务数量调整】
  

Spark的任务数由stage中的起始的所有RDD的partition之和数量决定,所以需要了解每个RDD的partition的计算方法。以Spark应用从HDFS读取数据为例,HadoopRDD的partition切分方法完全继承于MapReduce中的FileInputFormat,具体的partition数量由HDFS的块大小、mapred.min.split.size的大小、文件的压缩方式等多个因素决定,详情需要参见FileInputFormat的代码。

【Spark内存调优】
  

内存优化有三个方面的考虑:对象所占用的内存,访问对象的消耗以及垃圾回收所占用的开销。
1、对象所占内存,优化数据结构
  Spark 默认使用Java序列化对象,虽然Java对象的访问速度更快,但其占用的空间通常比其内部的属性数据大2-5倍。为了减少内存的使用,减少Java序列化后的额外开销,下面列举一些Spark官网

(http://spark.apache.org/docs/latest/tuning.html#tuning-data-structures)提供的方法。

(1)使用对象数组以及原始类型(primitive type)数组以替代Java或者Scala集合类(collection class)。fastutil 库为原始数据类型提供了非常方便的集合类,且兼容Java标准类库。
(2)尽可能地避免采用含有指针的嵌套数据结构来保存小对象。
(3)考虑采用数字ID或者枚举类型以便替代String类型的主键。
(4)如果内存少于32GB,设置JVM参数-XX:+UseCom­pressedOops以便将8字节指针修改成4字节。与此同时,在Java 7或者更高版本,设置JVM参数-XX:+UseC­­­­­ompressedStrings以便采用8比特来编码每一个ASCII字符。
2、内存回收
(1)获取内存统计信息:优化内存前需要了解集群的内存回收频率、内存回收耗费时间等信息,可以在spark-env.sh中设置SPARK_JAVA_OPTS=“-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps $ SPARK_JAVA_OPTS”来获取每一次内存回收的信息。
(2)优化缓存大小:默认情况Spark采用运行内存(spark.executor.memory)的60%来进行RDD缓存。这表明在任务执行期间,有40%的内存可以用来进行对象创建。如果任务运行速度变慢且JVM频繁进行内存回收,或者内存空间不足,那么降低缓存大小设置可以减少内存消耗,可以降低spark.storage.memoryFraction的大小。
3、频繁GC或者OOM
  针对这种情况,首先要确定现象是发生在Driver端还是在Executor端,然后在分别处理。
  Driver端:通常由于计算过大的结果集被回收到Driver端导致,需要调大Driver端的内存解决,或者进一步减少结果集的数量。
  Executor端:
(1)以外部数据作为输入的Stage:这类Stage中出现GC通常是因为在Map侧进行map-side-combine时,由于group过多引起的。解决方法可以增加partition的数量(即task的数量)来减少每个task要处理的数据,来减少GC的可能性。
(2)以shuffle作为输入的Stage:这类Stage中出现GC的通常原因也是和shuffle有关,常见原因是某一个或多个group的数据过多,也就是所谓的数据倾斜,最简单的办法就是增加shuffle的task数量,比如在SparkSQL中设置SET spark.sql.shuffle.partitions=400,如果调大shuffle的task无法解决问题,说明你的数据倾斜很严重,某一个group的数据远远大于其他的group,需要你在业务逻辑上进行调整,预先针对较大的group做单独处理。

【修改序列化】
  使用Kryo序列化,因为Kryo序列化结果比Java标准序列化更小,更快速。具体方法:spark-default.conf 里设置spark.serializer为org.apache.spark.serializer.KryoSerializer 。
  参考官方文档(http://spark.apache.org/docs/latest/tuning.html#summary):对于大多数程序而言,采用Kryo框架以及序列化能够解决性能相关的大部分问题。

【Spark 磁盘调优】
  在集群环境下,如果数据分布不均匀,造成节点间任务分布不均匀,也会导致节点间源数据不必要的网络传输,从而大大影响系统性能,那么对于磁盘调优最好先将数据资源分布均匀。除此之外,还可以对源数据做一定的处理:
1、在内存允许范围内,将频繁访问的文件或数据置于内存中;
2、如果磁盘充裕,可以适当增加源数据在HDFS上的备份数以减少网络传输;
3、Spark支持多种文件格式及压缩方式,根据不同的应用环境进行合理的选择。如果每次计算只需要其中的某几列,可以使用列式文件格式,以减少磁盘I/O,常用的列式有parquet、rcfile。如果文件过大,将原文件压缩可以减少磁盘I/O,例如:gzip、snappy、lzo。

【其他】
  广播变量(broadcast)
  当task中需要访问一个Driver端较大的数据时,可以通过使用SparkContext的广播变量来减小每一个任务的大小以及在集群中启动作业的消耗。参考官方文档http://spark.apache.org/docs/latest/tuning.html#broadcasting-large-variables。

三、开启推测机制
  推测机制后,如果集群中,某一台机器的几个task特别慢,推测机制会将任务分配到其他机器执行,最后Spark会选取最快的作为最终结果。
  在spark-default.conf 中添加:spark.speculation true
  推测机制与以下几个参数有关:
1、spark.speculation.interval 100:检测周期,单位毫秒;
2、spark.speculation.quantile 0.75:完成task的百分比时启动推测;
3、spark.speculation.multiplier 1.5:比其他的慢多少倍时启动推测。

四、总结
  Spark系统的性能调优是一个很复杂的过程,需要对Spark以及Hadoop有足够的知识储备。从业务应用平台(Spark)、存储(HDFS)、操作系统、硬件等多个层面都会对性能产生很大的影响。借助于多种性能监控工具,我们可以很好地了解系统的性能表现,并根据上面介绍的经验进行调整。
spark性能调优 spark性能调优有很多措施,下面说说我用到的一些调优手段。 1.RDD分片数和executor个数的协调 要想充分的使数据并行执行,并且能充分的利用每一个executor,则在rdd的个数与executor的个数之间要有一个合适的值。若rdd的个数较多而executor的个数较少,则会导致部分rdd需要等待空闲的executor,这样不能使所有数据同时并行执行。若rdd较少,而executo 阅读详情

相关推荐

Spark性能调优2-总结分享

1、Spark调优背景 目前Zeppelin已经上线一段时间,Spark作为底层SQL执行引擎,需要进行整体性能调优,来提高SQL查询效率。本文主要给出调优的结论,因为涉及参数很多,故没有很细粒度调优,但整体调优方向是可以得出的。 环境:服务器600+,spark 2.0.2,hadoop 2.6.0 2、调优结果 调优随机选取线上9条SQL,表横轴是调优测试项目,测试在集群空闲情况下...

简单就好 7568

讨论Spark的配置监控和性能优化

讨论Spark的配置监控和性能优化(某课程笔记)   上完这节课以后,你将能够描述集群的概念 通过修改Spark的属性,环境变量,或者是日志属性来配置Spark 使用Web端界面,以及各种不同的外部工具来监控Spark和应用程序     在Spark集群中有三种主要的组成部分。驱动程序,是放置主程序中SparkContext的地方,要运行一个集群,你需要一个集群管理器 它可以是单机

feige1990的专栏 931

Spark 内存管理 spark.executor.memory /spark.memory.fraction/spark.memory.offHeap.size【堆外内存/内存管理】 钨丝计划

spark.executor.memory 包含spark.memory.fraction; spark.memory.fraction 包含 spark.memory.storageFraction; spark 2.4.5 Application Properties Property Name Default Meaning spark.app.name (none) The name of your application. This will appear in.

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 6959

Spark3.1.2 on k8s配置日志存储路径:spark-defaults.conf

Spark3.1.2 on k8s配置日志存储路径:spark-defaults.conf 使用的Hadoop版本是2.7.3 HDFS端口号9000 192.168.x.x是Hadoop的namenode节点IP地址 18080是默认的历史日志的端口号 spark.yarn.historyServer.address=192.168.x.x:18080 spark.history.ui.port=18080 spark.eventLog.enabled true spark.eventLo

zhangvalue的博客 3153

Spark调优:性能调优、JVM调优、shuffle调优、算子调优、troubleshooting调优、数据倾斜

目录 一、性能调优 1、分配资源 2、提高spark运行的并行度 3、重构RDD架构以及RDD持久化 4、使用广播变量 5、使用Kryo序列化 6、使用fastutil集合 7、调节数据本地化等待时长(s) 二、JVM调优 1、JVM调优:降低cache操作的内存占比 2、JVM调优:executor堆外内存与连接等待时长 三、shuffle性能调优 1、shuffle的原理 2、shuf...

Big_data_implicit_ 3075

手把手教你用CsvView分析大疆无人机飞行日志(附实战CTF题解)

本文详细介绍了如何使用CsvView工具分析大疆无人机飞行日志,包括环境搭建、日志提取、核心功能解析及CTF实战技巧。通过实战案例,帮助读者掌握无人机取证的关键技术,提升日志分析能力,特别适合网络安全竞赛和实际取证场景。

weixin_42652674的博客 459

spark 查看 job history 日志

SPARK_HOME/conf 下: spark-defaults.conf 增加如下内容 Spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/var/log/spark spark.eventLog.com...

cihongmo6452的博客 285

北航机器学习期末考试试题2020年春

北航机器学习期末考试试题2020春 看csdn上试题收费,积分还挺高,本着共享的理念,把2020春季ML考试的试题公开,若侵权,立删 前8道题10分,第9题20分 决策树采用ID3算法 对宇宙星球是否适合生存分类 SVM的原理;软间隔、硬间隔;以及对非线性样本点分类 集成学习的原理,以及及串行boosting以及bagging的简单概括 K-means与混合高斯模型的异同以及EM算法的原理,如何计算 马尔可夫随机场最大团;马尔可夫随机场的联合概率分布(势函数表示),贝叶斯网络联合概率分布 PCA主成分基于

qq_43343919的博客 5424

Spark 线程问题、日志文件过大

1. Spark 线程问题 实时服务器部署着多个Spark和Flink实时任务,Spark任务运行一段时间后发现几个任务异常结束,将失败的任务重启。运行几分钟,发现本来运行正常的任务也异常结束,重启多次依旧如此。开始怀疑是集群资源不足造成了,查看CM中 Yarn的资源池发现资源充足,接着查看运行失败任务的日志,发现共同异常:unable to create new native thread 出现问题找根本原因,于是就问了度娘,解决方法如下: 1、查看系统线程数 ulimit -u 这是修改后的,修改

搬砖の隔壁老王 1333

Python爬虫实战:如何优雅地处理BOSS直聘的反爬机制与Cookie失效问题

本文详细介绍了如何通过Python爬虫技术优雅应对BOSS直聘的反爬机制与Cookie失效问题。从多账号轮换、动态请求头生成到代理IP管理,提供了一套完整的解决方案,帮助开发者构建稳定高效的数据采集系统,有效提升爬虫成功率与数据质量。

weixin_30733003的博客 1564

weblogic启动异常故障处理(boot认证失败)

root 用户生成的文件属主为 root,WebLogic进程将无权读取,直接导致认证失败。· ⚠️ 密码必须完全一致:第3步 AdminAccount 命令中设置的密码,与第5步所有 boot.properties 文件中 password= 字段的值,必须保证完全一致。如果您的域下配置了受管服务器实例(如 ms_server1、ms_server2 等),必须逐一更新各实例下的免密启动文件,确保实例重启时密码与AdminServer保持一致,否则实例启动会因认证失败而报错。此步骤至关重要,必须执行。

weixin_53389944的博客 224

Spark性能调优--资源参数调优、算子调优、Shuffle参数调优、Spark 数据倾斜调优

一、资源参数调优 了解完了Spark作业运行的基本原理之后,对资源相关的参数就容易理解了。所谓的Spark资源参数调优,其实主要就是对Spark运行过程中各个使用资源的地方,通过调节各种参数,来优化资源使用的效率,从而提升Spark作业的执行性能。以下参数就是Spark中主要的资源参数,每个参数都对应着作业运行原理中的某个部分,我们同时也给出了一个调优的参考值。 num-executors   参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向...

. 9596

车载以太网抓包实战:100BASE-T1/1000BASE-T1高效监控方案解析

本文深入解析了车载以太网100BASE-T1/1000BASE-T1的高效抓包监控方案。针对智能汽车开发中的故障排查与性能测试需求,详细对比了交换机镜像、TAP分流和捕获模块三大主流方案的原理、核心优势与适用场景,并提供了基于实战经验的选型指南与操作避坑要点,帮助工程师精准定位网络问题。

desk3的博客 429

Spark优化----Spark 性能调优

本文介绍了Spark的常规性能调优;算子调优;Shuffle调优;JVM调优

天冬忘忧的博客 3323

PX4从放弃到精通(二十八):垂起过渡控制

固件版本:1.14.0可加名片交流学习。

超维空间科技的博客 2874

3. UFS 电气时钟、复位、信号和电源

当接收到用于从 HS-MODE 到 LS-MODE 转换的 DME_POWERMODE.ind 或用于从 HS-MODE 到 HIBERN8 转换的 DME_HIBERNATE_ENTER.ind 时,UFS 主机可以启动一个计时器。在整个 PA_INIT 过程中,不应门控参考时钟。如果 UFS 主机启动从 HS-MODE 到 LS-MODE 或 HIBERN8 的电源模式更改,则应确保在关闭参考时钟之前,至少已经经过了由 bRefClkGatingWaitTime 定义的最小时间间隔,见图 6.3。

qq_42238448的博客 1293

【Spark】Spark性能调优

本文介绍了十种调优策略,如调整Spark的配置参数、优化数据存储格式(如Parquet和ORC)、避免不必要的shuffle操作、合理设置并行度、充分利用内存和缓存、使用广播变量减少数据传输等方式,来提升作业的执行速度和资源利用率。

DataCrafter的博客 1609

C#上位机3D可视化:HelixToolkit.Wpf集成点云/模型(机器人臂姿态实时监控)

核心控件是3D可视化的核心,需搭配和网格辅助定位;模型加载:按关节拆分机械臂模型,通过组合平移+旋转实现姿态控制;姿态更新:将机器人关节角度转换为3D模型的旋转变换,工业场景需从控制器实时获取角度;点云渲染:通过实现点云加载,需注意坐标系转换和性能优化。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 716

Spark 性能调优

  该篇我们将会从如下几个方向进行Spark性能调优的学习:     • Spark的监控     • Spark调优要点     • Spark数据倾斜调优     • Spark资源运行参数调优     • Spark程序开发调优     • Spark Shuffle调优     • JVM GC优化   1.Spark的监控     • Spark Web UI:Sp...

程序员学习圈 712

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

spark性能调优总结

0.性能调优大纲 调优简介 开发调优 资源调优 数据倾斜调优 shuffle调优 jvm调优 1. 调优简介 ​ ​ 为啥要做调优,上图已经告诉我们答案了~ 2. 开发调优 ​ 开发出高质量的代码,从如下几个角度去说明,当然避免使用一些性能比较低的算子,使用一些占用空间比较小的数据结构,使用一些占用体积比较小的序列化的方式等等。 2.1. 避免创建重复的RDD ...

wuyangcc的博客 543

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spark 性能调优之Shuffle调优

Shuffle调优一:调节map端缓冲区大小 在Spark任务运行过程中,如果shuffle的map端处理的数据量比较大,但是map端缓冲的大小是固定的,可能会出现map端缓冲数据频繁spill溢写到磁盘文件中的情况,使得性能非常低下,通过调节map端缓冲的大小,可以避免频繁的磁盘IO操作,进而提升Spark任务的整体性能。 map端缓冲的默认配置是32KB,如果每个task处理640KB的数据,...

@小刘同学nice 5331

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spark性能调优——扩展篇

本文要解决的问题:从更深层次考虑,对Spark进行性能调优。目的继基础篇分析了开发调优与资源调优之后,本文作为拓展篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题。数据倾斜调优简述有时候,大家可能会遇到大数据开发过程中一个比较棘手的问题,那就是数据倾斜,此时Spark作业的性能会比预期差很多,数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的

Miracle_shen的博客 1万+
上一篇: Hadoop Balancer运行速度优化
下一篇: 基于YARN集群构建运行PySpark Application
Ronney-Hua
博客等级 码龄10年 48粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值