認識 Spark

已完成

Spark 的核心是一個 資料處理引擎,這意味著它使資料工程師能夠跨分散式系統有效地提取、轉換和分析大量資料集。 它的與眾不同之處在於它能夠將不同類型的資料工作負載統一在一個框架下。 使用 Spark,您不需要單獨的系統來進行即時串流、批次處理、SQL 查詢或機器學習。 所有事情都可以在 Spark 中使用一組一致的 API 完成。

另一個優點在於它的易用性。 Spark 支援多種程式語言,包括 Python、Java、Scala 和 R。如果您已經熟悉 Python,則可以使用 PySpark(Spark 的 Python 介面)立即開始分析資料。

也許最重要的是,Spark 在構建時就考慮到了可擴展性。 您可以開始在本機電腦上進行實驗,然後在不變更程式碼的情況下,在數百或數千台機器的叢集上執行相同的應用程式。

Spark 的生態系統

雖然人們經常將 Spark 視為單一事物,但它實際上是一個建立在核心引擎之上的函式庫生態系統:

  • Spark Core 為分散式運算提供了基礎,包括任務調度、記憶體管理和故障復原。

  • Spark SQL 可讓您使用大多數分析師已經知道的語言來處理結構化資料:SQL。 它還與 Hive、Parquet 和 JSON 等外部數據源集成。

  • Spark Streaming 可讓您近乎即時地處理數據,這對於詐欺偵測或監控系統日誌等應用程式非常有用。

  • MLlib 是 Spark 的機器學習程式庫。 它提供用於分類、叢集、迴歸和建議的演算法的可擴展實作。

  • GraphX 用於圖形計算,例如分析社交網路或對實體之間的關係進行建模。

Spark 連結庫的圖表。

這些組件共同使 Spark 成為大多數大數據問題的一站式解決方案。

Spark 的運作方式

您可能想知道: 我為什麼要首先編寫 Spark 程式? 答案是規模。 當您的資料集太大而無法容納在單一機器上的記憶體中時,或者當您需要比 Pandas 或 Excel 等傳統工具管理的速度更快地完成運算時,Spark 就會介入。 Spark 可讓您撰寫與使用本機資料非常相似的程式碼,但它會自動將該工作分散到叢集中的許多機器上。 結果是,您可以分析 GB、TB 甚至 PB 的資料,而無需在每次資料集成長時重寫邏輯。

假設您的公司將網站點按流資料儲存在 Azure Data Lake Storage 中。 您想要篩選過去 24 小時內的所有點按次數,將其與使用者設定檔表格結合,然後計算前五個最常造訪的產品類別,以瞭解客戶行為。

以下是您在 Databricks 中實作此專案時所發生的情況:

  • 您的 筆記本 包含您用 Python (PySpark) 撰寫的程式碼,這會在驅動程式程式上執行。 驅動程式負責將您的高階命令 (例如篩選資料列或將資料分組) 轉換為較小任務的計劃。

  • 然後, 叢集管理程式 會將這些作業指派給不同的 執行程式。 每個執行程式都是在叢集中機器上執行的背景工作進程。 Apache Spark 叢集是互連伺服器群組,被視為單一運算引擎,並處理從筆記本發出的命令的執行。 一個執行程式可能會篩選使用者識別碼 1 到 100,000 前一天的點擊,另一個執行程式 (在相同或另一個伺服器上) 則篩選識別碼 100,001 到 200,000,依此類推。

  • 一旦所有執行器都完成了他們的部分工作,Spark 就會收集結果,將它們組合起來,並給您一個乾淨的 DataFrame,顯示頂級產品類別。

顯示 Spark 架構的圖表。

從您身為資料工程師的觀點來看,您只是在 Databricks 筆記本中撰寫熟悉的 DataFrame 程式碼。 Spark 負責分發數據、平行計算,並在集群中出現故障時重試任務。 這種設計讓 Spark 感覺平易近人——幾乎就像你在使用本地數據工具一樣——但在幕後,它正在協調可能數百台機器的高度並行、容錯計算。

惰性評估和 DAG

Spark 最重要的設計選擇之一是 惰性評估。 與 Pandas 等工具不同,每個操作都會立即執行,而 Spark 不會在您編寫命令後立即執行您的命令。 相反地,當您套用轉換 (例如篩選資料列、聯結資料表或選取資料行) 時,Spark 只會將這些作業記錄在計劃中。 實際上還沒有計算任何東西。 這種方法允許 Spark 在決定執行操作的最有效方式之前查看完整的操作序列。

在幕後,Spark 建置了作業的有向非循環圖 (DAG)。 圖表中的每個節點都代表一個資料集,而每個邊緣代表套用至該資料集的轉換。 由於圖形是非循環的,因此它會朝一個方向流動,從原始輸入資料到最終結果,而不會自行迴圈。 Spark 的優化器會分析此 DAG 以組合步驟、最大限度地減少數據移動並確定整個集群的最佳執行策略。

顯示火花定向無環圖 (DAG) 的圖表。

只有在您執行 動作時,才會開始執行,例如將結果收集至驅動程式、將資料寫入儲存體,或計算資料列。 此時,Spark 會將最佳化的 DAG 作為一系列工作提交給叢集管理員,叢集管理員會將它們分散到執行程式之間。 這種設計有助於Spark實現高效能:它避免了不必要的計算,減少了節點之間的資料洗牌,並確保叢集資源得到盡可能高效的使用。

Real-World 使用案例

許多行業的組織在需要處理和分析大型或快速移動的資料集時都會使用 Spark。 例如, 視訊串流服務 可能會使用 Spark 來建置建議引擎,以根據觀看歷史記錄建議新內容。 金融機構可以依靠 Spark Streaming 來即時監控交易並標記可疑活動。 在 醫療保健領域,研究人員可能會使用 Spark 大規模分析遺傳數據,以識別與疾病相關的模式。 即使在更傳統的業務環境中,Spark 也經常在準備和轉換原始營運資料方面發揮作用,以便將其用於儀表板和報告。

其他常見應用包括分析大量 Web 伺服器日誌、為物聯網 (IoT) 裝置提供即時 儀表板 支援、在非常大的資料集上訓練 機器學習模型 ,以及建立從多個來源擷取、清理和組合原始資料的 ETL 管道

相容性和部署選項

Spark 的優勢之一是它不會將您鎖定在單一基礎設施中。 相反,它旨在在各種分散式系統之上運行,這使您可以靈活地部署它的方式和位置。 在最簡單的層面上,Spark 可以在您自己的電腦上本地運行,從而可以輕鬆地嘗試小型資料集或學習基礎知識,而無需設定叢集。 當您需要更多功能時,可以在獨立的機器叢集上執行 Spark 來橫向擴展,或將其與處理排程和資源配置的 Hadoop YARN 或 Apache Mesos 等資源管理員整合。

在雲端中,Spark 在提供者之間得到廣泛支援。 例如, Azure DatabricksAzure Synapse AnalyticsMicrosoft Fabric 等服務可讓您輕鬆啟動 Spark 叢集,而不必擔心叢集設定和管理的詳細數據。 Spark 也越來越多地部署在 Kubernetes 上,這允許組織將其 Spark 應用程序容器化並在現代雲原生環境中運行它們。 這種靈活性意味著隨著需求的發展 (從本地開發到內部部署叢集,再到大規模雲端部署),您可以繼續使用相同的 Spark 應用程式,而無需針對不同的平台重寫它們。