广播变量

背景

一般Task大小超过10K时(Spark官方建议是20K),需要考虑使用广播变量进行优化。
大表小表Join,小表使用广播的方式,减少Join操作。

参考:Spark广播变量与累加器

Local Dir

背景

shuffle过程中,临时数据需要写入本地磁盘。本地磁盘的临时目录通过参数spark.local.dir配置。

性能优化点

spark.local.dir支持配置多个目录。配置spark.local.dir有多个目录,每个目录对应不同的磁盘,这样可以提升IO效率。另外,可以采用IO性能较高的磁盘作为local dir的磁盘。

注意:

  • 如果使用YARN、Mesos等资源框架,此参数应该通过相应资源框架的参数来设置。
  • 如果只有一个磁盘,配置了多个目录,性能提升不大。

RDD操作:使用MapPartitions替代Map

性能优化点

map方法是对RDD的每一条记录逐一操作。mapPartitons是对整个RDD,以迭代器的方式逐一操作。比如对条记录的开销较大,比如需要连接、断开数据库。使用map方法需要对每一条记录都连接、断开数据库,效率差。此时,可以改用mapPartitons操作,只需要整个Partition连接、断开一次数据库即可。

1
rdd.map{x => conn=getDBConn;conn.write(x.toString);conn.close}

改为:

1
rdd.mapPartitions(records => conn.getDBConn;for(item <- records) write(item.toString); conn.close)

RDD操作:使用coalesce减小空运行的任务数量

性能优化点

  • 场景一

当对RDD进行多次过滤时,可能会形成很多空的、无数据的Partition。通过调用coalesce方法,可以减小Task个数。让有的Task可以同时管理多个Partition。

  • 场景二

当任务数过多的时候,Shuffle压力太大导致程序挂住不动,或者出现linux资源受限的问题。此时,可以通过调用coalesce方法,可以减小Task个数,让程序得以继续运行。

coalesce()方法接受一个参数,为减小后的目标Partition个数。

RDD操作:collect

Collect操作会将Executor的数据发送的Driver端。需要确保Driver有足够的内存。Driver的内存通过参数spark.driver.memory参数进行配置。

RDD操作:使用reduceByKey替代groupByKey

reduceByKey会在Map端做本地聚合,而groupByKey等Shuffle操作不会再Map端做聚合。 能使用reduceByKey的地方尽量使用该方式,避免出现.groupByKey().map(x=>(x.1,x.2.size))

  • 举例

对于数据

2015-05-01 13:00:00,B101,MEILIN
2015-05-01 10:04:20,B101,GUANLAN
2015-05-01 09:18:00,F301,MEILIN
2015-05-01 12:00:00,B107,WUHE
2015-05-01 18:20:00,F301,WUHE
2015-05-02 12:00:02,T442,GUANLAN
2015-05-01 07:00:00,B101,GUANLAN
2015-05-01 21:31:00,M721,WUHE
2015-05-01 09:00:00,Z007,MEILIN

现在要统计各个车牌(第二列)出现的次数,则应使用:

1
2
3
4
5
var dataRDD = sc.textFile("file:///tmp/data.txt")
var data2RDD = dataRDD.map(s => s.split(","))
var data3RDD = data2RDD.map( a => (a(1),1) )
var data4RDD = data3RDD.reduceByKey(_ + _)
data4RDD.collect

而不是:

1
2
3
4
5
6
var dataRDD = sc.textFile("file:///tmp/data.txt")
var data2RDD = dataRDD.map(s => s.split(","))
var data3RDD = data2RDD.map( a => (a(1),Array(a(0),a(2))) )
var data4RDD = data3RDD.groupByKey()
var data5RDD = data4RDD.map(x => (x._1,x._2.size))
data5RDD.collect

避免数据倾斜

如何检测数据倾斜?

现象:没有GC,各Task执行时间严重不一致。

性能优化点

  • 重新设计key,以更小粒度的key使得Task大小合理化。
  • 有时提升并行度,有助于解决数据倾斜

Spark性能优化(2)——广播变量、本地缓存目录、RDD操作、数据倾斜的更多相关文章

  1. IIS7性能优化:启用浏览器本地缓存

    原文地址:http://jingyan.baidu.com/article/597035521b96e88fc00740af.html

  2. 【转载】Spark性能优化指南——高级篇

    前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...

  3. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  4. Spark性能优化指南——高级篇(转载)

    前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...

  5. Spark性能优化指南-高级篇

    转自https://tech.meituan.com/spark-tuning-pro.html,感谢原作者的贡献 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作 ...

  6. Spark性能优化指南——高级篇

    本文转载自:https://tech.meituan.com/spark-tuning-pro.html 美团技术点评团队) Spark性能优化指南——高级篇 李雪蕤 ·2016-05-12 14:4 ...

  7. Spark性能优化:数据倾斜调优

    前言 继<Spark性能优化:开发调优篇>和<Spark性能优化:资源调优篇>讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化 ...

  8. 【转载】 Spark性能优化指南——基础篇

    转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...

  9. 【转】Spark性能优化指南——基础篇

    http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&sn=2f413828d1fdc6a ...

随机推荐

  1. NetCore控制台实现自定义CommandLine功能

    命令行科普: 例如输入: trans 123 456 789 -r 123 -r 789上面例子中:trans是Command,123 456 789是CommandArgument,-r之后的都是C ...

  2. iOS 9应用开发教程之多行读写文本ios9文本视图

    iOS 9应用开发教程之多行读写文本ios9文本视图 多行读写文本——ios9文本视图 文本视图也是输入控件,与文本框不同的是,文本视图可以让用户输入多行,如图2.23所示.在此图中字符串“说点什么吧 ...

  3. 求N!末尾所得数字0的个数

    题目:给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢? 例如:N = 10,N! = 3628800,所以N!末尾就有2个零. 分析:如果直接先算出N!阶乘,很容易导致内存溢出.显然,直接算出 ...

  4. android viewHolder static 静态

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 不是静态内部类 会 持有 外部类的 引用.  就像经常自定义的 适配器 类 作为内部类 ...

  5. hdu 1698 线段树 成段更新

    题意:一段钩子,每个钩子的值为1,有若干更新,每次跟新某段的值,若干查询某段的和 基础题了 #include<cstdio> #include<iostream> #inclu ...

  6. 【BZOJ】4565: [Haoi2016]字符合并

    4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 690  Solved: 316[Submit][Status ...

  7. bzoj 1312 最大密度子图

    晕,m=0是要输出1(弄的我还找管理员要数据,但明显题意是叫我们输出0呀) 最大密度子图,把边转换成点,然后二分答案,跑最大权闭合子图判定是否可行. #include <cstdio> # ...

  8. 洛谷P2657 Loj10165 SCOI2009 windy数

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输 ...

  9. 请你谈谈cookie的利弊

    以下均是自己理解和整理的,如果有错误请指出,谢谢O(∩_∩)O~~ 优点 极高的扩展性和可用性. 1)  数据持久性. 2)  不需要任何服务器资源.Cookie存储在客户端并在发送后由服务器读取. ...

  10. Codeforces Round #357 (Div. 2) E. Runaway to a Shadow 计算几何

    E. Runaway to a Shadow 题目连接: http://www.codeforces.com/contest/681/problem/E Description Dima is liv ...