Spark調(diào)優(yōu)

  1. 調(diào)優(yōu)的原因
Because of the in-memory nature of most Spark computations, 
Spark programs can be bottlenecked by any resource in the cluster: 
CPU, network bandwidth, or memory.

因?yàn)閟oark計(jì)算是基于內(nèi)存的泄隔,所以spark程序的瓶頸是集群上的資源包括: 
CPU, 帶寬或內(nèi)存
Most often, if the data fits in memory, the bottleneck is network bandwidth, 
but sometimes, you also need to do some tuning, such as storing RDDs in serialized form, 
to decrease memory usage
如果數(shù)據(jù)和內(nèi)存大小匹配台腥,瓶頸就是網(wǎng)絡(luò)帶寬姆另, 但是有時(shí)呵扛,
你仍然需要做一些調(diào)優(yōu)來減少內(nèi)存使用情況形用,比如序列化存儲(chǔ)RDD
  1. 數(shù)據(jù)序列化

2.1 序列化的原因

(1) 數(shù)據(jù)通過網(wǎng)絡(luò)傳輸需要序列化
(2) 進(jìn)程間通信也需要序列化

2.2 Example
2.2.1 Writable接口
2.2.1.1 注釋

A serializable object which implements a simple, efficient, 
serialization protocol
使用一個(gè)簡單地高效的協(xié)議實(shí)現(xiàn)一個(gè)序列化對象

2.2.1.2代碼

public interface Writable {
  void write(DataOutput out) throws IOException;
  void readFields(DataInput in) throws IOException;
}

2.2.1.3. 補(bǔ)充說明

實(shí)現(xiàn)Writable的類都可以序列化计福,所以在Hadoop中建議使用IntWritable而不是簡單的使用Int

2.3 序列化在Spark中的使用場景

(1)算子中使用到外部變量(broadcast variable)豌鹤,需要經(jīng)過網(wǎng)絡(luò)傳輸蝉绷,肯定需要序列化鸭廷,用更好的序列化方式,序列化體積更小熔吗,網(wǎng)絡(luò)傳輸?shù)拈_銷會(huì)小辆床,如果放到內(nèi)存中,占的內(nèi)存也小

(2) cache
(3) shuffle

2.4 序列化具體描述(官網(wǎng)翻譯)

Serialization plays an important role 
in the performance of any distributed application
序列化在任意分布式系統(tǒng)中扮演重要的角色
Formats that are slow to serialize objects into, 
or consume a large number of bytes, 
will greatly slow down the computation.
不好的序列化方法(如緩慢序列化對象桅狠,
或者占據(jù)大量bytes的序列化結(jié)果)將會(huì)使計(jì)算變得緩慢
It provides two serialization libraries
它提供了兩種序列化庫
Java serialization(優(yōu)勢在于能兼容任意的class): 
By default, Spark serializes objects using Java’s ObjectOutputStream framework, 
and can work with any class you create that
implements java.io.Serializable. 
Java序列化: 默認(rèn)情況下讼载,Spark 使用java的ObjectOutputStream框架序列化對象,
并且能夠和任何任何實(shí)現(xiàn)java.io.Serializable的類一起使用
//java.io.ObjectOutputStream注釋
An ObjectOutputStream writes primitive data types 
and graphs of Java objectsto an OutputStream
ObjectOutputStream將原始數(shù)據(jù)類型和java對象寫入到一個(gè)OutputStream中
//java.io.Serializable
public interface Serializable {
}

java.io.Serializable是一個(gè)marker interface, 
任何實(shí)現(xiàn)該interface的接口就可以做序列化
You can also control the performance of your serialization 
more closely by extendingjava.io.Externalizable
你能通過extendingjava.io.Externalizable更精確的控制
你的序列化的性能(但是一般情況下不使用)
java serialization is flexible but often quite slow, 
and leads to large serialized formats for many classes
Kryo serialization(優(yōu)點(diǎn)速度快中跌,體積小): 
Spark can also use the Kryo library (version 4) 
to serialize objects more quickly
Kryo 序列化: Spark可以使用Kryo庫(version 4)更快速的去序列化對象
Kryo is significantly faster and more compact than Java serialization (often as much as 10x), 
but does not support all Serializable types and requires you 
to register the classes you’ll use in the program 
in advance for best performance
Kryo比Java序列化更快速并且更緊湊(體積更小), 通常是java序列化的10倍咨堤,
但是其并不能支持所有的序列化類型并且為了更好的性能,
你需要提前注冊你將會(huì)在driver程序中使用的類
You can switch to using Kryo by initializing your job with a SparkConf and 
calling conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
你可以通過在用SparkConf初始化Spark作業(yè)時(shí)設(shè)置
set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
來切換使用Kryo
  val sparkConf = new SparkConf().
                      setMaster("local[2]").
                      setAppName("SparkContextApp").
                      set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
