Spark不常用的参数调节

内容基本都来自:http://spark.apache.org/docs/1.0.2/tuning.html,自己随手记下来点东西。

数据序列化

对于分布式框架来说,牵扯到数据传输的问题,故序列化问题非常重要。
在spark中,默认采用的是java的序列化(java.io.Serializable),此种序列化的效率较低。建议采用Kryo serialization的序列化方法,但是此种方法的不足之处在于,如果你自己编写了一个类,需要继承自org.apache.spark.serializer.KryoRegistrator才可以。但是这种代价是可以承受的,因为此种序列化方式压缩率高、速度快。综上,其范例代码如下:

import com.esotericsoftware.kryo.Kryo
import org.apache.spark.serializer.KryoRegistrator

class MyRegistrator extends KryoRegistrator {
  override def registerClasses(kryo: Kryo) {
    kryo.register(classOf[MyClass1])
    kryo.register(classOf[MyClass2])
  }
}

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrator", "mypackage.MyRegistrator")
val sc = new SparkContext(conf)

另外一点,当Kryo序列化工作时,需要一个缓冲空间,默认为2Mb,当你的定制类特别大时(假设存了一整张图),则需要改变这个默认参数(spark.kryoserializer.buffer.mb),使这个缓冲区能够容纳下任意的定制类,不会发生溢出问题。

内存

内存消耗主要分为三个部分:
实际数据结构占用的空间、访问这个数据结构所需要的空间、垃圾回收所需要的空间。
默认情况下,我们是可以较快的访问java对象的,但这是一定量的额外空间消耗做到的。

  1. 确定你本身数据结构的空间消耗
    这部分空间是无法减少的,每当你产生一个RDD时,会看到如下信息:
INFO BlockManagerMasterActor: Added rdd_0_1 in memory on mbk.local:50311 (size: 717.5 KB, free: 332.3 MB)

这表示在分区1的rdd 0消耗了717.5KB
2. 调整你的数据结构
a、官方建议把java原生的set容器之类的用fastutil的实现版本,据说这个版本的内存消耗更小。
b、避免你的数据结构太过于零散
c、如果你的内存机器小雨32GB,可以在JVM中添加命令-xx:+UseCompressedOops命令,把原本8位的对象指针压缩为4位。
d、少用string当做key,除非你不得不这么做。。

  1. 其他
    其他几种方法觉得略不实用,感兴趣的可以去原文看下。

Thanks

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值