paulwong

          Spark與Shark的原理

          1.Spark生態圈

          如下圖所示為Spark的整個生態圈,最底層為資源管理器,采用Mesos、Yarn等資源管理集群或者Spark 自帶的Standalone模式,底層存儲為文件系統或者其他格式的存儲系統如HBase。Spark作為計算框架,為上層多種應用提供服務。 Graphx和MLBase提供數據挖掘服務,如圖計算和挖掘迭代計算等。Shark提供SQL查詢服務,兼容Hive語法,性能比Hive快3-50 倍,BlinkDB是一個通過權衡數據精確度來提升查詢晌應時間的交互SQL查詢引擎,二者都可作為交互式查詢使用。Spark Streaming將流式計算分解成一系列短小的批處理計算,并且提供高可靠和吞吐量服務。



           2.Spark基本原理

          Spark運行框架如下圖所示,首先有集群資源管理服務(Cluster Manager)和運行作業任務的結點(Worker Node),然后就是每個應用的任務控制結點Driver和每個機器節點上有具體任務的執行進程(Executor)。



           
          與MR計算框架相比,Executor有二個優點:一個是多線程來執行具體的任務,而不是像MR那樣采用進程模型, 減少了任務的啟動開稍。二個是Executor上會有一個BlockManager存儲模塊,類似于KV系統(內存和磁盤共同作為存儲設備),當需要迭代 多輪時,可以將中間過程的數據先放到這個存儲系統上,下次需要時直接讀該存儲上數據,而不需要讀寫到hdfs等相關的文件系統里,或者在交互式查詢場景 下,事先將表Cache到該存儲系統上,提高讀寫IO性能。另外Spark在做Shuffle時,在Groupby,Join等場景下去掉了不必要的 Sort操作,相比于MapReduce只有Map和Reduce二種模式,Spark還提供了更加豐富全面的運算操作如 filter,groupby,join等。

           

          Notes: 在集群(cluster)方式下, Cluster Manager運行在一個jvm進程之中,而worker運行在另一個jvm進程中。在local cluster中,這些jvm進程都在同一臺機器中,如果是真正的standalone或Mesos及Yarn集群,worker與master或分布于不同的主機之上。

           

          JOB的生成和運行

          job生成的簡單流程如下

          1.首先應用程序創建SparkContext的實例,如實例為sc

          2.利用SparkContext的實例來創建生成RDD

          3.經過一連串的transformation操作,原始的RDD轉換成為其它類型的RDD

          4.當action作用于轉換之后RDD時,會調用SparkContext的runJob方法

          5.sc.runJob的調用是后面一連串反應的起點,關鍵性的躍變就發生在此處

          調用路徑大致如下

          1.sc.runJob->dagScheduler.runJob->submitJob

          2.DAGScheduler::submitJob會創建JobSummitted的event發送給內嵌類eventProcessActor

          3.eventProcessActor在接收到JobSubmmitted之后調用processEvent處理函數

          4.job到stage的轉換,生成finalStage并提交運行,關鍵是調用submitStage

          5.在submitStage中會計算stage之間的依賴關系,依賴關系分為寬依賴和窄依賴兩種

          6.如果計算中發現當前的stage沒有任何依賴或者所有的依賴都已經準備完畢,則提交task

          7.提交task是調用函數submitMissingTasks來完成

          8.task真正運行在哪個worker上面是由TaskScheduler來管理,也就是上面的submitMissingTasks會調用TaskScheduler::submitTasks

          9.TaskSchedulerImpl中會根據Spark的當前運行模式來創建相應的backend,如果是在單機運行則創建LocalBackend

          10.LocalBackend收到TaskSchedulerImpl傳遞進來的ReceiveOffers事件

          11.receiveOffers->executor.launchTask->TaskRunner.run

           

          Spark采用了Scala來編寫,在函數表達上Scala有天然的優勢,因此在表達復雜的機器學習算法能力比其他 語言更強且簡單易懂。提供各種操作函數來建立起RDD的DAG計算模型。把每一個操作都看成構建一個RDD來對待,而RDD則表示的是分布在多臺機器上的 數據集合,并且可以帶上各種操作函數。如下圖所示:



           首先從hdfs文件里讀取文本內容構建成一個RDD,然后使用filter()操作來對上次的RDD進行過濾,再使 用map()操作取得記錄的第一個字段,最后將其cache在內存上,后面就可以對之前cache過的數據做其他的操作。整個過程都將形成一個DAG計算 圖,每個操作步驟都有容錯機制,同時還可以將需要多次使用的數據cache起來,供后續迭代使用.

           

          3.Shark的工作原理

          Shark是基于Spark計算框架之上且兼容Hive語法的SQL執行引擎,由于底層的計算采用了Spark,性 能比MapReduce的Hive普遍快2倍以上,如果是純內存計算的SQL,要快5倍以上,當數據全部load在內存的話,將快10倍以上,因此 Shark可以作為交互式查詢應用服務來使用。

           上圖就是整個Shark的框架圖,與其他的SQL引擎相比,除了基于Spark的特性外,Shark是完全兼容Hive的語法,表結構以及UDF函數等,已有的HiveSql可以直接進行遷移至Shark上。


          與Hive相比,Shark的特性如下:

          1.以在線服務的方式執行任務,避免任務進程的啟動和銷毀開稍,通常MapReduce里的每個任務都是啟動和關閉進程的方式來運行的,而在Shark中,Server運行后,所有的工作節點也隨之啟動,隨后以常駐服務的形式不斷的接受Server發來的任務。

          2.Groupby和Join操作不需要Sort工作,當數據量內存能裝下時,一邊接收數據一邊執行計算操作。在Hive中,不管任何操作在Map到Reduce的過程都需要對Key進行Sort操作。

          3.對于性能要求更高的表,提供分布式Cache系統將表數據事先Cache至內存中,后續的查詢將直接訪問內存數據,不再需要磁盤開稍。

          4.還有很多Spark的特性,如可以采用Torrent來廣播變量和小數據,將執行計劃直接傳送給Task,DAG過程中的中間數據不需要落地到Hdfs文件系統。

          posted on 2015-06-18 13:20 paulwong 閱讀(568) 評論(0)  編輯  收藏 所屬分類: SPARK


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 张家界市| 托克托县| 涿鹿县| 勃利县| 东乌珠穆沁旗| 澳门| 临夏市| 凤台县| 乐安县| 兴业县| 巨鹿县| 名山县| 师宗县| 敦化市| 行唐县| 郎溪县| 无锡市| 旅游| 盖州市| 新密市| 宝清县| 平顺县| 拜城县| 邵东县| 五寨县| 潼关县| 乐昌市| 襄汾县| 田东县| 长兴县| 读书| 文昌市| 新平| 浦江县| 宁乡县| 景洪市| 山东| 多伦县| 杭锦后旗| 天柱县| 大关县|