Tuning Spark
https://spark.apache.org/docs/1.2.1/tuning.html
Data Serialization
数据序列化,对于任意分布式系统都是性能的关键点
Spark默认使用Java serialization,这个比较低效
推荐使用,Kryo serialization,会比Java序列化,更快更小, Spark使用Twitter chill library(Kryo的scala扩展)
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryoserializer.buffer.mb“, 2), 需要大于最大的需要序列化的对象size
之所以,spark不默认使用Kryo,因为Kryo需要显式的注册program中使用到的class,参考
val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)
只所以要做注册是因为,在把对象序列化成byte[]时,要记录下classname,classname带namespace一般很长的,所以每个里面加上这个classname比较费空间
在kryo里面注册过后,会用一个int来替代classname
当然不注册kryo也是可以用的,只是会多占空间
Memory Tuning
Tuning之前需要知道当前dataset的内存消耗是多少,
简单的方法是,以该dataset创建rdd,然后cache
这样从SparkContext的日志里面可以看到每个partition的大小,加一下,就可以得到整个数据集的大小
INFO BlockManagerMasterActor: Added rdd_0_1 in memory on mbk.local:50311 (size: 717.5 KB, free: 332.3 MB)
This means that partition 1 of RDD 0 consumed 717.5 KB.
然后可以从几个方面去进行优化,
Tuning Data Structures
Java对象虽然便于访问,但是和raw data比,java对象的size要大2~5倍
Each distinct Java object has an “object header”, which is about 16 bytes
JavaString
s have about 40 bytes of overhead over the raw string data, and store each character as two bytes due toString
’s internal usage of UTF-16 encoding
其他的比如HashMap或LinkedList,除了header,还需要8 bytes pointer来指向下个对象
总之,就是对于内存敏感的应用,直接使用Java对象是非常不经济的
可以从以下几点去优化,
a, 优先使用arrays of objects, and primitive types,而非java或scala的标准collection class
或者使用fastutil library,这个库提供了用primitive types实现的collection class
b, 避免含有大量小对象或pointer的嵌套数据结构
c, Consider using numeric IDs or enumeration objects instead of strings for keys
d, If you have less than 32 GB of RAM, set the JVM flag-XX:+UseCompressedOops
to make pointers be four bytes instead of eight. You can add these options inspark-env.sh
.
Serialized RDD Storage
使用MEMORY_ONLY_SER,在memory中cache序列化后的数据,降低内存使用,当然响应的访问速度会降低,由于需要反序列化
Garbage Collection Tuning
首先需要打开gc日志,
adding -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
to the Java options
Cache Size Tuning
默认Spark使用60% 的executor memory(spark.executor.memory
)来cache RDDs.
也就是说只有40%的memory用于task执行,如果发现频繁gc或是oom,可以调低用于cache的比例,
conf.set("spark.storage.memoryFraction", "0.5"), 这样设成50%
Advanced GC Tuning
Spark做gc tuning的目标是,避免在task执行过程中发生full gc, 即需要让Young区足够容纳short-lived objects
a, 如果发生多次full gc或是OldGen已经接近full,说明内存不够,可以降低cache比例
b, 如果很多minor gc,但没有major gc,说明young区过小, 我们可以根据task dataset需要消耗内存来预估eden区,young区大小= eden区 × (4/3),因为要加上survivor区
c, 如果从hdfs读取数据,可以根据hdfs block大小来预估eden区大小,比如,如果解压比例3倍,4个tasks并行,block大小64M,那么eden区大小 = 3×4×64M
其他的一些考虑,
调整并发的level, 通过增加并发来降低reduce task的内存消耗
用broadcast functionality来处理大的变量, data locality
Tuning Spark的更多相关文章
- 【翻译】Spark 调优 (Tuning Spark) 中文版
由于Spark自己的调优guidance已经覆盖了很多很有价值的点,因此这里直接翻译一份过来.也作为一个积累. Spark 调优 (Tuning Spark) 由于大多数Spark计算任务是在内存中运 ...
- spark第十八篇:Tuning Spark 调优
由于大多数Spark应用都是在内存中计算的,所以,Spark程序的瓶颈可能是集群中的任何资源,比如CPU,网络带宽或者内存等.本指南主要涵盖两个主题: 1.数据序列化.这对于良好的网络性能至关重要,还 ...
- Spark的性能调优杂谈
下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的. 基本概念和原则 <1> 每一台host上面可以并行N个worker,每一个worke ...
- Apache Spark 内存管理详解(转载)
Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 ...
- Spark 调优(转)
Spark 调优 返回原文英文原文:Tuning Spark Because of the in-memory nature of most Spark computations, Spark pro ...
- Spark的性能调优
下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的. Data Serialization,默认使用的是Java Serialization,这个程序员 ...
- spark RDD官网RDD编程指南
http://spark.apache.org/docs/latest/rdd-programming-guide.html#using-the-shell Overview(概述) 在较高的层次上, ...
- 一分钟了解spark的调优
Tuning Spark 数据序列化 内存调优 内存管理概述 确定内存消耗 调整数据结构 序列化 RDD 存储 垃圾收集调整 其他注意事项 并行度水平 减少任务的内存使用 广播大的变量 数据本地化 概 ...
- 整合Kafka到Spark Streaming——代码示例和挑战
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管.本文,Michael详细的演示了如 ...
随机推荐
- GDUT 校赛01 dp
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABT8AAAILCAIAAAChHn9YAAAgAElEQVR4nOy9f4il13nneUGgxrRYux ...
- POJ 2185 Milking Grid KMP(矩阵循环节)
Milking Grid Time Limit: 3000MS Memory Lim ...
- 【JNI】C向C++改造
步骤: 1. 把c文件后缀名换成cpp2. Android.mk文件中的hello.c也要换成hello.cpp3. c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样 ...
- hdu2955
#include<bits/stdc++.h> using namespace std; struct Bank { double cau; int money; }bank[]; ]; ...
- 2016.7.8 计算机网络复习要点第四章之地址解析协议ARP
1.地址解析协议ARP:知道一个机器的IP地址,需要找到其相应的硬件地址:ARP协议的用途是为了从网络层使用的IP地址解析出在链路层使用的硬件地址: 2.由于是IP协议使用了ARP协议,因此通常就把A ...
- bug 修改心得
我在做一个项目的时候,分页无法显示,于是我就开始进行各种修改. 最后我发现竟然是因为配置文件写错了,结果页面跳到别的页面, 跳转到了单项详细页面.
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...
- Linux(Redhat)下redis安装
原文:http://www.javaweb1024.com/data/NoSQL/2015/06/29/785.html redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系 ...
- Ubuntu(Linux) 下 unzip 命令使用详解
1.功能作用:解压缩zip文件 2.位置:/usr/bin/unzip 3.格式用法:unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist ...
- 遍历josn的三种方式
第一种:使用for循环 js代码: function CyclingJson1() { var testJson = '[{ "name": "小强", &qu ...