spark调优系列之高层通用调优

一,并行度

集群不会被充分利用,除非您将每个操作的并行级别设置得足够高。Spark自动会根据文件的大小,是否可分割等因素来设置map的数目(后面会详细讲解输入格式,同时详细讲解各种输入的map数的决定)。对于分布式reduce操作,例如groupbykey和reducebykey,默认它使用的是分区数最大的父RDD的分区数决定reduce的数目。你也可以通过设置spark.default.parallelism来改变默认值,建议值是每个CPU执行2-3个tasks。

二,Reduce任务的内存使用

有时候内存溢出并不是由于你的RDD不适合放在内存里面,而是由于你的某个task的工作集太大了,比如使用groupbykey的时候reduce任务数据集太大了。Spark的shuffle操作(sortByKey, groupByKey, reduceByKey, join, etc)会构建一个hash表,每个task执行一个分组的数据,单个往往会很大。最简单的改善方法是增加并行度,让每个task的输入变得更小。Spark可以高效的支持短达200ms的任务,因为复用了Executor的JVM,这可以降低启动成本,所以你可以很安全的增加并行度,使其超过你的集群core数目。

三,广播变量

使用spark的广播功能可以大幅度减少每个序列化后的task的大小,也可以减少在集群中执行一个job的代价。如果你的任务中使用了大的对象,比如静态表,可以考虑将它声明成广播变量。在driver节点,spark会打印出每个task序列化后的大小,所以你可以通过查看task的大小判断你的task是否过大,通常task的大小超过20KB就值得调优了。

四,数据本地性

数据的本地性可能会对Spark jobs产生重大影响。如果数据和在其上操作的代码在一起,则计算往往是快速的。但如果代码和数据分开,则必须要有一方进行移动。典型的情况是将序列化后的代码移动到数据所在的地方,因为数据往往比代码大很多。Spark构建调度计划的原则就是数据本地性。

数据本地性就是数据离处理他的代码有多远。根据数据和代码当前的位置,数据本地性等级。从最近到最远的顺序列出如下:

1,PROCESS_LOCAL

数据和代码在同一个JVM中,这是最佳的数据本地性。

2,NODE_LOCAL

数据和代码在相同的节点。比如数据在同一节点的HDFS上,或者在统一节点的Executor上。由于数据要在多个进程间移动,所以比PROCESS_LOCAL稍慢。

3,NO_PREF

数据可以从任何地方快速访问,没有数据本地性。

4,RACK_LOCAL

数据和代码在相同的机架。数据位于同一机架上的不同服务器上,因此需要通过网络发送,通常通过单个交换机发送

5,ANY

数据在网络上的其他地方,而不在同一个机架中。

Spark倾向于调度任务依据最高的数据本地性,但这往往是不可能的。在任何空闲的Executor上没有未处理数据的情况下,Spark会切换到较低的数据本地性。这种情况下会有两个选择:

1),等待CPU空闲,然后在相同的server上启动task。

2),立即在一个需要迁移数据的较远位置启动一个新的task。

Spark的典型处理策略是等待繁忙CPU释放,时间很短。一旦超时,将移动数据到空闲CPU的地方执行任务。每个级别之间的回退等待超时可以在一个参数中单独配置或全部配置。如果任务较长,且数据本地性较差,可以适当调整Spark.locatity超时时间相关的配置。具体配置如下:

属性

默认值

含义

spark.locality.wait

3s

超时时间,放弃等待在较低数据本地性新启任务。

spark.locality.wait.node

spark.locality.wait

NODE_LOCAL等待超时时间

spark.locality.wait.process

spark.locality.wait

PROCESS_LOCAL等待超时时间

spark.locality.wait.rack

spark.locality.wait

RACK_LOCAL等待超时时间

五,总结

主要调优就是序列化和内存调优

Spark的技巧性调优点很多,很难在短篇幅文中讲解后面会结合spark源码进行彻底讲解。欢迎大家持续关注浪尖公众号。

本文分享自微信公众号 - Spark学习技巧(bigdatatip)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

HDFS 核心原理

HDFS(Hadoop Distribute File System)是一个分布式文件系统 文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文件放到...

34570
来自专栏恰童鞋骚年

Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我...

31210
来自专栏Jed的技术阶梯

Spark性能调优06-JVM调优

再JVM虚拟机中,当创建的对象的数量很多时,Eden 和 Survior1 区域会很快的满溢,就需要进行频繁地 Minor GC,这样会导致有一些生命周期较短的...

14710
来自专栏JAVA技术站

Sqoop的安装与Mysql的数据导入到hdfs框架中

Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将...

18010
来自专栏Hadoop实操

如何在CDH集群中加入异构设备

在部署CDH集群或者扩容时,会遇到服务器配置不同(CPU、Memory、DISK等)的情况,那我们应该如何加入异构设备,并进行差异化的配置呢?本篇文章主要讲述如...

56190
来自专栏大数据平台TBDS

HDFS 2.x 磁盘间数据均衡的一种可行办法

当HDFS的datanode节点挂载多个磁盘时,往往会出现两种数据不均衡的情况:

697110
来自专栏熊二哥

Hadoop快速入门

传说中的Hadoop,我终于来对着你唱"征服"了,好可爱的小象,!J 总的来说,hadoop的思路比较简单(map-reduce),就是将任务分开进行,最后汇总...

97560
来自专栏搜云库

Hadoop-2.7.4 集群快速搭建

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力...

35570
来自专栏牛肉圆粉不加葱

ResourceManager剖析

11720
来自专栏岑玉海

Spark部署

  Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出现错误看日志信息,完全看不懂那个错误信息,所以才...

39540

扫码关注云+社区

领取腾讯云代金券