Spark The Definitive Guide Spark權威指南 中文版。關注公眾號,閱讀中文版的Spark權威指南,系統學習Spark大數據框架!
Apache Spark是一個統一的分布式內存計算引擎,包括一組用於在計算機集群上進行並行數據處理的函數庫。截止目前,Spark已經成為大數據開發人員以及數據科學家的必備工具。Spark支持多種廣泛使用的編程語言(Python、Java、Scala和R),包括用於各種計算任務的庫:SQL結構化查詢到流計算、機器學習。Spark可以運行在PC電腦上,也可以運行在數千台服務器的集群上。
圖1-1說明了提供給最終用戶的所有組件和庫。
你會注意到這些類別大致對應於本書的不同部分。這並不奇怪;我們的目標是讓您了解Spark的各個方面,同時也說明了,Spark是由許多不同的組件組成的。
考慮到您正在閱讀這本書,您可能已經了解了一些關於Apache Spark的知識和它能做什么。盡管如此,在這一章中,我們想簡單介紹一下Spark背后的主要理念以及Spark產生的環境 (為什么每個人都突然對並行數據處理感到興奮?)和它的歷史。我們還將概述運行Spark的前幾個步驟。
1.1. Apache Spark的哲學
讓我們對Apache Spark的各個關鍵部分進行分別描述。
統一
Spark的關鍵驅動目標是為編寫大數據應用程序提供一個統一的平台。統一是什么意思? Spark的設計目的是支持廣泛的數據分析任務,從簡單的數據加載和SQL查詢到機器學習和流計算,這些都通過相同的計算引擎和一致的api集合實現。這一目標背后的主要見解是,現實世界的數據分析任務——無論它們是工具中的交互式分析,還是用於生產應用程序的傳統軟件開發——都傾向於結合許多不同的處理引擎類型和庫。
Spark的統一特性使得這些任務的編寫更加簡單和高效。首先,Spark提供了一致的、可組合的api,您可以使用這些api從較小的部分或現有的庫中構建應用程序。它還使您可以輕松地基於這些API編寫自己的分析庫。然而,可組合的api是不夠的: Spark的api也被設計為通過優化在用戶程序中組合的不同庫和函數來實現高性能。例如,如果您使用SQL查詢加載數據,然后使用Spark的ML庫評估機器學習模型,那么Spark計算引擎可以將這些步驟合並到一個步驟中,來掃描數據。通用api和高性能執行的結合,無論您如何組合它們,都使Spark成為交互式和生產應用程序的強大平台。
Spark專注於定義一個統一的平台,這與其他軟件領域的統一平台的想法是一致的。例如,當進行建模時,數據科學家受益於一組統一的庫(例如,Python或R),而web開發人員則受益於諸如Node.js這樣的統一框架. 在Spark之前,沒有一個開源系統試圖提供這種類型的統一引擎來進行並行數據處理,這意味着用戶應用程序中需要整合多個api來完成一項任務。因此,Spark很快成為了這種類型開發的標准。隨着時間的推移,Spark繼續擴展其內置的api,以覆蓋更多的工作任務。與此同時,該項目的開發人員繼續完善其統一引擎的主題。特別是,本書的一個重點將是在Spark 2.0中提供的“structured api”(DataFrames、dataset和SQL),structured api提供了在用戶應用程序下進行更強大的優化。
計算引擎
Spark在打造一個統一平台的同時,它小心地將其范圍限制在計算引擎上。(有所為有所不為)意思是,Spark處理從存儲系統加載數據並在其上執行計算,但最終數據並不永久存儲在Spark中。Spark可以和多種存儲系統結合使用,如Kafka、HBase、Hive、HDFS以及關系型數據庫。這樣做的原因是,大多數數據已經存在於現有存儲系統中。數據移動成本非常昂貴,所以Spark關注於對數據進行計算,不管數據在哪里。在面向用戶的api中,Spark努力使這些存儲系統看起來非常相似,因此應用程序不必擔心數據的位置。
Spark對計算的關注使得它有別於早期的大數據軟件平台,比如Apache Hadoop。Hadoop包括一個存儲系統(Hadoop文件系統HDFS,用低成本的商品服務器集群做存儲)和一個緊密集成的計算引擎(MapReduce)。Hadoop這種設計在某些場景下會出現難以抉擇的問題,如:如果只使用計算引擎MapReduce,而不使用存儲HDFS,此時無法割裂兩者,只能同時安裝。
盡管Spark在Hadoop存儲上運行得很好,但今天它在沒有Hadoop的環境中也廣泛使用。如Spark+kafka聯合起來,進行流處理。
函數庫
Spark的最終組件是它的庫,它以統一引擎的設計為基礎,為公共數據分析任務提供統一的API。Spark既支持使用內置的標准庫,也支持由開源社區發布為第三方包的大量外部庫。如今,Spark的標准庫實際上是Spark開源項目的主要部分: Spark 核心計算引擎自發布以來幾乎沒有變化, 但是,函數庫已經提供了越來越多的功能類型。Spark包括用於SQL和結構化數據的庫(Spark SQL)、機器學習(MLlib)、流處理(Spark流和新的結構化流處理Structured Streaming)和圖形分析(GraphX)。除了這些庫之外,還有數百個開放源代碼的外部庫,從各種存儲系統的連接器到機器學習算法。在spark-packages.org上有一個外部庫索引。
1.2. Spark產生的背景:大數據問題
為什么我們首先需要一個新的引擎和編程模型來進行數據分析? 與計算機的許多趨勢一樣,這是由於計算機應用程序和硬件構成的經濟因素發生了變化。
隨着處理器速度的提升,計算機的運行速度也在增加:因此,應用程序每年也會自動變得更快,而不需要對代碼進行任何修改。隨着時間的推移,這種趨勢導致了一個龐大而成熟的應用程序生態系統,其中大部分應用程序都設計為只在單個處理器上運行。這些應用程序采用了改進的處理器速度的趨勢,以便隨着時間的推移擴展到更大的計算和更大的數據量。
不幸的是,這種硬件的趨勢在2005年左右停止了: 由於在散熱方面的嚴格限制,硬件開發人員停止讓單個處理器的速度更快,轉而使用相同的速度增加更多的並行CPU內核。這種變化意味着需要修改應用程序以增加並行性,以便更快地運行,這為新的編程模型(如Apache Spark)創造了舞台。
與此同時,存儲成本也在下降,可以獲得的數據量在增加,如隨着互聯網的發展,視頻數據、圖像數據隨處可見。最終結果是,搜集了大數據量的內容,處理這些內容需要大的、並行度高的計算引擎,通常需要運行在集群之上。
此外,過去50年開發的軟件不能自動伸縮,傳統的數據處理程序的編程模型也不能滿足新的編程模型的需求。
Apache Spark就是為當前這個環境而生的。
1.4. Spark的現在和未來
Spark已經存在了許多年,仍然是當前最流行的大數據計算框架,使用Spark的公司和項目都在不斷增加。Spark本身也在不斷改進,新功能不斷增加,例如,2016年引入了一種新的高級流處理引擎,即Structured Streaming結構化流處理。
Spark將繼續成為在可預見的未來進行大數據分析的公司的基石,尤其是考慮到該項目仍在快速發展。任何需要解決大數據問題的數據科學家或工程師都可能需要在他們的機器上安裝一個Spark。
1.5. 運行Spark
本課程包含大量的與spark相關的代碼,並且很重要的一點是,您需要在學習過程中運行它。在大多數情況下,您需要交互式地運行代碼,以便可以進行試驗。
您可以使用Python、Java、Scala、R或SQL與Spark進行交互。Spark本身是用Scala編寫的,並在Java虛擬機(JVM)上運行,因此在您的筆記本或集群上運行Spark,您所需要的只是安裝Java環境。如果您想要使用Python API,您還需要一個Python解釋器(版本2.7或更高版本)。如果你想使用R,你需要在你的機器上安裝R語言環境。
有兩種選擇,我們建議開始使用Spark: 在您的筆記本電腦上下載並安裝Apache Spark。或者在Databricks Community Edition中運行基於web的版本,這是一個學習Spark的免費雲環境,其中包含了本書中的代碼。我們接下來解釋這兩個選項。
1.5.1. 下載Spark到本地
如果您想在本地下載並運行Spark,第一步是確保您的機器上安裝了Java(可用Java),以及Python版本,如果您想使用Python的話。接着,打開Spark官方網站http://spark.apache.org/downloads.html,選擇安裝包的版本和類型”Pre-built for Hadoop 2.7 and later”,然后點擊下載鏈接。此時會下載一壓縮包文件,需要加壓它。這本書的大部分是用Spark 2.2編寫的,所以下載版本2.2或以后應該是一個很好的起點。
1.5.1.1. 為Hadoop集群下載對應的Spark。
Spark可以在本地運行,不需要任何分布式存儲系統,比如Apache Hadoop。但是,如果您想將您的筆記本上的Spark版本連接到Hadoop集群,請確保您下載了該Hadoop版本對應的Spark版本。我們在后面的章節中討論了Spark是如何在集群和Hadoop文件系統上運行的,但是現在我們建議在您的筆記本上運行Spark。
1.5.1.2. 從源代碼構建Spark
我們不會在書中介紹這一點,但是您也可以從源代碼構建和配置Spark。您可以在ApacheSpark下載頁面上選擇一個源代碼包,以獲取源代碼,並按照README文件中的說明進行構建。
在您下載了Spark之后,您將希望打開一個命令行提示符並提取該包。在我們的例子中,我們安裝了Spark 2.2。下面是一個代碼片段,您可以在任何unix風格的命令行上運行,以解壓縮從Spark下載的文件並進入解壓后的目錄:
cd ~/Downloads
tar -xf spark-2.2.0-bin-hadoop2.7.tgz
cd spark-2.2.0-bin-hadoop2.7.tgz
注意,Spark在項目中有大量的目錄和文件。不要被嚇倒!這些目錄中的大多數只有在您閱讀源代碼時才有意義。下一節將討論最重要的方向——讓我們啟動Spark的控制台以進行交互使用。
1.5.2. 啟動Spark交互式控制台
您可以在Spark中為幾種不同的編程語言啟動交互式shell。本書的大部分內容是用Python、Scala和SQL編寫的;因此,這些是我們推薦的出發點。
1.5.2.1. 啟動Python控制台
為了啟動Python控制台,您需要安裝Python 2或3。從Spark的主目錄,運行以下代碼:
./bin/pyspark
完成之后,輸入“spark”並按Enter鍵。您將看到打印的SparkSession對象,我們將在第2章中介紹它。
1.5.2.2. 啟動Scala控制台
要啟動Scala控制台,您需要運行以下命令:
./bin/spark-shell
完成之后,輸入“spark”並按Enter鍵。與在Python控制台中看到的一樣,您將看到SparkSession對象,我們將在第2章中介紹它。
1.5.2.3. 啟動SQL控制台
本書的部分內容將涵蓋大量的Spark SQL。對於那些,您可能想要啟動SQL控制台。在我們討論了這些主題之后,我們將重新討論一些更相關的細節。
./bin/spark-sql
1.5.2.4. 在這本書中使用的數據
在本書中,我們將使用一些數據源作為示例。如果您想在本地運行代碼,可以從本書的官方代碼庫中下載這些代碼。簡而言之,您將下載數據,將其放入一個文件夾中,然后在本書中運行代碼片段!