This setting configures the serializer used for not only shuffling data 
between worker nodes but also when serializing RDDs to disk
這個(gè)設(shè)置配置的serializer不止是使用于在不同的work node之間傳遞的shuffling數(shù)據(jù)漩符,
并且使用于當(dāng)RDD序列化磁盤上時(shí)
The only reason Kryo is not the default is because of 
the custom registration requirement, 
but we recommend trying it in any network-intensive application
Kryo不是默認(rèn)的序列化庫是因?yàn)樽远x注冊的需要一喘,
但是使用kryo是推薦使用在網(wǎng)絡(luò)密集型的應(yīng)用上
Since Spark 2.0.0, we internally use Kryo serializer 
when shuffling RDDs with simple types, 
arrays of simple types, or string type
自從Spark 2.0.0,當(dāng)RDDs是簡單類型的集合嗜暴,
簡單類型的數(shù)組或者是String類型的時(shí)候凸克,
我們內(nèi)部使用Kryo序列化器
Finally, if you don’t register your custom classes, 
Kryo will still work, but it will have to store 
the full class name with each object, which is wasteful
最后,如果你不注冊自定義的類闷沥,Kryo仍然會(huì)起作用萎战,
但是會(huì)存儲(chǔ)每個(gè)對象的包名+類名,這樣做是浪費(fèi)的

2.5 程序中使用序列化

def class
val sparkConf = new SparkConf().
                setMaster("local[2]").
                setAppName("SparkContextApp").
                set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").
                registerKryoClasses(Array(classOf[abc]))

2.6 具體實(shí)例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舆逃,一起剝皮案震驚了整個(gè)濱河市蚂维,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颖侄,老刑警劉巖鸟雏,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異览祖,居然都是意外死亡孝鹊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門展蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來又活,“玉大人苔咪,你說我怎么就攤上這事×荆” “怎么了团赏?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耐薯。 經(jīng)常有香客問我舔清,道長,這世上最難降的妖魔是什么曲初? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任体谒,我火速辦了婚禮,結(jié)果婚禮上臼婆,老公的妹妹穿的比我還像新娘抒痒。我一直安慰自己,他們只是感情好颁褂,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布故响。 她就那樣靜靜地躺著,像睡著了一般颁独。 火紅的嫁衣襯著肌膚如雪彩届。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天誓酒,我揣著相機(jī)與錄音惨缆,去河邊找鬼。 笑死丰捷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寂汇。 我是一名探鬼主播病往,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骄瓣!你這毒婦竟也來了停巷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤榕栏,失蹤者是張志新(化名)和其女友劉穎畔勤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扒磁,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庆揪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妨托。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸榛。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吝羞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出内颗,到底是詐尸還是另有隱情钧排,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布均澳,位于F島的核電站恨溜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏找前。R本人自食惡果不足惜糟袁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纸厉。 院中可真熱鬧系吭,春花似錦、人聲如沸颗品。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躯枢。三九已至则吟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锄蹂,已是汗流浹背氓仲。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留得糜,地道東北人敬扛。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像朝抖,于是被迫代替她去往敵國和親啥箭。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:https://yq.aliyun.com/articles/461770?spm=a2c4e.111630...
    嚴(yán)國華閱讀 953評論 0 11
  • 1治宣、 性能調(diào)優(yōu) 1.1急侥、 分配更多資源 1.1.1、分配哪些資源侮邀? Executor的數(shù)量每個(gè)Executo...
    熱蘇斯閱讀 185評論 0 1
  • 1坏怪、 性能調(diào)優(yōu) 1.1、 分配更多資源 1.1.1绊茧、分配哪些資源铝宵? Executor的數(shù)量 每個(gè)Executor所...
    Frank_8942閱讀 4,550評論 2 36
  • 常規(guī)性能調(diào)優(yōu) 1. 最優(yōu)資源配置 Spark性能調(diào)優(yōu)的第一步,就是為任務(wù)分配更多的資源华畏,在一定范圍內(nèi)捉超,增加資源的分...
    Jasper_Chen閱讀 439評論 0 0
  • 調(diào)優(yōu)的思路依賴平時(shí)工作中不斷總結(jié)所形成的豐富經(jīng)驗(yàn)胧卤。而這些是很難直接從知識文檔中獲取的,應(yīng)當(dāng)具體問題具體分析拼岳,本文對...
    TOTower閱讀 700評論 2 11