天天看點

《Spark大資料分析:核心概念、技術及實踐》一 第3章 Spark Core

本節書摘來自華章出版社《spark大資料分析:核心概念、技術及實踐》一書中的第3章,第3.1節,作者[美] 穆罕默德·古勒(mohammed guller),更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

第3章

spark core

spark是大資料領域最活躍的開源項目,甚至比hadoop還要熱門。如第1章所述,它被認為是hadoop的繼任者。spark的使用率大幅增長。很多組織正在用spark取代hadoop。

從概念上看,spark類似于hadoop,它們都用于處理大資料。它們都能用商用硬體以很低的成本處理大資料。然而,相比于hadoop,spark有很多的優勢,這些将在本章進行介紹。

本章主要介紹spark core,這也是spark生态系統的基礎。我們首先概述spark

core,然後介紹spark的總體架構和應用程式運作時的情況。spark core的程式設計接口也會一并介紹。

3.1 概述

spark是一個基于記憶體的用于處理、分析大資料的叢集計算架構。它提供了一套簡單的程式設計接口,進而使得應用程式開發者友善使用叢集節點的cpu、記憶體、存儲資源來處理大資料。

3.1.1 主要特點

spark的主要特點如下:

使用友善

快速

通用

可擴充

容錯

spark提供了比mapreduce更簡單的程式設計模型。使用spark開發分布式的資料處理應用程式比用mapreduce簡單多了。

spark針對開發大資料應用程式提供了豐富的api。它提供了80多個用于處理資料的操作符。而且,spark提供了比hadoop

mapreduce更易讀的api。相比之下,hadoop mapreduce隻有兩個操作符,map和reduce。hadoop要求任何問題都必須能夠分解為一系列的map作業和reduce作業。然而,有些算法卻難以隻用map和reduce來描述。相比于hadoop mapreduce,使用spark提供的操作符來處理複雜的資料顯得更加簡單。

而且,使用spark可以寫出比用hadoop

mapreduce更簡潔的代碼。用hadoop

map-reduce需要寫大量的子產品代碼。同樣的資料處理算法,用hadoop mapreduce實作需要50行,而用spark隻需要10不到。有了豐富易讀的api,消除了子產品代碼,開發者的生産力大幅提升。相對于使用hadoop,使用spark開發者的生産力會有5~10倍的提升。

spark要比hadoop快上若幹個數量級。如果資料都加載在記憶體中,它能快上數百倍,哪怕資料無法完全載入記憶體,spark也能快上數十倍。

尤其是在處理大資料集的時候,速度顯得至關重要。如果一個處理資料的作業要花費數天或小時,那麼它将拖慢決策的速度,進而降低資料的價值。反之,如果同樣的處理能提速十倍乃至百倍,它将會創造更多的機會。它甚至可能開創出前所未有的新資料驅動應用程式。

spark比hadoop快的原因有兩方面。一方面,它可以使用基于記憶體的叢集計算。另一方面,它實作了更先進的執行引擎。

得益于基于記憶體的叢集計算,spark的性能有了數量級的提升。相比于從硬碟讀取資料,采用從記憶體讀取資料的方式,獲得的順序讀取吞吐量要大100倍。換句話說,從記憶體讀取資料要比從硬碟快100倍。當應用程式隻讀取和處理少量資料時,記憶體和硬碟之間讀取速度的差距并不太明顯。然而,一旦資料量達到太位元組級别,i/o延遲(資料從硬碟載入記憶體所花費的時間)就會顯著影響作業執行時間。

spark允許應用程式利用記憶體緩存資料。這能減少磁盤i/o。一個基于mapreduce的資料處理流水線可能包含多個作業。每個作業都需要從硬碟載入資料,處理它,而後再寫入硬碟中。而且,一個使用mapreduce實作的複雜資料處理應用程式可能需要反複從硬碟讀取資料,寫入資料。由于spark允許利用記憶體緩存資料,是以使用spark實作的同樣的應用程式隻需要從硬碟讀取資料一次即可。一旦資料緩存在記憶體中,接下來的每一個操作都可以直接操作緩存的資料。就像前面說的一樣,spark可以減少i/o延遲,這樣就能顯著減少作業總的執行時間。

需要注意的是,spark不會自動将輸入資料緩存在記憶體中。一個普遍的誤解是,一旦無法把輸入資料完全載入記憶體,那麼spark将無法使用。這并不正确。spark可以在叢集上處理太位元組級的資料,哪怕叢集的總記憶體隻有僅僅100gb。在資料處理流水線上何時緩存和緩存哪部分資料完全由應用程式決定。實際上,如果資料處理應用程式隻使用一次資料,那麼它完全不需要緩存資料。

spark比hadoop mapreduce快的第二個原因是它擁有更先進的作業執行引擎。spark和hadoop一樣都将一個作業轉化為由若幹個階段構成的有向無環圖(dag)。如果你不熟悉圖論,這裡簡單介紹下。圖是一個由頂點構成的集合,這些頂點由邊相連。有向圖指的是那些邊有方向的圖。無環圖指的是不存在環路的圖。dag指的就是不存在環路的有向圖。換句話說,在dag中不存在一條起點和終點都是同一個頂點的通路。第11章将對圖進行更詳細的介紹。

hadoop mapreduce對任意一個作業都會建立由map和reduce兩個階段構成的有向無環圖。如果一個複雜的資料處理算法用mapreduce實作,可能需要劃分成多個作業,而後按順序執行。這種設計導緻hadoop mapreduce無法做任何的優化。

