Spark优化一则 - 减少Shuffle
Spark优化一则 - 减少Shuffle
看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要科学上网)详细讲解了Spark的工作原理,Slides的45页给原始算法和优化算法。
破砂锅用自己3节点的Spark集群试验了这个优化算法,并进一步找到更快的算法。测试数据是Sogou实验室的日志文件前10000000条数据。目标是对日志第2列数据,按照第一个字母合并,得到每个首字母有几条记录。
所有的方案都重新启动Spark shell,先用以下代码把日志第2列数据cache到内存里,Spark GUI显示cache有8个partition,约1GB内存。
val rdd = sc.textFile("hdfs://hadoop1:8000/input/SogouQ3.txt").map(_.split("\t")).map(_())
rdd.cache()
rdd.count()
// res1: Long = 10000000
Spark GUI
RDD Name |
Storage Level |
Cached Partitions |
Fraction Cached |
Size in Memory |
Size in Tachyon |
Size on Disk |
3 |
Memory Deserialized 1x Replicated |
8 |
100% |
1089.4 MB |
0.0 B |
0.0 B |
Slides原始方案
rdd.map(x => (x.charAt(), x)).groupByKey().mapValues({x => x.toSet.size}).collect()
// res2: Array[(Char, Int)] = Array((8,168189), (0,168338), (a,168228), (9,168018), (1,167647), (b,168404), (2,168731), (3,168206), (c,168991), (d,168095), (4,167523), (e,168179), (5,167967), (6,167907), (f,168174), (7,168718))
Spark stage GUI显示有关stage Id是1-2,累计耗时5s,产生140MB shuffle read和208MB shuffle write。
Stage Id |
Description |
Submitted |
Duration |
Tasks: Succeeded/Total |
Shuffle Read |
Shuffle Write |
1 |
2014/09/03 20:51:58 |
3 s |
8/8 |
140.2 MB |
||
2 |
2014/09/03 20:51:55 |
2 s |
8/8 |
208.4 MB |
||
0 |
2014/09/03 20:51:46 |
8 s |
8/8 |
Slides优化方案
rdd.distinct(numPartitions = ).map(x => (x.charAt(), )).reduceByKey(_+_).collect()
// res2: Array[(Char, Int)] = Array((6,167907), (0,168338), (f,168174), (7,168718), (a,168228), (1,167647), (8,168189), (b,168404), (2,168731), (9,168018), (3,168206), (c,168991), (d,168095), (4,167523), (e,168179), (5,167967))
Spark stage GUI显示有关stage Id是1-3,累计耗时4.2s,生成50MB shuffle read和75MB shuffle write。虽然多了1个stage,shuffle read/write比原始方案减少超过60%,从而速度加快16%。
Stage Id |
Description |
Submitted |
Duration |
Tasks: Succeeded/Total |
Shuffle Read |
Shuffle Write |
1 |
2014/09/03 20:24:17 |
0.2 s |
6/6 |
4.9 KB |
||
2 |
2014/09/03 20:24:15 |
2 s |
6/6 |
50.4 MB |
7.4 KB |
|
3 |
2014/09/03 20:24:13 |
2 s |
8/8 |
75.6 MB |
||
0 |
2014/09/03 20:23:55 |
7 s |
8/8 |
Zero Shuffle优化方案
既然减少shuffle可以加快速度,破砂锅想出以下的Zero Shuffle方案来。
rdd.map(x => (x.charAt(), x)).countByKey()
// res2: scala.collection.Map[Char,Long] = Map(e -> 623689, 2 -> 623914, 5 -> 619840, b -> 626111, 8 -> 620738, d -> 623515, 7 -> 620222, 1 -> 616184, 4 -> 616628, a -> 641623, c -> 630514, 6 -> 621346, f -> 624447, 0 -> 632735, 9 -> 637770, 3 -> 620724)
Spark stage GUI显示有关stage Id是1,累计耗时只有0.3s,没有shuffle read/write。这个方案有关的RDD只有narrow dependency,所以只有1个stage。
Stage Id |
Description |
Submitted |
Duration |
Tasks: Succeeded/Total |
Shuffle Read |
Shuffle Write |
1 |
2014/09/03 20:45:02 |
0.3 s |
8/8 |
|||
0 |
2014/09/03 20:44:32 |
8 s |
小结
比较3种方案
方案 |
Shuffle Read |
Shuffle Write |
Time |
Slides原始方案 |
140.2 MB |
208.4 MB |
5s |
Slides优化方案 |
50.4 MB |
75.6 MB |
4.2s |
Zero Shuffle优化方案 |
0 |
0 |
0.3s |
Spark的优化之一是尽可能减少shuffle从而大幅减少缓慢的网络传输。熟悉RDD的函数对Spark优化有很大帮助。
Spark优化一则 - 减少Shuffle的更多相关文章
- 【Spark调优】Shuffle原理理解与参数调优
[生产实践经验] 生产实践中的切身体会是:影响Spark性能的大BOSS就是shuffle,抓住并解决shuffle这个主要原因,事半功倍. [Shuffle原理学习笔记] 1.未经优化的HashSh ...
- 小记---------spark优化之更优分配资源
spark优化:在一定范围之内,增加资源与性能的提升是成正比的. 因此, 一个cpu core 执行一个task线程. task数: 若有 cpu core 2个.num-execu ...
- spark优化项
一.Shuffle优化项 1.Shuffle优化配置 - spark.shuffle.file.buffer 默认值:32k 参数说明:该参数用于设置shuffle write task的Buffer ...
- spark优化
spark.shuffle.consolidateFiles=false 默认是false,shuffle阶段不进行文件的合并,1000个map和1000个reduce将产生1000 000个文件. ...
- Spark源码分析 – Shuffle
参考详细探究Spark的shuffle实现, 写的很清楚, 当前设计的来龙去脉 Hadoop Hadoop的思路是, 在mapper端每次当memory buffer中的数据快满的时候, 先将memo ...
- 高并发大流量专题---3、前端优化(减少HTTP请求次数)
高并发大流量专题---3.前端优化(减少HTTP请求次数) 一.总结 一句话总结: 图片地图:使用<map><area></area></map>标签. ...
- spark优化之数据结构(减少内存)
官网是这么说的: The first way to reduce memory consumption is to avoid the Java features that add overhead, ...
- spark优化参数调节和故障参数调节
1:“物尽其用”,但给spark分配多个机器后,先需配置spark-submit shell如下: /usr/local/spark/bin/spark-submit \ --class com.sp ...
- spark源码阅读--shuffle过程分析
ShuffleManager(一) 本篇,我们来看一下spark内核中另一个重要的模块,Shuffle管理器ShuffleManager.shuffle可以说是分布式计算中最重要的一个概念了,数据的j ...
随机推荐
- nextjs-demo
这个是根据nextjs服务端渲染做的一个小demo 关键性代码,主要是控制模态框显示隐藏 关于index页面 //index.js /* eslint-disable jsx-a11y/anchor- ...
- Maven创建项目一些常见的问题
1 .创建的项目中没有src/main/java.没有src/test/java 主要原因在于在创建项目的时候,使用的是系统自带的jdk,修改方法: 右键项目——Properties——javaBui ...
- C++设计一个不能被继承的类
1. 方法一 将构造函数和析构函数设置为私有函数,重新定义公有的静态函数来创建和释放类. #include "stdafx.h" #include <iostream> ...
- 解决Js跨域访问的问题
1,最近有个需求,用Js获取Html标签<input type="file"/>的路径!遇到代码拒绝访问,提示安全验证,不允许跨域访问,简单的设置一下浏览器即可,不过对 ...
- 【Javascript-基础-Object】创建对象
创建单个对象--字面量方式 创建多个对象 使用字面量方式创建多个对象时,会产生大量的重复代码.开发者在寻找创建多个对象方法的过程中,基本经历了一下集中方法: 工厂模式 > 构造函数模式 > ...
- Oracle ddl 和 dml 操作
ddl 操作 窗口设置用户权限的方法 Oracle的数据类型 按住Ctrl点击表名 ,可以鼠标操作 插入的数据需要满足创建表的检查 主表clazz删除数据从表设置级联也会一同删除 有约束也 ...
- 点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )
测试移动端页面的时候,偶然发现点击底部input输入框时,弹出的虚拟键盘偶尔会挡住input输入框. 输入框固定在页面底部,如图所示: input固定底部设计图.png 点击底部input输入框唤 ...
- js怎样得出数组中某个数据最大连续出现的次数
1:js怎样得出数组中某个数据最大连续出现的次数 var test=[1,2,3,3,2,2,2,3,3,3,3,5,3,3,3,3,3] ; var j = 0 ; var max ...
- select2 多选 排序(版本3.4.6)
使用select2多选,页面选择值的顺序与传到control的值的顺序不一致,为了方便,没有改变本来js文件,在页面上面通过change方法改变. 1.页面代码(添加修改使用同一个页面) <li ...
- linux系统基础之--目录结构(基于centos7.4 1708)