Spark (1) Spark Shell 和 RDD
1. RDDs (Resilient Distribute Datasets):
RDD 則是指一個資料分片的集合,Partition 是資料分片,而 Partition 可能會在不同的機器上。
什麼意思呢,先來開個 spark shell 看看。
$ spark-shell
將一筆 data 分片,分片的目的是方便被 worker 平行化被處理。舉例來說你把一個工作拆成很多小部份,再分給各個手下去執行。
> val rdd = sc.parallelize(1 to 10)
看一下分割的狀況。
> rdd.getNumPartitions res0: Int = 8
資料被分成了 8 份。
2. Creating RDDs:
有兩種方法可以產生 RDD:
- 平行化一筆資料(如上面的範例)。
- 從檔案產生。
來看看如何把檔案變成 RDD。
> val lines = sc.textFile("hdfs://localhost:9000/client-ids.log")
如果你沒有 HDFS 可以用隨便一個本地檔案。
3. RDD Operations:
RDD 的操作分成兩類:
- Transformations: 會產生新的 RDD (e.g. map)。
- Actions: 不會產生新的 RDD (e.g. collect)。
map 是一個簡的 Transformation 函式:
> val rdd = sc.parallelize(1 to 10) > val drdd = rdd.map(_*2)
map 的參數對應的是一個 function,上面的 function 是我把每個遇到的元素都乘以 2。
把分散出去的元素收回來看看結果。
> drdd.collect res1: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
RDD 其實是惰性求值,它不會立即計算 transformation 的結果,而是當 action 被呼叫時才開始求值。 這樣的好處是可以避免運算資源被浪費在不必要的運算上。
另一個要注意的地方是不要對大資料使用 collect,這樣會把分散出去的東西及合成一個巨大的資料然後電腦就會 gg。
留言
張貼留言