文档章节

Naive的Spark优化

princeicelk
 princeicelk
发布于 2016/07/20 14:58
字数 890
阅读 24
收藏 0

本文通篇抄袭以下文章,如有雷同,绝非巧合。

Spark 基础介绍

在讨论spark调优之前,先看看spark里的一些概念。

action

Action是得到非RDD结果的RDD操作。如Spark中有如下常见action操作: reduce, collect, count, first, take, takeSample, countByKey, saveAsTextFile

job

每个spark的action会被分解成一个job。

stage

一个job会被分成多组task,每组task称为一个stage。stage的划分界限为以下两种task之一:

  • shuffleMapTask - 所有的wide transformation之前,可以简单认为是shuffle之前
  • resultTask - 可以简单认为是take()之类的操作

partition

RDD 包含固定数目的 partition, 每个 partiton 包含若干的 record。

narrow tansformation (比如 map 和 filter)返回的 RDD,一个 partition 中的 record 只需要从父 RDD 对应的 partition 中的 record 计算得到。同样narrow transformation不会改变partition的个数。

task

被送到executor上执行的工作单元; 一个task只能做一个stage中的一个partition的数据。 tasks

操作调优

  • 调整在 stage 边届时的 partition 个数经常可以很大程度上影响程序的执行效率;
  • associative reductive operation, 能使用reduceByKey时不使用groupByKey,因为grouByKey会把所有数据shuffle一遍,而reduceByKey只会Shuffle reduce的结果。
  • 输入和输出结果不一样时,不使用reduceByKey,而使用aggregateByKey;

aggregateByKey: Aggregate the values of each key, using given combine functions and a neutral "zero value". This function can return a different result type, U, than the type of the values in this RDD, V. Thus, we need one operation for merging a V into a U and one operation for merging two U's, as in scala.TraversableOnce. The former operation is used for merging values within a partition, and the latter is used for merging values between partitions. To avoid memory allocation, both of these functions are allowed to modify and return their first argument instead of creating a new U.

  • 不要用flatMap-join-groupBy的模式,可以用cogroup;
  • 当两个reduceByKey的结果join时,如果大家的partition都一样,则spark不会在join时做shuffle;
  • 当一个内存能放得下的数据集join时,可以考虑broadcast而不使用join;
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

资源调优

spark中的资源可以简单归结为CPU和内存,而以下的参数会影响内存和CPU的使用。

  • executor 越大并行性越好,越大每个executor所有的内存就越小;
  • core,越大并行性越好;

HDFS client 在大量并发线程是时性能问题。大概的估计是每个 executor 中最多5个并行的 task 就可以占满的写入带宽。

  • partition,如果比excutor*core小则很傻;越多每个partition占用的内存就越少;足够大以后对性能提升不再有用。

我naive的认为应该这样调整:

  1. core = min(5,cpu核数);
  2. executor = instance数 * cpu核数 / core
  3. 平均每instance的executor个数决定executor.memory,从而决定shuffle.memory和storage.memory; spark memory
  4. 估计总数据量,即最大的shuffle时的数据大小(spark driver运行记录中会有shuffle size);
  5. 用4的结果除以3得到partition数,如果很小,把partition设成和(executor*core)的若干倍.

更精确的算计方法在文章开始的参考文献中有,要考虑scheduler(yarn/mesos/standalone)的不同以及master和slave的工作强度。


by ICE

© 著作权归作者所有

princeicelk
粉丝 16
博文 21
码字总数 17123
作品 0
静安
CTO(技术副总裁)
私信 提问
好程序员技术解析Hadoop和spark的性能比较

  好程序员技术解析 Hadoop和spark的性能比较,大数据培训一度受到广大IT爱好者的追捧,成为最热门的培训学科!前景无需多述,高薪就业,职场一片坦途!今天好程序员就为大家讲解下关于大数...

好程序员IT
06/12
10
0
Apache Spark 1.4 发布,开源集群计算系统

Apache Spark 1.4 发布,该版本将 R API 引入 Spark,同时提升了 Spark 的核心引擎和 MLlib ,以及 Spark Streaming 的可用性。部分重要更新如下: Spark Core Spark core 有多各方面的改进,...

oschina
2015/06/12
7.9K
10
Apache Spark 1.5.0 正式发布

Spark 1.5.0 是 1.x 系列的第六个版本,收到 230+ 位贡献者和 80+ 机构的努力,总共 1400+ patches。值得关注的改进如下: APIs:RDD, DataFrame 和 SQL 后端执行:DataFrame 和 SQL 集成:数...

oschina
2015/09/09
5.5K
8
Spark 2.0 时代全面到来 —— 2.0.1 版本发布

距离Spark 2.0.0发布两个月后,Spark 2.0.1版本发布了,这是一个修正版本,共处理了300多个Issue,涉及spark稳定性和bug等方面的修复 ,它的发布意味着Spark 2.0接近生产环境使用要求,想要尝...

达尔文
2016/10/08
13.4K
22
Apache Spark 系列技术直播 - Spark SQL进阶与实战

Spark SQL进阶与实战 Spark相关组件介绍 Spark及其依赖组件 Hive Metastore介绍 Spark Thrift Server介绍 表与ETL Spark表基本概念 Spark建表最佳实践 Spark ETL最佳实践 动态分区表示例分析...

开源大数据
2018/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部