今天內容
1.RRD持久化實戰
2.Spark廣播實戰
3.Spark累加器實戰
如果想在命令終端中看到執行結果,就必須collect
凡是Action級別的操作都會觸發sc.runJob
Spark所有的算法 都有persit。
persit原因: Spark在默認情況下,數據放在內存,適合高速迭代,風險當然也高,所以需要將前面的操作進行persit.
persist:
1.某步驟計算特別耗時;
2.計算鏈條特別長的情況;
3.checkpoint坐在的RDD也一定要持久化數據;
4.shuffle之後;
5.shuffle之前(框架默認幫助我們把數據持久化到本地磁盤)
前4步手動的,第5是系統自動的
序列化目的 爲節省空間
將內存中的數據序列化,使用數據時需要反序列化
StorageLevel
MEMORY
MEMORY_AND_DISK , 主要防止OOM
'都是使用內存,如果MEMORY不夠,OOM數據會丟失
sc.textFile("/library/wordcount/input/Data").flatMap(_.split(" ")).map(word => (word, 1)).reduceByKey(_+_,1).cache.count
val cached = sc.textFile("/library/wordcount/input/Data").flatMap(_.split(" ")).map(word => (word, 1)).reduceByKey(_+_,1).cache
Cache之後一定不能立即有其它算子!!!
廣播是由Driver發給當前Application分配的所有Executor內存級別的全局只讀變量,Executor中的線程池中的線程共享該全局變量,極大的減少了網絡傳輸(否則的話每個Task都要傳輸一次該變量)並極大的節省了內存,當然也隱形的提高的CPU的有效工作。
任務能享用 唯一的變量 ,減少OOM的可能
大變量: 默認情況下,每個Task一定會COPY份數據副本,函數式編程變量不變. 變量大會導致 OOM
內存佔用大,如果變量比較大,剛極易出現OOM
累加器,全局級別的
Accumulator:對於Executor只能修改但不可讀,只對Driver可讀
附上王老師個人名片信息
王家林 中國Spark第一人
DT大數據夢工廠新浪微博: http://weibo.com.ilovepains/微信公共號:DT_Spark博客:http://bolg.sina.com.cn/ilovepains手機:18610086859qq:1740415547郵箱:[email protected]