與之相反,spark并沒有迫使開發者在實作資料處理算法的時候将其劃分成多個作業。spark中的dag可以包含任意個階段。一個簡單的作業可能隻有一個階段,而一個複雜的作業可能會有多個階段。這使得spark可以做些hadoop無法實作的優化。spark可以一次執行一個包含多階段的複雜作業。因為它擁有所有階段的資訊,是以可以進行優化。舉例來說,它可以減少磁盤i/o和資料shuffle操作的時間。資料的shuffle操作通常會涉及網絡間的資料傳輸,并且會增加應用程式的執行時間。

spark為各種類型的資料處理作業提供一個統一的內建平台。它可以用于批處理、互動分析、流處理、機器學習和圖計算。相比之比,hadoop mapreduce隻适合批處理。是以一個使用hadoop mapreduce的開發者為了能做流處理和圖計算隻能使用其他的架構。

對于不同類型的資料處理作業使用不同的架構,帶來了很多問題。首先,開發者不得不學習各種架構,每種架構的接口都不相同。這降低了開發者的生産力。其次,每種架構都相對獨立。是以,資料也必須複制多份,存放在不同的地方。類似地,代碼也必須重複多份,存放在多個地方。比如,你想使用hadoop mapreduce處理曆史資料,同時使用storm(一個流處理架構)處理流式資料,二者采用同樣的算法,那麼你不得不維護兩份相同的代碼,一份是hadoop mapreduce的,一份是storm的。最後,同時使用多個架構帶來了運維上的麻煩。你得為每一個架構建立并維護一個單獨的叢集。要知道維護多個叢集可比維護一個困難多了。

spark自帶了一系列的庫,用于批處理、互動分析、流處理、機器學習和圖計算。使用spark,可以使用單一架構來建立一個包含多個不同類型任務的資料處理流水線。進而,再也沒有必要為了多個不同類型的資料處理任務而學習不同架構或者部署單獨的叢集了。使用spark有助于降低運維的困難度,減少代碼和資料的重複。

有意思的是,越來越多流行的應用和庫開始內建到spark中或添加了對spark的支援,而它們一開始是使用hadoop作為其執行引擎的。比如apache mahout(一個建構于hadoop之上的機器學習庫)正在內建到spark中。到了2014年4月,mahout的開發者已經放棄了hadoop并且不再添加新的基于mapreduce的機器學習算法了。

同樣地,hive(見第1章)的開發者也正在開發一個運作在spark上的版本。pig(一個可以用腳本語言來建立資料處理流水線的資料分析平台)同樣支援spark作為它的執行引擎。cascading(一個用于開發hadoop資料應用程式的應用開發平台)也添加了對spark的支援。

可拓展

spark是可擴充的。spark叢集的資料處理能力可以通過增加更多叢集節點的方式得以提升。你可以從一個小叢集開始,随着資料量的增加,逐漸增加更多的計算能力。這相當經濟。

而且,spark的這個特性對于應用程式來說是透明的。當你往spark叢集增加節點的時候無須改動任何代碼。

spark是可容錯的。一個由數百個節點構成的叢集中,每個節點在任何一天故障的可能性都很高。硬碟損壞或其他硬體問題都有可能導緻節點不可用。spark能自動處理叢集中的節點故障。一個節點故障可能會導緻性能下降但不會導緻應用無法運作。

既然spark能自動處理節點故障,應用程式的開發者就不必在應用中處理這樣的異常情況了,這簡化了應用程式的代碼。

3.1.2 理想的應用程式

就像前面讨論的那樣,spark是一個通用架構,它用于各種大資料應用中。然而,對于一個理想的大資料應用程式而言,速度是相當重要的。使用疊代資料處理算法的應用和互動分析都是這樣的典型應用。

疊代算法

疊代算法是指那些在同樣資料上疊代多次的資料處理算法。使用這類算法的應用包括機器學習和圖處理應用。這些應用都在同樣的資料上疊代數十次乃至數百次算法。對于這類應用,spark是理想的選擇。

spark記憶體計算的特性使得在spark上面執行這些疊代算法比較快。由于spark允許應用在記憶體中緩存資料,是以一個疊代算法哪怕需要疊代100次,也隻需要在第一次疊代的時候從硬碟讀取資料,接下來的疊代都從記憶體中讀取。而從記憶體中讀取資料比從硬碟要快100倍,是以在spark上運作這些應用能快上一個數量級。

互動分析

互動式資料分析涉及互動式地探索資料。舉例來說,對于一個巨型資料集,在觸發一個可能需要花費數小時的長時間運作的批處理作業之前,先進行彙總分析是很有用的。類似地,一個商業分析師可能想要使用bi或資料可視化工具來進行互動分析。在這種場景下,使用者會在同一個資料集上執行多個查詢。spark就提供了這樣一個用于大資料互動分析的理想平台。

spark适用于互動分析的理由還是它的記憶體計算特性。應用程式可以緩存資料,進而使得資料能夠在記憶體中進行互動分析。第一個查詢請求從硬碟讀取資料,但是接下來的一連串請求都從記憶體中讀取緩存資料。查詢記憶體中的資料要比硬碟中的資料快上一個數量級。當資料緩存在記憶體中的時候,一個查詢請求可能隻需要花費數秒,而在硬碟中則需要不止一個小時。

繼續閱讀