” 性能调优的王道,就是增加和分配更多的资源,如果说你的spark作业,能够分配的资源达到了你的能力范围的顶端之后,无法再分配更多的资源了,那么才是考虑去做后面的其他性能调优的点“ — 中华石杉

场景

用户session分析模块,代码已撸完,且在本地测试通过,接下来要干嘛呢?对,性能调优。

  • 性能调优的必要性
    传统J2EE项目重在架构与组建的可扩展性(当然,高并发网站除外),而大数据项目性能调优很关键。一个可正常运行的spark查询作业,未调优前可能要运行 18个小时,调优后可能只需要2个小时 - 写到这里,Snail感觉棒棒滴:搞scala、搞spark能真正体现一个程序员的价值.
  • 怎么进行性能调优
    snail在[0.0.0]中引入了三级调优这个概念(哈哈,三级调优)。本文详谈第一级调优中的 最大化资源配置 . 本文中的资源是指executor数量(一般是一个worker上,一个executor,至于在一个worker上分配多个executor,snail只知道这是可行的,但是应用场景目前还不知道)、为每个executor分配的core(就是计算单元,又称做逻辑CPU)与memeory 。在进入主题前,snail打算先在本地跑跑spark内置的交互式作业spark-shell,并写一个降序排列的word count小样来回顾一下spark作业整体运行流程,以期温故而知新:

spark运行环境: 2核 4G Ubuntu 14.04 LTS

1、spark-shell 代码与执行结果

scala>  val log = sc.parallelize(List("we are the one are come come one are come ont come on are"))
log: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:27scala> val flag = log.flatMap(line=>line.split(" ")).map(word=>(word,1)).reduceByKey(_+_).map(pair =>(pair._2,pair._1)).sortByKey(false,1).cache
flag: org.apache.spark.rdd.RDD[(Int, String)] = ShuffledRDD[5] at sortByKey at <console>:29scala> flag.collect.foreach(println)
16/07/01 07:26:40 WARN SizeEstimator: Failed to check whether UseCompressedOops is set; assuming yes
(4,are)
(4,come)
(2,one)
(1,we)
(1,on)
(1,ont)
(1,the)scala> 

2、web UI 监控结果

作业被2个shuffle操作,划分成了3个stage

stage0中共包含2个task,在唯一的一个2core 的executor上并行运行完成

分配的资源为:一个executor 共2core 1024M内存。

分析

调节最优的资源配置涉及到三个话题:分配哪些资源、在哪里分配这些资源、分配多少资源以及为什么多分配了这些资源以后性能会得到提升?

  • 分配哪些资源
    executor、cpu per executor、memory per executor以及driver memory

  • 在哪里分配这些资源
    在生产环境中,提交spark作业时,用的是spark-submit shell脚本。在这里面通过调整对应的参数实现资源分配:

/usr/local/spark/bin/spark-submit \
--class cn.spark.sparktest.core.WordCountCluster \
--num-executors 3 \  配置executor的数量
--driver-memory 100m \  配置driver的内存(影响不大)
--executor-memory 100m \  配置每个executor的内存大小
--executor-cores 3 \  配置每个executor的cpu core数量
/usr/local/SparkTest-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
  • 分配多少资源
    一句话,有可用资源就分配多少,具体:
    第一种,Spark Standalone部署模式。公司集群上,搭建了一套Spark集群,你心里应该清楚每台机器还能够给你使用的,大概有多少内存,多少cpu core;那么,设置的时候,就根据这个实际的情况,去调节每个spark作业的资源分配。比如说你的每台机器能够给你使用4G内存,2个cpu core;共20台机器;那么可供你分配的资源是:executor = 20;平均每个executor 分配:4G内存,2个cpu core。
    第二种,Yarn部署模式。查看你的spark作业,要提交到的资源队列,大概有多少资源?500G内存,100个cpu core;那么你可以这样分配:executor=50;平均每个executor分配:10G内存,2个cpu core。

  • 为什么多分配了这些资源以后性能会得到提升

并行执行能力 = 同时运行的tasks = executors * (为每个executor分配的cores)

一、增加executors
增加executor,就意味着可并行执行的task数量增多了。原来是 2个executor;2 cores & 4 G / executor .现在是 4个executor;2 cores & 4 G / executor。那么每次可并行处理的task由原来的 2*2 ,升级到现在的 4*2,并行执行能力直接翻倍。

二、增加每个executor的逻辑cpu数量

三、增加每个executor的内存量
更多的内存,意味着更少的磁盘I/O操作
1、如果需要对RDD进行cache,那么更多的内存,就可以缓存更多的数据,将更少的数据写入磁盘,甚至不写入磁盘;
对于shuffle类操作,会需要内存来存放从map端读取的数据并进行聚合,更多的内存意味着减少甚至不需要磁盘I/O操作
2、task的具体执行,可能会创建很多的对象。如果内存比较少,就可能导致:
频繁的JVM堆内存不够用 => 频繁的GC进行垃圾回收(minor GC和full GC) => GC时,task直接停止运行

