文档章节

spark-kryo序列化(spark优化点)

crayzer_yixiu
 crayzer_yixiu
发布于 2016/10/29 19:14
字数 894
阅读 1.6K
收藏 6

        广播大变量,每个executor可以对应一个blockmanager里面存着变量,虽然我们减少了网络传输,减少了内存占用整体空间,但是还可以进一步减小网络传输和内存占用空间,所以我们可以用kryo序列化机制!还可以进一步优化,优化这个序列化格式。

        默认情况下,Spark内部是使用Java的序列化机制,ObjectOutputStream / ObjectInputStream,对象输入输出流机制,来进行序列化这种默认序列化机制的好处在于,处理起来比较方便;也不需要我们手动去做什么事情,只是,你在算子里面使用的变量,必须是实现Serializable接口的,可序列化即可。但是缺点在于,默认的序列化机制的效率不高,序列化的速度比较慢;序列化以后的数据,占用的内存空间相对还是比较大。

        可以手动进行序列化格式的优化Spark支持使用Kryo序列化机制。Kryo序列化机制,比默认的Java序列化机制,速度要快,序列化后的数据要更小,大概是Java序列化机制的1/10。所以Kryo序列化优化以后,可以让网络传输的数据变少;在集群中耗费的内存资源大大减少。

Kryo序列化机制,一旦启用以后,会生效的几个地方:

  • 算子函数中使用到的外部变量,肯定要传输的时候要序列化了
    • 算子函数中使用到的外部变量,使用Kryo以后:优化网络传输的性能,可以优化集群中内存的占用和消耗,算子函数中用到了外部变量,会序列化,使用Kryo
  • 持久化RDD时进行序列化,StorageLevel.MEMORY_ONLY_SER
    • 持久化RDD,优化内存的占用和消耗;持久化RDD占用的内存越少,task执行的时候,创建的对象,就不至于频繁的占满内存,频繁发生GC。当使用了序列化的持久化级别时,在将每个RDD partition序列化成一个大的字节数组时,就会使用Kryo进一步优化序列化的效率和性能。
  • shuffle
    • shuffle:可以优化网络传输的性能在进行stage间的task的shuffle操作时,节点与节点之间的task会互相大量通过网络拉取和传输文件,此时,这些数据既然通过网络传输,也是可能要序列化的,就会使用Kryo。
      SparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

       

  1. 在SparkConf中设置一个属性,spark.serializer,org.apache.spark.serializer.KryoSerializer类;
  • Kryo之所以没有被作为默认的序列化类库的原因,就要出现了:主要是因为Kryo要求,如果要达到它的最佳性能的话,那么就一定要注册你自定义的类(比如,你的算子函数中使用到了外部自定义类型的对象变量,这时,就要求必须注册你的类,否则Kryo达不到最佳性能)。感觉很麻烦,所以没有默认。
  • 注册你使用到的,需要通过Kryo序列化的,一些自定义类,SparkConf.registerKryoClasses()
    项目中的使用:
    .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    .registerKryoClasses(new Class[]{CategorySortKey.class})

     

© 著作权归作者所有

crayzer_yixiu
粉丝 26
博文 57
码字总数 87921
作品 0
杭州
高级程序员
私信 提问
Spark实战(一)SparkStreaming集成Kafka

Spark Streaming + Kafka集成指南 Kafka项目在版本0.8和0.10之间引入了一个新的消费者API,因此有两个独立的相应Spark Streaming包可用。请选择正确的包, 请注意,0.8集成与后来的0.9和0.1...

FrankDeng
2018/07/15
0
0
Spark Streaming应该如何消费Kafka?

前言 在项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不断拉取数...

王知无
2019/07/20
0
0
Spark 配置

Spark提供了三种主要本地设置来配置系统: 环境变量 用来加载Spark的workers,可以在你的驱动程序或theconf/spark-env.shscript中设定。 Java系统属性 控制内部配置参数,可以通过编程方式设...

vincent_hv
2013/09/24
2.4W
5
Spark调优 | Spark Streaming 调优实践

京东HBase招聘,坐标京东 , 北辰职场 HBase 资深大数据工程师(HBase/Hadoop/Phoenix) 主要职责: 1. 构建分布式大数据服务平台,参与构建公司海量数据存储、实时查询系统; 2. 负责HBase...

HBase技术社区
2019/08/12
0
0
Spark参数详解 一(Spark1.6)

Spark参数详解 (Spark1.6) 参考文档:Spark官网 在Spark的web UI在“Environment”选项卡中列出Spark属性。这是一个很有用的地方,可以检查以确保属性设置正确。注意,只有通过spark-defau...

利伊奥克儿
2019/01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

每天AC系列(六):有效的括号

1 题目 LeetCode第20题,这题比较简单,匹配括号. 2 栈 这是栈的典型应用,括号匹配,当然不需要直接使用栈,使用一个StringBuilder即可: if(s.isEmpty()) return true;char a = s.charAt(0);...

Blueeeeeee
今天
27
0
Spring AOP-06-切入点类型

切入点是匹配连接点的拦截规则。之前使用的是注解@Pointcut,该注解是AspectJ中的。除了这个注解之外,Spring也提供了其他一些切入点类型: • 静态方法切入点StaticMethodMatcherPointcut •...

moon888
昨天
90
0
Class Loaders in Java

1. Introduction to Class Loaders Class loaders are responsible for loading Java classes during runtime dynamically to the JVM (Java Virtual Machine). Also, they are part of the ......

Ciet
昨天
96
0
以Lazada为例,看电商系统架构演进

什么是Lazada? Lazada 2012年成立于新加坡,是东南亚第一电商,2016年阿里投资10亿美金,2017年完成对lazada的收购。 业务模式上Lazada更偏重自营,类似于亚马逊,自建仓储和为商家提供服务...

春哥大魔王的博客
昨天
62
0
【自用】 Flutter Timer 简单用法

dart: void _startTime() async { _timer = Timer(Duration(seconds: sec), () { fun(xxx,yyy,zzz); }); } @override void dispose() { _timer.cancel()......

Tensor丨思悟
昨天
65
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部