這篇文章能讓你對於高性能Spark的理解更上一層樓

引言:摘抄自《中國新通信》: 近年來,大數據成爲工業界與學術界關注的熱點,因爲隨着存儲設備容量的快速增長、CUP外理能力的大幅提開,網絡帶寬的不斷增加。也爲大數據時代提共了強有力的技術支撐。從web1.0到web2.0,每個用戶都成爲一個自媒體,一個互聯網內容的提供者,這樣數據產生方式的變革更是推動着大數據時代的到來。”

什麼是大數據呢?

大數據是由結構化與非結構化數據組成的,其中10%爲結構化數據,存儲於各類數據庫中,90%爲非結構化數據,非結構化數據如圖片、視頻、郵件、網頁等,現如今,大數據應用以滲透到各行各業,數據驅動決策,信息社會智能化程度大幅提高。目前,國內相關技術主要集中在數據挖掘相關算法、實際應用及有關理論方面的研究,涉及行業比較廣泛,包括零售業、製造業、金融業、電信業、網絡相關專業、醫療保健及科學領域,單位集中在部分高等院校、研究所和公司,特別是在it等新興領域,阿里巴巴、騰訊、百度等巨頭對技術發展推動作用巨大,而這些互聯網巨頭們在大數據處理中,又紛紛採用了hadoop、spark這一處理框架。

什麼是Spark呢?

Apache Spark是一個圍繞速度、易用性和複雜分析構建的大數據處理框架,最初在2009年由加州大學伯克利分校的AMPLab開發,並於2010年成爲Apache的開源項目之一,與Hadoop和Storm等其他大數據和MapReduce技術相比,Spark有如下優勢:

  • Spark提供了一個全面、統一的框架用於管理各種有着不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求。
  • 官方資料介紹Spark可以將Hadoop集羣中的應用在內存中的運行速度提升100倍,甚至能夠將應用在磁盤上的運行速度提升10倍。
    在這裏插入圖片描述
架構及生態:

什麼是Spark生態系統呢?Spark生態系統稱爲BDAS(伯努利數據分析棧),本文旨在簡單介紹Spark生態系統中一些常用的組件,讓大家對Spark生態系統(BDAS)有個簡單的瞭解,知道什麼組件能做什麼事在這裏插入圖片描述

組件介紹
  • Spark Core:Spark的核心組件,其操作的數據對象是RDD(彈性分佈式數據集),圖中在Spark Core上面的四個組件都依賴於Spark Core,可以簡單認爲Spark Core就是Spark生態系統中的離線計算框架,eg:Spark Core中提供的map,reduce算子可以完成mapreduce計算引擎所做的計算任務。
  • Spark Streaming:Spark生態系統中的流式計算框架,其操作的數據對象是DStream,其實Spark Streaming是將流式計算分解成一系列短小的批處理作業。這裏的批處理引擎是Spark Core,也就是把Spark Streaming的輸入數據按照batch size(批次間隔時長)(如1秒)分成一段一段的數據系列(DStream),每一段數據都轉換成Spark Core中的RDD,然後將Spark Streaming中對DStream的轉換計算操作變爲針對Spark中對RDD的轉換計算操作,如下官方提供的圖:在這裏插入圖片描述
    在內部實現上,DStream由一組時間序列上連續的RDD來表示。每個RDD都包含了自己特定時間間隔內的數據流(如上圖中0到1秒接收到的數據成爲一個RDD,1到2秒接收到的數據成爲一個RDD),使用Spark Streaming對圖中DStream的操作就會轉化成使用Spark Core中的對應算子(函數)對Rdd的操作。
  • Spark Sql:可以簡單認爲可以讓用戶使用寫SQL的方式進行數據計算,SQL會被SQL解釋器轉化成Spark core任務,讓懂SQL不懂spark的人都能通過寫SQL的方式進行數據計算,類似於hive在Hadoop生態圈中的作用,提供SparkSql CLI(命令行界面),可以再命令行界面編寫SQL。
  • Spark Graphx:Spark生態系統中的圖計算和並行圖計算,目前較新版本已支持PageRank、數三角形、最大連通圖和最短路徑等6種經典的圖算法。
  • Spark Mlib:一個可擴展的Spark機器學習庫,裏面封裝了很多通用的算法,包括二元分類、線性迴歸、聚類、協同過濾等。用於機器學習和統計等場景。
  • Tachyon:Tachyon是一個分佈式內存文件系統,可以理解爲內存中的HDFS。
  • Local,Standalone,Yarn,Mesos:Spark的四種部署模式,其中Local是本地模式,一般用來開發測試,Standalone是Spark 自帶的資源管理框架,Yarn和Mesos是另外兩種資源管理框架,Spark用哪種模式部署,也就是使用了哪種資源管理框架。

