《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學院為您提供專業教程。