《java開發(fā)Spark的性能調(diào)優(yōu)及特點分析》要點:
本文介紹了java開發(fā)Spark的性能調(diào)優(yōu)及特點分析,希望對您有用。如果有疑問,可以聯(lián)系我們。
Spark是一個基于內(nèi)存計算的開源的集群計算系統(tǒng),目的是讓數(shù)據(jù)分析更加快速.Spark非常小巧玲瓏,由加州伯克利大學(xué)AMP實驗室的Matei為主的小團隊所開發(fā).使用的語言是Scala,項目的core部分的代碼只有63個Scala文件,非常短小精悍.Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負載.Spark 是在 Scala 語言中實現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架.與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作當(dāng)?shù)丶蠈ο笠粯虞p松地操作分布式數(shù)據(jù)集.
一丶Spark數(shù)據(jù)序列化
序列化對于提高分布式程序的性能起到非常重要的作用.一個不好的序列化方式(如序列化模式的速度非常慢或者序列化結(jié)果非常大)會極大降低計算速度.很多情況下,這是你優(yōu)化Spark應(yīng)用的第一選擇.Spark試圖在方便和性能之間獲取一個平衡. 1丶Java 序列化:在默認情況下,Spark采用Java的ObjectOutputStream序列化一個對象.該方式適用于所有實現(xiàn)了java.io.Serializable的類.通過繼承java.io.Externalizable,你能進一步控制序列化的性能.Java序列化非常靈活,但是速度較慢,在某些情況下序列化的結(jié)果也比擬大.
2丶Kryo序列化:Spark也能使用Kryo(版本2)序列化對象.Kryo不但速度極快,而且產(chǎn)生的結(jié)果更為緊湊(通常能提高10倍).Kryo的缺點是不支持所有類型,為了更好的性能,你必要提前注冊程序中所使用的類(class).
3丶可以在創(chuàng)建SparkContext之前,通過調(diào)用System.setProperty("spark.serializer", "spark.KryoSerializer"),將序列化方式切換成Kryo.Kryo不能成為默認方式的唯一原因是必要用戶進行注冊;但是,對于任何“網(wǎng)絡(luò)密集型”(network-intensive)的應(yīng)用,我們都建議采用該方式.
二丶Spark的特點
spark特點概括為“輕、快、靈和巧”,分為4點!
1丶輕:Spark 0.6核心代碼有2萬行,Hadoop 1.0為9萬行,2.0為22萬行.一方面,感謝Scala語言的簡潔和豐富表達力;另一方面,Spark很好地利用了Hadoop和Mesos(伯克利 另一個進入孵化器的項目,主攻集群的動態(tài)資源管理)的基礎(chǔ)設(shè)施.雖然很輕,但在容錯設(shè)計上不打折扣.
2丶快:Spark 對小數(shù)據(jù)集能達到亞秒級的延遲,這對于Hadoop MapReduce是無法想象的(由于“心跳”間隔機制,僅任務(wù)啟動就有數(shù)秒的延遲).就大數(shù)據(jù)集而言,對典型的迭代機器 學(xué)習(xí)、即席查詢(ad-hoc query)、圖計算等應(yīng)用,Spark版本比基于MapReduce、Hive和Pregel的實現(xiàn)快上十倍到百倍.其中內(nèi)存計算、數(shù)據(jù)當(dāng)?shù)匦?(locality)和傳輸優(yōu)化、調(diào)度優(yōu)化等該居首功,也與設(shè)計伊始即秉持的輕量理念不無關(guān)系.
3丶靈:Spark 提供了分歧層面的靈活性.在實現(xiàn)層,它完美演繹了Scala trait動態(tài)混入(mixin)策略(如可更換的集群調(diào)度器、序列化庫);在原語(Primitive)層,它允許擴展新的數(shù)據(jù)算子 (operator)、新的數(shù)據(jù)源(如HDFS之外支持DynamoDB)、新的language bindings(Java和Python);在范式(Paradigm)層,Spark支持內(nèi)存計算、多迭代批量處理、即席查詢、流處理和圖計算等多種 范式.
4丶巧: 巧在借勢和借力.Spark借Hadoop之勢,與Hadoop無縫結(jié)合;接著Shark(Spark上的數(shù)據(jù)倉庫實現(xiàn))借了Hive的勢;圖計算借 用Pregel和PowerGraph的API以及PowerGraph的點分割思想.一切的一切,都借助了Scala(被廣泛譽為Java的未來取代 者)之勢:Spark編程的Look'n'Feel便是原汁原味的Scala,無論是語法還是API.在實現(xiàn)上,又能靈巧借力.為支持交互式編 程,Spark只需對Scala的Shell小做修改(相比之下,微軟為支持JavaScript Console對MapReduce交互式編程,不僅要跨越Java和JavaScript的思維屏障,在實現(xiàn)上還要大動干戈).
Spark首先是一種粗粒度數(shù)據(jù)并行(data parallel)的計算范式.
數(shù)據(jù)并行跟任務(wù)并行(task parallel)的區(qū)別體現(xiàn)在以下兩方面.(1)計算的主體是數(shù)據(jù)集合,而非個別數(shù)據(jù).(2)集合內(nèi)的所有數(shù)據(jù)都經(jīng)過同樣的算子序列.
Spark 的突破在于,在保證容錯的前提下,用內(nèi)存來承載工作集.內(nèi)存的存取速度快于磁盤多個數(shù)量級,從而可以極大提升性能.關(guān)鍵是實現(xiàn)容錯,傳統(tǒng)上有兩種辦法:日 志和檢查點.考慮到檢查點有數(shù)據(jù)冗余和網(wǎng)絡(luò)通信的開銷,Spark采用日志數(shù)據(jù)更新.細粒度的日志更新并不便宜,而且前面講過,Spark也不擅長. Spark記錄的是粗粒度的RDD更新,這樣開銷可以忽略不計.鑒于Spark的函數(shù)式語義和冪等特性,通過重放日志更新來容錯,也不會有副作用.
三丶Spark內(nèi)存優(yōu)化
內(nèi)存優(yōu)化有三個方面的考慮:對象所占用的內(nèi)存(你或許希望將所有的數(shù)據(jù)都加載到內(nèi)存),拜訪對象的消耗以及垃圾回收(garbage collection)所占用的開銷.
通常,Java對象的拜訪速度更快,但其占用的空間通常比其內(nèi)部的屬性數(shù)據(jù)大2-5倍.這主要由以下幾方面原因:
1丶每一個Java對象都包括一個“對象頭”(object header),對象頭大約有16字節(jié),包括了指向?qū)ο笏鶎?yīng)的類(class)的指針等信息以.如果對象本身包括的數(shù)據(jù)非常少,那么對象頭有可能會比對象數(shù)據(jù)還要大.
2丶Java String在實際的字符串?dāng)?shù)據(jù)之外,還需要大約40字節(jié)的額外開銷(因為String將字符串保留在一個Char數(shù)組,需要額外保留類似長度等的其他數(shù)據(jù));同時,因為是Unicode編碼,每一個字符需要占用兩個字節(jié).所以,一個長度為10的字符串需要占用60個字節(jié).
3丶通用的集合類,例如HashMap、LinkedList等,都采用了鏈表數(shù)據(jù)結(jié)構(gòu),對于每一個條目(entry)都進行了包裝(wrapper).每一個條目不僅包括對象頭,還包括了一個指向下一條目的指針(通常為8字節(jié)).
4丶基本類型(primitive type)的集合通常都保留為對應(yīng)的類,如java.lang.Integer.
四丶數(shù)據(jù)格式
任何時候你都可以決定你的數(shù)據(jù)如何堅持在磁盤上,使用可擴展的二進制格式比如:Avro,Parquet,Thrift或者Protobuf,從中選擇一種.當(dāng)人們在談?wù)撛贖adoop上使用Avro,Thrift或者Protobuf時,都是認為每個 record 堅持成一個 Avro/Thrift/Protobuf 結(jié)構(gòu)保存成 sequence file.而不是JSON.
五丶調(diào)試資源分配
Spark 的用戶郵件郵件列表中經(jīng)常會出現(xiàn) “我有一個500個節(jié)點的集群,為什么但是我的應(yīng)用一次只有兩個 task 在執(zhí)行”,鑒于 Spark 控制資源使用的參數(shù)的數(shù)量,這些問題不應(yīng)該出現(xiàn).但是在本章中,你將學(xué)會壓榨出你集群的每一分資源.保舉的配置將根據(jù)不同的集群管理系統(tǒng)( YARN、Mesos、Spark Standalone)而有所不同,我們將主要集中在 YARN 上,因為這個 Cloudera 保舉的方式.
結(jié)語
以 上就是我保舉以上是對java開發(fā)Spark的性能調(diào)優(yōu)及特點分析問題及其優(yōu)化總結(jié),分享給大家,希望大家可以了解什么是java開發(fā)Spark的性能調(diào)優(yōu)及特點分析問題及其優(yōu)化.覺得收獲的話可以點個關(guān)注收藏轉(zhuǎn)發(fā)一波喔,謝謝大佬們支持!
1、多寫多敲代碼,好的代碼與扎實的基礎(chǔ)知識必定是實踐出來的.
2、可以去百度搜索騰訊課堂圖靈學(xué)院的視頻來學(xué)習(xí)一下java架構(gòu)實戰(zhàn)案例,還挺不錯的.
最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完.希望在成為一名更優(yōu)秀的Java法式員的道路上,我們可以一起學(xué)習(xí)、一起進步.(麻煩親關(guān)注一下~.~) 帥的人都已經(jīng)點贊了~.~
歡迎參與《java開發(fā)Spark的性能調(diào)優(yōu)及特點分析》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8005.html