《java开发Spark的性能调优及特点分析》要点:
本文介绍了java开发Spark的性能调优及特点分析,希望对您有用。如果有疑问,可以联系我们。
Spark是一个基于内存计算的开源的集群计算系统,目的是让数据分析更加快速.Spark非常小巧玲珑,由加州伯克利大学AMP实验室的Matei为主的小团队所开发.使用的语言是Scala,项目的core部分的代码只有63个Scala文件,非常短小精悍.Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载.Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架.与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作当地集合对象一样轻松地操作分布式数据集.
一丶Spark数据序列化
序列化对于提高分布式程序的性能起到非常重要的作用.一个不好的序列化方式(如序列化模式的速度非常慢或者序列化结果非常大)会极大降低计算速度.很多情况下,这是你优化Spark应用的第一选择.Spark试图在方便和性能之间获取一个平衡. 1丶Java 序列化:在默认情况下,Spark采用Java的ObjectOutputStream序列化一个对象.该方式适用于所有实现了java.io.Serializable的类.通过继承java.io.Externalizable,你能进一步控制序列化的性能.Java序列化非常灵活,但是速度较慢,在某些情况下序列化的结果也比拟大.
2丶Kryo序列化:Spark也能使用Kryo(版本2)序列化对象.Kryo不但速度极快,而且产生的结果更为紧凑(通常能提高10倍).Kryo的缺点是不支持所有类型,为了更好的性能,你必要提前注册程序中所使用的类(class).
3丶可以在创建SparkContext之前,通过调用System.setProperty("spark.serializer", "spark.KryoSerializer"),将序列化方式切换成Kryo.Kryo不能成为默认方式的唯一原因是必要用户进行注册;但是,对于任何“网络密集型”(network-intensive)的应用,我们都建议采用该方式.
二丶Spark的特点
spark特点概括为“轻、快、灵和巧”,分为4点!
1丶轻:Spark 0.6核心代码有2万行,Hadoop 1.0为9万行,2.0为22万行.一方面,感谢Scala语言的简洁和丰富表达力;另一方面,Spark很好地利用了Hadoop和Mesos(伯克利 另一个进入孵化器的项目,主攻集群的动态资源管理)的基础设施.虽然很轻,但在容错设计上不打折扣.
2丶快:Spark 对小数据集能达到亚秒级的延迟,这对于Hadoop MapReduce是无法想象的(由于“心跳”间隔机制,仅任务启动就有数秒的延迟).就大数据集而言,对典型的迭代机器 学习、即席查询(ad-hoc query)、图计算等应用,Spark版本比基于MapReduce、Hive和Pregel的实现快上十倍到百倍.其中内存计算、数据当地性 (locality)和传输优化、调度优化等该居首功,也与设计伊始即秉持的轻量理念不无关系.
3丶灵:Spark 提供了分歧层面的灵活性.在实现层,它完美演绎了Scala trait动态混入(mixin)策略(如可更换的集群调度器、序列化库);在原语(Primitive)层,它允许扩展新的数据算子 (operator)、新的数据源(如HDFS之外支持DynamoDB)、新的language bindings(Java和Python);在范式(Paradigm)层,Spark支持内存计算、多迭代批量处理、即席查询、流处理和图计算等多种 范式.
4丶巧: 巧在借势和借力.Spark借Hadoop之势,与Hadoop无缝结合;接着Shark(Spark上的数据仓库实现)借了Hive的势;图计算借 用Pregel和PowerGraph的API以及PowerGraph的点分割思想.一切的一切,都借助了Scala(被广泛誉为Java的未来取代 者)之势:Spark编程的Look'n'Feel便是原汁原味的Scala,无论是语法还是API.在实现上,又能灵巧借力.为支持交互式编 程,Spark只需对Scala的Shell小做修改(相比之下,微软为支持JavaScript Console对MapReduce交互式编程,不仅要跨越Java和JavaScript的思维屏障,在实现上还要大动干戈).
Spark首先是一种粗粒度数据并行(data parallel)的计算范式.
数据并行跟任务并行(task parallel)的区别体现在以下两方面.(1)计算的主体是数据集合,而非个别数据.(2)集合内的所有数据都经过同样的算子序列.
Spark 的突破在于,在保证容错的前提下,用内存来承载工作集.内存的存取速度快于磁盘多个数量级,从而可以极大提升性能.关键是实现容错,传统上有两种办法:日 志和检查点.考虑到检查点有数据冗余和网络通信的开销,Spark采用日志数据更新.细粒度的日志更新并不便宜,而且前面讲过,Spark也不擅长. Spark记录的是粗粒度的RDD更新,这样开销可以忽略不计.鉴于Spark的函数式语义和幂等特性,通过重放日志更新来容错,也不会有副作用.
三丶Spark内存优化
内存优化有三个方面的考虑:对象所占用的内存(你或许希望将所有的数据都加载到内存),拜访对象的消耗以及垃圾回收(garbage collection)所占用的开销.
通常,Java对象的拜访速度更快,但其占用的空间通常比其内部的属性数据大2-5倍.这主要由以下几方面原因:
1丶每一个Java对象都包括一个“对象头”(object header),对象头大约有16字节,包括了指向对象所对应的类(class)的指针等信息以.如果对象本身包括的数据非常少,那么对象头有可能会比对象数据还要大.
2丶Java String在实际的字符串数据之外,还需要大约40字节的额外开销(因为String将字符串保留在一个Char数组,需要额外保留类似长度等的其他数据);同时,因为是Unicode编码,每一个字符需要占用两个字节.所以,一个长度为10的字符串需要占用60个字节.
3丶通用的集合类,例如HashMap、LinkedList等,都采用了链表数据结构,对于每一个条目(entry)都进行了包装(wrapper).每一个条目不仅包括对象头,还包括了一个指向下一条目的指针(通常为8字节).
4丶基本类型(primitive type)的集合通常都保留为对应的类,如java.lang.Integer.
四丶数据格式
任何时候你都可以决定你的数据如何坚持在磁盘上,使用可扩展的二进制格式比如:Avro,Parquet,Thrift或者Protobuf,从中选择一种.当人们在谈论在Hadoop上使用Avro,Thrift或者Protobuf时,都是认为每个 record 坚持成一个 Avro/Thrift/Protobuf 结构保存成 sequence file.而不是JSON.
五丶调试资源分配
Spark 的用户邮件邮件列表中经常会出现 “我有一个500个节点的集群,为什么但是我的应用一次只有两个 task 在执行”,鉴于 Spark 控制资源使用的参数的数量,这些问题不应该出现.但是在本章中,你将学会压榨出你集群的每一分资源.保举的配置将根据不同的集群管理系统( YARN、Mesos、Spark Standalone)而有所不同,我们将主要集中在 YARN 上,因为这个 Cloudera 保举的方式.
结语
以 上就是我保举以上是对java开发Spark的性能调优及特点分析问题及其优化总结,分享给大家,希望大家可以了解什么是java开发Spark的性能调优及特点分析问题及其优化.觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!
1、多写多敲代码,好的代码与扎实的基础知识必定是实践出来的.
2、可以去百度搜索腾讯课堂图灵学院的视频来学习一下java架构实战案例,还挺不错的.
最后,每一位读到这里的网友,感谢你们能耐心地看完.希望在成为一名更优秀的Java法式员的道路上,我们可以一起学习、一起进步.(麻烦亲关注一下~.~) 帅的人都已经点赞了~.~
欢迎参与《java开发Spark的性能调优及特点分析》讨论,分享您的想法,维易PHP学院为您提供专业教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/8005.html