[Spark] 學習筆記 (一)

1. 分區

爲了讓多個執行器並行地工作,Spark 將數據分解成多個數據塊,每個數據塊叫做一個分區。 分區是位於集羣中的一臺物理機上的多行數據的集合,DataFrame 的分區也說明了在執行過程 中,數據在集羣中的物理分佈。如果只有一個分區,即使擁有數千個執行器,Spark 也只有一 個執行器在處理數據。類似地,如果有多個分區,但只有一個執行器,那麼 Spark 仍然只有那 一個執行器在處理數據,就是因爲只有一個計算資源單位。

2. 轉換 (transformation)

  • 窄依賴關係(narrow dependency)的轉換: 每個輸入分區僅決定一個輸出分區的轉換。例如 where 語句指定了一個窄依賴關係,其中一個分區最多隻會對一個輸出分區有影響
  • 寬依賴關係(wide dependency)的轉換: 每個輸入分區決定了多個輸出分區, 例如 sort() 方法。這種寬依賴關係的轉換經常被叫做洗牌(shuffle)操作,它會在整個集羣中執行互相交換分區數據的功能。 默認情況下,shuffle 操作會輸出 200 個 shuffle 分區,修改這一設置可以使用: spark.conf.set(“spark.sql.shuffle.partitions”, “5”)
  • 對比: 如果是窄轉換,Spark 將自動執行流水線處理(pipelining),這意味着如果我們在 DataFrame 上指定了多個過濾操作,它們將全部在內存中執行。而屬於寬轉換的 shuffle 操作不是這樣,當我們執行 shuffle 操作時,Spark 將結果寫入磁盤。

3. 動作 (action)

分三類:

  • 在控制檯中查看數據的動作
  • 在某個語言中將數據彙集爲原生對象(native object)的動作
  • 寫入輸出數據源的動作

4. Dataset

Dataset 中可用的 API 是類型安全的,這意味着 Dataset 中的對象不會被視爲與初始定義的類不相同的另一個類。 這使得 Dataset 在編寫大型應用程序時尤其有效,這樣的話多個軟件工程師可以通過協商好的接 口進行交互。

5. 流處理

流數據動作與靜態數據動作有點不同,因爲我們首先要將流數據緩存到某個地方,而不是像對 靜態數據那樣直接調用 count 函數(對流數據沒有任何意義)。流數據將被緩存到一個內存上 的數據表裏,當每次被觸發器觸發(trigger)後更新這個內存緩存。在這個例中,因爲我們子 之前設置的 maxFilesPerTrigger 選項,每次讀完一個文件後都會被觸發,Spark 將基於新讀入的 文件更新內存數據表的內容,這樣的話,聚合操作可以始終維護着歷史數據中的最大值。

6. RDD (低級非結構化API)

  • RDD 比 DataFrame 更低級,因爲它向 終端用戶暴露物理執行特性(如分區)。
  • 創建 RDD 的兩種方法
    • 用 SparkContext 基於外部數據源創建 RDD,外部數據源包括 HDFS 上的文件、通過 JDBC 訪問的數據庫表或 Spark shell 中創建的本地對象集合;
    • 在一個或多個已有 RDD 上執行轉換操作來創建 RDD,這些轉換操作包括記錄過濾、對 具有相同鍵值的記錄做彙總、把多個 RDD 關聯在一起等。
  • RDD 轉 DF
    spark.sparkContext.parallelize(Seq(1, 2, 3)).toDF() // in Scala
    // in Python
    from pyspark.sql import Row spark.sparkContext.parallelize([Row(1), Row(2), Row(3)]).toDF()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章