通常當需要處理的數據量超過了單機尺度(比如我們的計算機有4GB的內存,而我們需要處理100GB以上的數據)這時我們可以選擇spark集羣進行計算,有時我們可能需要處理的數據量並不大,但是計算很複雜,需要大量的時間,這時我們也可以選擇利用spark集羣強大的計算資源,並行化地計算,其架構示意圖如下:
在這裏插入圖片描述

  • Spark Core:包含Spark的基本功能;尤其是定義RDD的API、操作以及這兩者上的動作。其他Spark的庫都是構建在RDD和Spark Core之上的
  • Spark SQL:提供通過Apache Hive的SQL變體Hive查詢語言(HiveQL)與Spark進行交互的API。每個數據庫表被當做一個RDD,Spark SQL查詢被轉換爲Spark操作。
  • Spark Streaming:對實時數據流進行處理和控制。Spark Streaming允許程序能夠像普通RDD一樣處理實時數據
  • MLlib:一個常用機器學習算法庫,算法被實現爲對RDD的Spark操作。這個庫包含可擴展的學習算法,比如分類、迴歸等需要對大量數據集進行迭代的操作。
  • GraphX:控制圖、並行圖操作和計算的一組算法和工具的集合。GraphX擴展了RDD API,包含控制圖、創建子圖、訪問路徑上所有頂點的操作
  • Spark架構的組成圖如下:
    在這裏插入圖片描述
  • Cluster Manager:在standalone模式中即爲Master主節點,控制整個集羣,監控worker。在YARN模式中爲資源管理器
  • Worker節點:從節點,負責控制計算節點,啓動Executor或者Driver。
  • Driver: 運行Application 的main()函數
  • Executor:執行器,是爲某個Application運行在worker node上的一個進程

Spark與hadoop

  • Hadoop有兩個核心模塊,分佈式存儲模塊HDFS和分佈式計算模塊Mapreduce
  • spark本身並沒有提供分佈式文件系統,因此spark的分析大多依賴於Hadoop的分佈式文件系統HDFS
  • Hadoop的Mapreduce與spark都可以進行數據計算,而相比於Mapreduce,spark的速度更快並且提供的功能更加豐富
  • 關係圖如下:
    在這裏插入圖片描述
  • spark運行流程圖如下:
    在這裏插入圖片描述
  • 構建Spark Application的運行環境,啓動SparkContext
  • SparkContext向資源管理器(可以是Standalone,Mesos,Yarn)申請運行Executor資源,並啓動StandaloneExecutorbackend,
  • Executor向SparkContext申請Task
  • SparkContext將應用程序分發給Executor
  • SparkContext構建成DAG圖,將DAG圖分解成Stage、將Taskset發送給Task Scheduler,最後由Task Scheduler將Task發送給Executor運行
  • Task在Executor上運行,運行完釋放所有資源

Spark運行特點:

  • 每個Application獲取專屬的executor進程,該進程在Application期間一直駐留,並以多線程方式運行Task。這種Application隔離機制是有優勢的,無論是從調度角度看(每個Driver調度他自己的任務),還是從運行角度看(來自不同Application的Task運行在不同JVM中),當然這樣意味着Spark Application不能跨應用程序共享數據,除非將數據寫入外部存儲系統
  • Spark與資源管理器無關,只要能夠獲取executor進程,並能保持相互通信就可以了
  • 提交SparkContext的Client應該靠近Worker節點(運行Executor的節點),最好是在同一個Rack裏,因爲Spark Application運行過程中SparkContext和Executor之間有大量的信息交換
  • Task採用了數據本地性和推測執行的優化機制

Spark運行模式:

