spark调优-个人日记小抄

内存存储优化


     首先认识spark内存的用途,一是用来执行计算,另一个是用来做存储。计算有聚合aggregation、关联jion,排序sort,混洗shuffle。在spark中计算内存和存储内存是共享的,也就是用同一块内存,假如计算资源不够,它会去抢存储内存,但不会抢占全部,把存储内存挤掉,仅仅是将存储内存占比降到一定比例就停止。而且存储内存不足了,它不能去抢用于计算的内存。相关可配参数如下:

      spark.memory.fraction配置的就是spark计算和存储共享的内存大小,默认是占比jvm内存比例75%。

      spark.memory.storagefraction配置的就是spark存储数据内存大小,默认是fraction的一半。

优化经验:

   1、 更好序列化,让所有数据集都能装在内存中。spark 默认的序列化是使用java serialization,java 的对象序列化,是非常占用空间的,而且效率不高。相比hadoop的io序列化逊色不少。以此同时,spark还支持序列化方式Kryo serialization,这个序列化速率比java快10倍,空间占用也比java小。但Kryo不支持所有实现了Serializable 接口的类型,它需要你在程序中 register 需要序列化的类型,以得到最佳性能。要切换到使用 Kryo,你可以在sparkConf初始化的时候调用 conf.set(“spark.serializer”, “org.apache.spark.serializer.KryoSerializer”)选择这个序列化类型,并且注册要序列化的类,conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))。

数据结构调优

     减少内存消耗的首要方法就是避免过多的Java封装(减少对象头和额外辅助字段),比如基于指针的数据结构和包装对象等。以下有几条建议:

     设计数据结构的时候,优先使用对象数组和原生类型,减少对复杂集合类型(如:HashMap)的使用。fastutil 提供了一些很方便的原声类型集合,同时兼容Java标准库。
      尽可能避免嵌套大量的小对象和指针。
     对应键值应尽量使用数值型或枚举型,而不是字符串型。
    如果内存小于32GB,可以设置JVM标志参数 -XX:+UseCompressdOops 将指针设为4字节而不是8字节。你可以在  spark-env.sh 中设置这个参数。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值