1.盡量用 aggregatebykey 和 reducebykey和combinebykey, 替代 groupbykey。這個開發過程中深有體會,groupbykey極易引發各種oom。。。
2.repartition 適用於 rdd[v], partitionby 適用於 rdd[k, v].
3.盡量避免在乙個 transformation 中處理所有的邏輯, 盡量分解成 map, filter 等之類的操作
4.如果有 rdd 復用, 特別是該 rdd 是需要花費比較長時間才能運算出來的, 建議對該 rdd 做 cache, 如果該 rdd 每個 partition 需要消耗很多的記憶體, 建議開啟 kryo 序列化機制(可節省2到5倍的空間) 如果還是有比較大的記憶體開銷, 建議將該 rdd 的 storage level 設定成memory_and_disk_ser
5.使用者程式打包時, 可以在 pom.xml 中將 spark 依賴, hbase 依賴, hadoop 依賴都設定成 provided
7.多個rdd union時, 避免使用rdd.union(rdd).union(rdd).union(rdd)的操作, rdd.union只適合兩個rdd的操作, 多個rdd union時採用sparkcontext.union(array(rdd)),以此避免union操作巢狀層數太多,從而過程呼叫鏈路太長, 耗時甚至引發stackoverflow
8.spark cogroup/join類/***bykey等操作中都可以指定partitions的個樹, 不需要額外使用repartition操作和partitionby操作.
9.盡量保證每輪stage裡每個task處理的資料量 > 128mb.
10.讀取的hdfs檔案的如果是大量很小的, 使用hadoop的combineinputformat讀取.
11.如果兩個rdd做join, 其中乙個資料量很小, 採用broadcastjoin, 將小的rdd資料 collect回driver, 將其broadcast到另乙個rdd中.
12.兩個rdd做cartesian時, 資料小的rdd作為引數傳入, 類似bigrdd.cartesian(smallrdd)
13.如果需要broadcast乙個大的物件到遠端, 當作字典查詢, 建議多executor-cores, 大executor-memory. executor-memory的值可以參考, 假設先將該大字典是放在乙個外部儲存系統時, executor-cores=1, executor-memory=m(g, 預設=2g)時可以正常執行, 當大字典的size=n(g)時, executor-memory=2n, 且executor-cores=n/m, (向上取整)
14.如果實在無法broadcast到遠端, 可採用一種zippartitions方式實現的hash join的方式,前提是根據大rdd的的key去refer小rdd中的key,而不是根據大rdd中的value, 去refer小rdd中的key:
val rdd1: rdd[(keytype, valuetype)] =.... // bigone, partitions = 1000
val rdd2: rdd[(keytype, valuetype)] = .... // smallone, partitions = 100
val rdd2partioned = rdd2.partitionby(new hashpartitioner(1000)) // 保持與大的rdd1的partitions大小一致.
val mapdata = new hashmap[keytype, valuetype]()
iter.map
iterator(mapdata)
}rdd1.zippartitions(rdd2, preservespartitioning = true)(
}})
15.在編寫程式時, 應時刻考慮處理過程中如何出來異常資料.
16.有異常資料時, 存在單個key的values過多, 在做aggregatebykey/groupbykey等操作時, 應該時刻關注是否需要保留過多的values, 是否可以判定values size超過某特定大小的(如1000)key為異常資料, 從而過濾或做異常處理比如截斷, 或者可以考慮分段values, 例如key轉化成key_1,key_2,key,3等, 或者可以key_value形式做相應處理。
17.存在key層次的資料熱點, 意味中不同key的hashcode shuffle到了同一節點上, 可以通過反轉key來打散熱點.
注:本文內容來自團隊內部wiki。
c語言程式設計Tips
程式設計tips 少加括號,減少閱讀的難度。在優先順序明顯的情況下 在使用等於號 時,常量放左邊,變數放右邊,避免出錯 寫成賦值運算子 短路運算 代替 if 0 j printf you can t see me n 1 j printf your can t see me n 整形乘除2的倍數可以...
spark程式設計
spark應用程式由兩部分組成 1.driver 2.executor 基本概念 sparkcontext spark應用程式的入口,負責排程各個運算資源,協調各個worker node 的executor 並且負責將資料存在記憶體或磁碟上 cluster manager 集群上獲取資源的外部服務 ...
spark 程式設計教程
參考 英文 中文 1.2.1版本的 一 快速入門 老規矩,先看乙個簡單示例,有個認識。這個示例來自官方example的sparkpi package org.lujinhong.demo.spark 官方的sparkpi示例 import scala.math.random import org.a...