Spark不常用的参数调节

本文探讨了如何通过使用Kryo序列化方法替代Java默认序列化来提高Apache 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)
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

另外一点,当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
  • 1

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

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

Thanks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值