201506111603Big Data 新寵兒 Apache Spark 系列 - Spark 與 Hadoop 初次見面篇

#前言

很久沒有更新部落格了

小弟自從工作後就開始接觸BigData相關的技術

很想寫成日記分享給大家,可惜苦無時間XD

現在終於有機會可以發個幾篇,算是反饋給社群好了

#spark 相關資訊

+ Spark 官網: http://spark.apache.org/

+ AMPLab :https://amplab.cs.berkeley.edu/

 

#Spark 是啥

相信會點進這篇的,應該是對Spark有興趣的

在認識Spark之前,必須先知道他整個生態系統是什麼

Spark其實是BDAS家族的一個分支

所謂BDAS就是由柏克萊加州大學(UC. Berkerly) AMPLab 所發展的軟體堆疊項目

上圖淺藍色的部分,就是BDAS發展的軟體項目,大部分都是開源社群維護,有些有Apache基金會贊助

而其中大多採用的In-Memory技術來犯規加速(誤),當然其中也有很多優化演算法在裡面(因為一堆博班、碩班都要靠這個畢業XD)

BDAS除了自己本身發展的很多項目外,也與Hadoop中部分元件相容

例如Yarn和HDFS

=======================

YARN

Yarn是 Hadoop的資源管理框架,他將MapReduce結構從1.0抽離出來,變成一個"Framework",然後將JobTracker與TaskTracker中的資源管理部份抽離出來,發展成Yarn,藉此控管整個資源的分配。

Yarn透過虛擬容器的技術來同時運行多個運算Framework,可以想像在一台機器裡面又多開好幾個小虛擬機,但技術上他是許多個JVM或Linux container,來達到運算資源獨立(CPU Memory)的目的。

簡單來說Yarn就是包租公,管理好幾座場地,當有需求(送出Hadoop Task )時,承租人(JobTracker) 會向包租公提出資源申請,包租公就會開始從不同場地中劃分幾個房間出來,以供JobTracker指派各個TaskTracker工人到各個房間去做事情

所以說,原來的Client Server架構可以不用改變,只是原本獨佔的機器資源,變成由包租公(Yarn)進行資源的管理

同理

Spark本身也可以是Yarn的一個Framework,能夠透過Yarn去分配資源來執行,Spark的詳細結構,後面的章節會再介紹

================

HDFS

這邊我就不多做解釋,與原始架構差不多,由NameNode與DataNode組成

NameNode負責儲存各檔案Block之Block,與Block置放的問題

DataNode則負責實際儲存資料與提取資料

所有的檔案存取請求,都是透過HDFS API向NameNode提出,NameNode會負責導向該檔案Block所在的位址

HDFS其實就像是網路上的芳鄰(或Samba)

任何電腦都可以存取,當然也有"掛載"到某個資料夾的功能(有興趣可以看fuse),使HDFS操作起來跟一般檔案系統差不多

Spark原生支援的分散式儲存就包含了HDFS項目

===================================

原則上Spark家族與Hadoop家族之間共用的部分,大致上就HDFS與Yarn

接著談到有關BDAS家族的東西

========================================

MESOS

他其實也是一個資源管理的框架,其實運作的概念與Yarn很像

而Mesos比較偏效能導向,因為整個調度框架都是用C語言刻出來的

然後Mesos 的Container是採用Linux Container技術(LCX),中間沒有在架空一層JVM

因此可以做到更輕量,更快速。

MESOS有這麼多好處,為什麼不流行呢?

因為Hadoop 2.0原生就是支援Yarn,並沒有對Mesos做支援

而市面上的廠商,如Cloudera或Hortonwork都是以Yarn為基底(因為都Hadoop家族),許多企業都因此安裝和使用

故,Mesos是被集體霸凌(誤)

應該說,大多數的框架都是採用Yarn來實作,而兩套資源調度框架也不能同時存在,因此經過種種考量,大多數的人還是會屈就於Yarn

========================================

TACHYON

這東西可以說,是HDFS的快取層級

也就是在HDFS上面墊一層,但是對上面的程式來說,是沒有感覺的

可以想像,Tachyon就是電腦的不斷電系統,他Input吃牆壁上的110v電壓,輸出也是110v電壓,因此一般電器直接插在上面是沒有影響的

但是在停電的時候,能夠切換到由電池來供電

所以說咧,Tachyon本身會記錄HDFS中的許多存取行為,將被存取過的檔案一部份Cache到記憶體中,等待下一次程式在來要資料的時候,能夠快速給他

(其實用Proxy Server當例子會更好)

這樣就能解決MapReduce中間讀寫DISK的IO瓶頸

=============================================

Spark

Spark 也是BDAS中的一個項目,但其知名度與聲浪非常響亮

