- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北风网项目实战培训 在任何分布式系统中,序列化都是扮演着一个重要的角色的。如果使用的序列化技术,在执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序的性能下降很多。所以,进行Spark性能优化的第一步,就是进行序列化的性能优化。 Spark自身默认就会在一些地方对数据进行序列化,比如Shuffle。还有就是,如果我们的算子函数使用到了外部的数据(比如Java内置类型,或者自定义类型),那么也需要让其可序列化。 而Spark自身对于序列化的便捷性和性能进行了一个取舍和权衡。默认,Spark倾向于序列化的便捷性,使用了Java自身提供的序列化机制——基于ObjectInputStream和ObjectOutputStream的序列化机制。因为这种方式是Java原生提供的,很方便使用。 但是问题是,Java序列化机制的性能并不高。序列化的速度相对较慢,而且序列化以后的数据,还是相对来说比较大,还是比较占用内存空间。因此,如果你的Spark应用程序对内存很敏感,那么,实际上默认的Java序列化机制并不是最好的选择。 数据序列化概述 Spark实际上提供了两种序列化机制,它只是默认使用了第一种: 1、Java序列化机制:默认情况下,Spark使用Java自身的ObjectInputStream和ObjectOutputStream机制进行对象的序列化。只要你的类实现了Serializable接口,那么都是可以序列化的。而且Java序列化机制是提供了自定义序列化支持的,只要你实现Externalizable接口即可实现自己的更高性能的序列化算法。Java序列化机制的速度比较慢,而且序列化后的数据占用的内存空间比较大。 2、Kryo序列化机制:Spark也支持使用Kryo类库来进行序列化。Kryo序列化机制比Java序列化机制更快,而且序列化后的数据占用的空间更小,通常比Java序列化的数据占用的空间要小10倍。Kryo序列化机制之所以不是默认序列化机制的原因是,有些类型虽然实现了Seriralizable接口,但是它也不一定能够进行序列化;此外,如果你要得到最佳的性能,Kryo还要求你在Spark应用程序中,对所有你需要序列化的类型都进行注册。 Spark提供的两种序列化机制 如果要使用Kryo序列化机制,首先要用SparkConf设置一个参数,使用new SparkConf().set(spark.serializer, org.apache.spark.serializer.KryoSerializer)即可,即将Spark的序列化器设置为KryoSerializer。这样,Spark在内部的一些操作,比如Shuffle,进行序列化时,就会使用Kryo类库进行高性能、快速、更低内存占用量的序列化了。 使用Kryo时,它要求是需要序列化的类,是要预先进行注册的,以获得最佳性能——如果不注册的话,那么Kryo必须时刻保存类型的全限定名,反而占用不少内存。Spark默认是对Scala中常用的类型自动注册了Kryo的,都在AllScalaRegistry类中。 但是,比如自己的算子中,使用了外部的自定义类型的对象,那么还是需要将其进行注册。 (实际上,下面的写法是错误的,因为counter不是共享的,所以累加的功能是无法实现的) val counter = new Counter(); val numbers = sc.parallelize(Array(1, 2, 3, 4, 5)) numbers.foreach(num = counter.add(num)); 如何使用Kryo序列化机制(一) 如果要注册自定义的类型,那么就使用如下的代码,即可: Scala版本: val conf = new SparkConf().setMaster(...).setAppName(...) conf.registerKryoClasses(Array(classOf[Counter] )) val sc = new SparkContext(conf) Java版本: SparkConf conf = new SparkConf().setMaster(...).setAppName(...) conf.registerKryoClasses(Counter.class) JavaSparkContext sc = new JavaSparkContext(conf) 如何使用Kryo序列化机制(二) 1、优化缓存大小 如果注册的要序列化的自定义的类型,本身特
您可能关注的文档
最近下载
- Do_QC-T 568-2019汽车机械式变速器总成技术条件及台架试验方法.docx
- 江西省南昌市2024—2025学年度第一学期期中测试卷九年级 (初三) 化学试卷及答案.docx VIP
- 零碳工厂培训课件.ppt VIP
- 2025年供热稽查考试题及答案.docx
- 信息化条件下联合作战.pptx VIP
- 2024年国家公务员录用考试《行测》题(地市级).pdf VIP
- 日产贵士V42 维修手册-AV.pdf VIP
- 丰田工具__A3资料的制作技巧(丰田工具_精益工具).ppt VIP
- 江西省南昌市2024—2025学年度第一学期期中测试卷九年级 (初三) 数学试卷及答案.docx VIP
- 液压挖掘机检验报告.doc VIP
文档评论(0)