总结

  • 分配最多的集群资源,最多意味着最优
  • 在spark-submit时分配资源
  • 并行执行能力 = 同时运行的tasks = executors * (cores/executor)

传说中的shuffle调优、扩大广播变量、调节数据本地化等待时长等邪门怪招都远不及分配更多的资源对性能提升来的猛烈-性能调优从最大化资源配置开始!

Snail此刻的心情,是舒畅滴。

[3.0.0]性能调优之最大化资源配置相关推荐

  1. Web2.0网站性能调优实践(引用王宗义)

    Web2.0网站性能调优实践 当前web2.0革命风起云涌,web2.0强调服务,而服务最基本的要求是速度快和稳定,离开这两个谈功能强大和易用性都没有任何意义.本文介绍一些关于笔者运营一个web2.0 ...

  2. 国产数据库清单;微盟《生产环境和数据恢复》;TiDB招聘;Oracle备份还原指南、GaussDB性能调优指南……墨天轮数据库周刊-第5期

    热门资讯 1.国产数据库清单(2020年第1季度)发布! modb.pro/db/22488 [摘要]本文统计了国产数据库产品清单,共58个产品仅供参考,同时在清单下方简单整理了各产品的基本介绍.应用 ...

  3. 【Elasticsearch】es 5.3.0 bulk index 性能调优实践

    1.概述 转载:elasticsearch5.3.0 bulk index 性能调优实践 一.集群基本信息 每天日志量70亿 ES版本: 5.3.0 机器部署 master node: 3台 data ...

  4. Java5.0垃圾回收性能调优-1、简介,2、Ergonomics工效学[Vange译]

    Introduction 简介 The JavaTM 2 Platform Standard Edition (J2SETM platform) is used for a wide variety ...

  5. 如何合理的规划一次jvm性能调优

    这是jvm优化系列第三篇: jvm优化--垃圾回收 jvm优化--监控工具 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论 ...

  6. 如何合理的规划一次 JVM 性能调优

    转载自   如何合理的规划一次 JVM 性能调优 摘要: JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响,那么如何进行一次优雅的调优,提升应用的性能? 这是 JVM ...

  7. aix系统java堆_浅谈AIX环境下的Java性能调优

    1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...

  8. 如何合理的规划jvm性能调优

    JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响.但也有一些基础的理论和原则,理解这些理论并遵循这些原则会让你的性能调优任务将会更加轻松.为了更好的理解本篇所介绍的内 ...

  9. 大厂运维必备技能:PB级数据仓库性能调优

    摘要:众所周知,数据量大了之后,性能是大家关注的一点,所以我们在业务开发的时候,特别关注性能,做为一个架构师,必须对性能要了解,要懂.才能设计出高性能的业务系统. 一.GaussDB分布式架构 所谓集 ...

最新文章

  1. 64 任务调度神器 Airflow
  2. 高斯投影正反算C语言程序代码,高斯投影正反算-对网络上面流行的C代码的修改(已正确运行)...
  3. 线段 LibreOJ - 10007(贪心)
  4. 国际站html代码,国际站必须看得懂的HTML代码
  5. CC攻击及其解决方法
  6. [中等]寻找缺失的数
  7. 两个网口芯片接一个变压器_电路中网络变压器件选型和PCB
  8. 信息论基础——消息,信息,信号区别 信息的度量
  9. Anylogic问题-----模型运行中外部输入控制模型
  10. python怎么添加ui_大神可以帮我看看怎么把这个python代码利用ui运行呢
  11. Windows域/域树/域林的简单区别
  12. 在分析仪中创建用户自定义的TRL校准件【以RS矢量网络分析仪为例】
  13. 一只老鸟嵌入式工程师的血泪史!
  14. 逻辑代数几个重要定理
  15. python编写简单四则运算程序
  16. python无向带权图
  17. Root mapping definition has unsupported parameters
  18. access令两列运算得到新属性_大学Access期末各章课后复习题
  19. 财务软件性能测试要求,财务报表性能测试总结 - 泊 涯 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  20. 传奇服务器端回满血文件夹,传奇服务端修改求助

热门文章

  1. FFmpeg代码编程获取视频信息
  2. FileInputFormat.setInputPaths的执行原理
  3. 摄影基础教程第三天(二)
  4. 七、Java 14 新特性
  5. Shell编程——字符截取命令
  6. jQuery图片滑块动画
  7. android桌面文件夹美化
  8. 【数据分析实战】基于python对Airbnb房源进行数据分析
  9. android 开发工具—AndroidStudio获取SHA1值
  10. 有一种爱情叫做“比悲伤更悲伤的故事”