他是一個結合In-memory與RDD技術的分散式資料操作與運算框架

 

Spark 與Hadoop 架構上的比較

+運算框架上的優勢

Spark 個人覺得是一個很不錯的運算框架,他相對於原生Hadoop來說,解決了很多瓶頸

尤其是在常常用到迭代式運算求最佳化的機器學習演算法中幫了很大的忙,就連Mahout也放棄了Hadoop轉頭Spark懷抱 (有興趣可以去Mahout官網看看XD)

看到這段,也許有人看不懂,我大概說明一下

以往我們在寫Hadoop的程式時,MapReduce的框架通常很死,就是:

假設我要找最佳點,如K-means

我必須經過上圖的狀態,好幾回

也就是:

讀取HDFS -> Map -> Reduce - 寫入HDFS ->

讀取HDFS -> Map -> Reduce - 寫入HDFS ->

讀取HDFS -> Map -> Reduce - 寫入HDFS ->

讀取HDFS -> Map -> Reduce - 寫入HDFS ->

讀取HDFS -> Map -> Reduce - 寫入HDFS ->

各位可以發現,中間多了非常多的HDFS寫入動作,加上啟動Task都需要時間,使得K-means 運算顯得效率不彰

 

而Spark不同,他沒有所謂的"Map"和"Reduce"動作

而是通通由"Transformation"取代掉

而每個"Transofrmation"之間,會使用到記憶體優化技術,算過的就會先keep在記憶體當中,使得整體效率提升

接著眼尖的觀眾可以發現,Map Reduce你要馬就是執行一次Map,不然就是一次Map然後接著Reduce

你並無法送出一個任務,能夠執行 Map -> Map -> Reduce -> Map的。如果要這麼做,至少要拆成三段任務來寫

開發上非常耗時,且比較沒有效率

而Spark 他允許你這麼做

 

+程式開發上的優勢

接著Spark透過匿名函數來定義操作方法,會讓程式碼顯得很乾淨

同樣的MapReduce WordCount example,

text_file = spark.textFile("hdfs://...")
 
text_file.flatMap(lambda line: line.split())
    .map(lambda word: (word, 1))
    .reduceByKey(lambda a, b: a+b)

你沒看錯,Spark就上面那四行Code就可以達到了

 

Spark 支援"直譯式"開發!! 也就是,你可以像用R或Matlab的操作方式,來操作資料

而不需要把所有程式寫完,按下執行才看的到結果

Spark支援的語言有Java、Scala、Python、R(1.4以後才會正式包含在Spark中)

其中Python與Scala都可以支援這樣的操作

如果可以,我個人私心推薦Python來使用Spark

因為可以透過ipython的nodebook來開發,連視覺化的功能都可以在程式碼裡面實現!! (從資策會Spark課程學來的XDD 話說那個老師超猛)

直譯式開發對我來說,真的很棒!!

就像是寫R一樣,你可以一步一步Debug中間所有的變數,然後最後寫成一個.R檔案,直接執行

Python也是一樣,但Python能做的事情好像又更多

從網路爬蟲 -> 資料前處理 -> Spark 處理 -> RestFul API -> 網站 一條龍都可以包辦!讚

(當然Java也可以,只是Python開發上比較不會那麼繁瑣)

我覺得基於上面這兩點,Spark就很值得推薦變成下一代巨量資料處理框架

 

當然另外吸引我的就是

+許多基於Spark的OpenSource項目,而且是一群要畢業的博士生頂尖份子寫出來的

基於Spark的運算框架上,有發展很多其他的項目:

SparkSQL,與Hive的功能就很像,都可以用SQL指令來操作資料 (它的前身叫做Shark)

Mllib如同Mahout,提供了許多分散式機器學習的函式庫

Spark Stream,讓Spark有 Near-realtime的資料串流處理技術 (屬於Micro Batch的一種)

GraphX,算是一種分散式的網路資料儲存結構與操作器,特別適合處理社群關聯等資料

還有其他大大小小的專案,如果專案發展得很好,就會在未來的某個版本被整合到Spark的Code line中 (例如Mllib和SparkSQL就是)

有了上面這些框架的加持

個人覺得學一套,已經足以應付很多場景的應用了!

====================================================================

下面幾個主題就會慢慢針對Spark來進行分享囉:

 

1. Spark 開發環境建置

2. Spark 運算架構 (2015/6/16 upated)

3. Spark RDD 操作 

4. Spark SQL

5. Spark Mllib

6. Spark Streaming 

有空的時候會慢慢上來跟各位補充囉!

 

回應
支持一下吧BloggerAds
關鍵字
    沒有新回應!
累積 | 今日
loading......
Script
//引入核心檔 //引入風格檔 //啟用