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。


留言

熱門文章