Spark的運行模式多種多樣,靈活多變,部署在單機上時,既可以用本地模式運行,也可以用僞分佈模式運行,而當以分佈式集羣的方式部署時,也有衆多的運行模式可供選擇,這取決於集羣的實際情況,底層的資源調度即可以依賴外部資源調度框架,也可以使用Spark內建的Standalone模式。對於外部資源調度框架的支持,目前的實現包括相對穩定的Mesos模式,以及hadoop YARN模式。

  • standalone:獨立集羣運行模式
    Standalone模式使用Spark自帶的資源調度框架;採用Master/Slaves的典型架構,選用ZooKeeper來實現Master的HA
  • 框架結構圖如下:
    在這裏插入圖片描述
    該模式主要的節點有Client節點、Master節點和Worker節點。其中Driver既可以運行在Master節點上中,也可以運行在本地Client端。當用spark-shell交互式工具提交Spark的Job時,Driver在Master節點上運行;當使用spark-submit工具提交Job或者在Eclips、IDEA等開發平臺上使用”new SparkConf.setManager(“spark://master:7077”)”方式運行Spark任務時,Driver是運行在本地Client端上的。運行過程如下圖:(參考至:http://blog.csdn.net/gamer_gyt/article/details/51833681)
    在這裏插入圖片描述
  1. SparkContext連接到Master,向Master註冊並申請資源(CPU Core 和Memory)
  2. Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啓動StandaloneExecutorBackend;
  3. StandaloneExecutorBackend向SparkContext註冊;
  4. SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部數據和shuffle之前產生),然後以Stage(或者稱爲TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;
  5. StandaloneExecutorBackend會建立Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成
  6. 所有Task完成後,SparkContext向Master註銷,釋放資源
總結:數據處理應用Spark的另外一個主要的使用可以從工程師的角度進行描述。在這裏,工程師指使用Spark來構建生產數據處理應用的大量的軟件開發者。這些開發者瞭解軟件工程的概念和原則,如封裝、接口設計和麪向對象編程。他們通常有計算機學科的學位。他們通過自己的軟件工程技能來設計和構建實現某個商業使用場景的軟件系統。對工程師而言,Spark提供了一個簡單的方式在集羣之間並行化這些應用,隱藏了分佈式系統、網絡通信和容錯處理的複雜性。系統使得工程師在實現任務的同時,有充足的權限監控、檢查和調整應用。API的模塊特性使得重用已有工作和本地測試變得簡單。

最後我們再來簡單的說一下幾個面試時會被問到的很常見的問題。

hadoop和spark的shuffle相同和差異:

從 high-level 的角度來看,兩者並沒有大的差別。 都是將 mapper(Spark 裏是 ShuffleMapTask)的輸出進行 partition,不同的 partition 送到不同的 reducer(Spark 裏 reducer 可能是下一個 stage 裏的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以內存作緩衝區,邊 shuffle 邊 aggregate 數據,等到數據 aggregate 好以後進行 reduce() (Spark 裏可能是後續的一系列操作)。

從 low-level 的角度來看,兩者差別不小。 Hadoop MapReduce 是 sort-based,進入 combine() 和 reduce() 的 records 必須先 sort。這樣的好處在於 combine/reduce() 可以處理大規模的數據,因爲其輸入數據可以通過外排得到(mapper 對每段數據先做排序,reducer 的 shuffle 對排好序的每段數據做歸併)。目前的 Spark 默認選擇的是 hash-based,通常使用 HashMap 來對 shuffle 來的數據進行 aggregate,不會對數據進行提前排序。如果用戶需要經過排序的數據,那麼需要自己調用類似 sortByKey() 的操作;如果你是Spark 1.1的用戶,可以將spark.shuffle.manager設置爲sort,則會對數據進行排序。在Spark 1.2中,sort將作爲默認的Shuffle實現。

從實現角度來看,兩者也有不少差別。 Hadoop MapReduce 將處理流程劃分出明顯的幾個階段:map(), spill, merge, shuffle, sort, reduce() 等。每個階段各司其職,可以按照過程式的編程思想來逐一實現每個階段的功能。在 Spark 中,沒有這樣功能明確的階段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蘊含在 transformation() 中。

Mapreduce和Spark的都是並行計算,那麼他們有什麼相同和區別:

  • hadoop的一個作業稱爲job,job裏面分爲map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束。
  • spark用戶提交的任務成爲application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job。這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關係劃分job而來的,每個stage裏面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命週期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啓動讀取內存進行計算。
  • hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係。
  • spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

spark的優化怎麼做?

spark調優比較複雜,但是大體可以分爲三個方面來進行,1)平臺層面的調優:防止不必要的jar包分發,提高數據的本地性,選擇高效的存儲格式如parquet,2)應用程序層面的調優:過濾操作符的優化降低過多小任務,降低單條記錄的資源開銷,處理數據傾斜,複用RDD進行緩存,作業並行化執行等等,3)JVM層面的調優:設置合適的資源量,設置合理的JVM,啓用高效的序列化方法如kyro,增大off head內存等等.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章