強者聯盟——Python語言結合Spark架構

來源:互聯網
上載者:User

標籤:war   取出   資料檔案   size   重複   graphx   高階函數   串連   stream   

引言:Spark由AMPLab實驗室開發,其本質是基於記憶體的快速迭代架構,“迭代”是機器學習最大的特點,因此非常適合做機器學習。得益於在資料科學中強大的表現,Python語言的粉絲遍布天下,如今又遇上強大的分布式記憶體計算架構Spark,兩個領域的強者走到一起,自然能碰出更加強大的火花(Spark可以翻譯為火花),因此本文主要講述了PySpark。 
本文選自《全棧資料之門》。

全棧架構

  Spark由AMPLab實驗室開發,其本質是基於記憶體的快速迭代架構,“迭代”是機器學習最大的特點,因此非常適合做機器學習。 
  架構由Scala語言開發,原生提供4種API,Scala、Java、Python以及最近版本開始支援的R。Python不是Spark的“親兒子”,在支援上要略差一些,但基本上常用的介面都支援。得益於在資料科學中強大的表現,Python語言的粉絲遍布天下,如今又遇上強大的分布式記憶體計算架構Spark,兩個領域的強者走到一起,自然能碰出更加強大的火花(Spark可以翻譯為火花),因此PySpark是本節的主角。 
  在Hadoop發行版中,CDH5和HDP2都已經整合了Spark,只是整合的版本比官方的版本要略低一些。當前最新的HDP2.4已經整合了1.6.1(官方最新為2.0),可以看出,Hortonworks的更新速度非常快,緊跟上遊的步伐。 
  除Hadoop的Map-Reduce計算架構之外,Spark能異軍突起,而且慢慢地建立自己的全棧生態,那還真得瞭解下Spark到底提供了哪些全棧的技術。Spark目前主要提供了以下6大功能。

  1. Spark Core: RDD及其運算元。
  2. Spark-SQL: DataFrame與SQL。
  3. Spark ML(MLlib): 機器學習架構。
  4. Spark Streaming: 即時計算架構。
  5. Spark GraphX: 圖計算架構。
  6. PySpark(SparkR): Spark之上的Python與R架構。

從RDD的離線計算到Streaming的即時計算;從DataFrame及SQL的支援,到MLlib機器學習架構;從GraphX的圖計算到對統計學家最愛的R的支援,可以看出Spark在構建自己的全棧資料生態。從當前學術界與工業界的反饋來看,Spark也已經做到了。

環境搭建

  是騾子是馬,拉出來遛一遛就知道了。要嘗試使用Spark是非常簡單的事情,一台機器就可以做測試和開發了。 
  訪問網站http://spark.apache.org/downloads.html,下載先行編譯好的版本,解壓即可以使用。選擇最新的穩定版本,注意選擇“Pre-built”開頭的版本,比如當前最新版本是1.6.1,通常下載spark-1.6.1-bin-hadoop2.6.tgz檔案,檔案名稱中帶“-bin-”即是先行編譯好的版本,不需要另外安裝Scala環境,也不需要編譯,直接解壓到某個目錄即可。 
  假設解壓到目錄/opt/spark,那麼在$HOME目錄的.bashrc檔案中添加一個PATH:


  記得source一下.bashrc檔案,讓環境變數生效: 

  接著執行命令pyspark或者spark-shell,如果看到了Spark那帥帥的文本Logo和相應的命令列提示符>>>,則說明成功進入互動式介面,即配置成功。 
  pyspark與spark-shell都能支援互動式測試,此時便可以進行測試了。相比於Hadoop來說,基本上是零配置即可以開始測試。 
  spark-shell測試: 

  pyspark測試: 

分布式部署

  上面的環境測試成功,證明Spark的開發與測試環境已經配置好了。但是說好的分布式呢?我把別人的庫都拖下來了,就是想嘗試Spark的分布式環境,你就給我看這個啊? 
  上面說的是單機的環境部署,可用於開發與測試,只是Spark支援的部署方式的其中一種。這種是local方式,好處是用一台膝上型電腦就可以運行程式並在上面進行開發。雖然是單機,但有一個非常有用的特性,那就是可以實現多進程,比如8核的機器,只需要運行代碼的時候指定–master local[],就可以用8個進程的方式運行程式。代表使用全部CPU核心,也可以使用如local[4],意為只使用4個核心。 
  單機的local模式寫的代碼,只需要做少量的修改即可運行在分布式環境中。Spark的分布式部署支援好幾種方式,如下所示。

  Standalone:本身內建的叢集(方便測試和Spark本身架構的推廣)。 
  Mesos:一個新的資源管理架構。 
  YARN:Hadoop上新生的資源與計算管理架構,可以理解為Hadoop的作業系統, 
  可以支援各種不同的計算架構。 
  EC2:亞馬遜的機器環境的部署。 
  從難易程度上來說,Standalone分布式最簡單,直接把解壓好的包複製到各台機器上去,配置好master檔案和slave檔案,指示哪台機器做master,哪些機器做salve。然後在master機器上,通過內建的指令碼啟動叢集即可。 
  從使用率上來說,應該是YARN被使用得最多,因為通常是直接使用發行版本中的Spark整合套件,CDH和HDP中都已經把Spark和YARN整合了,不用特別關注。 
  分布式的優勢在於多CPU與更大的記憶體,從CPU的角度再來看Spark的三種方式。

  • 本機單CPU:“local”,資料檔案在本機。
  • 本機多CPU:“local[4]”,資料檔案在本機。
  • Standalone叢集多CPU:“spark://master-ip:7077”,需要每台機器都能訪問資料檔案。 
       
      YARN叢集多CPU:使用“yarn-client”提交,需要每台機器都能訪問到資料檔案。 
      互動式環境的部署也與上面的部署有關係,直接使用spark-shell或者pyspark是local的方式啟動,如果需要啟動單機多核或者叢集模式,需要指定–master參數,如下所示。


  如果使用pyspark,並且習慣了IPython的互動式風格,還可以加上環境變數來啟動IPython的互動式,或者使用IPython提供的Notebook:


  IPython風格如下所示:

樣本分析

  環境部署是新手最頭痛的問題,前面環境已經部署好了,接下來才是正題。因為Scala較Python複雜得多,因此先學習使用PySpark來寫程式。 
  Spark有兩個最基礎的概念,sc與RDD。sc是SparkContext的縮寫,顧名思義,就是Spark上下文語境,sc串連到叢集並做相應的參數配置,後面所有的操作都在這個上下文語境中進行,是一切Spark的基礎。在啟動互動式介面的時候,注意有一句提示:

SparkContext available as sc, HiveContext available as sqlContext.

   
  意思是,sc這個變數代表了SparkContext上下文,可以直接使用,在啟動互動時候,已經初始化好了。 
如果是非互動式環境,需要在自己的代碼中進行初始化:


  RDD是Resilient Distributed Datasets(彈性分布式資料集)的縮寫,是Spark中最主要的資料處理對象。產生RDD的方式有很多種,其中最主要的一種是通過讀取檔案來產生:


  讀取joy.txt檔案後,就是一個RDD,此時的RDD的內容就是一個字串,包含了檔案的全部內容。 
  還記得前面使用Python來編寫的WordCount代碼嗎?通過Hadoop的Streaming介面提到Map-Reduce計算架構上執行,那段代碼可不太好理解,現在簡單的版本來了。 
  WordCount例子的代碼如下所示: 

  在上面的代碼中,我個人喜歡用括弧的閉合來進行分行,而不是在行尾加上續行符。 
  PySpark中大量使用了匿名函數lambda,因為通常都是非常簡單的處理。核心代碼解讀如下。

  1. flatMap:對lines資料中的每行先選擇map(映射)操作,即以空格分割成一系列單詞形成一個列表。然後執行flat(展開)操作,將多行的列表展開,形成一個大列表。此時的資料結構為:[‘one’,’two’,’three’,…]。
  2. map:對列表中的每個元素產生一個key-value對,其中value為1。此時的資料結構為:[(‘one’, 1), (‘two’,1), (‘three’,1),…],其中的’one’、’two’、’three’這樣的key,可能會出現重複。
  3. reduceByKey:將上面列表中的元素按key相同的值進行累加,其資料結構為:[(‘one’, 3), (‘two’, 8), 
    (‘three’, 1), …],其中’one’, ‘two’,’three’這樣的key不會出現重複。

最後使用了wc.collect()函數,它告訴Spark需要取出所有wc中的資料,將取出的結果當成一個包含元組的列表來解析。 
相比於用Python手動實現的版本,Spark實現的方式不僅簡單,而且很優雅。

兩類運算元

  Spark的基礎上下文語境為sc,基礎的資料集為RDD,剩下的就是對RDD所做的操作了。 
  對RDD所做的操作有transform與action,也稱為RDD的兩個基本運算元。 
  transform是轉換、變形的意思,即將RDD通過某種形式進行轉換,得到另外一個RDD,比如對列表中的資料使用map轉換,變成另外一個列表。 
  當然,Spark能在Hadoop的Map-Reduce模型中脫穎而出的一個重要因素就是其強大的運算元。Spark並沒有強制將其限定為Map和Reduce模型,而是提供了更加強大的變換能力,使得其代碼簡潔而優雅。 
  下面列出了一些常用的transform。

  • map(): 映射,類似於Python的map函數。
  • filter(): 過濾,類似於Python的filter函數。
  • reduceByKey(): 按key進行合并。
  • groupByKey(): 按key進行彙總。

RDD一個非常重要的特性是惰性(Lazy)原則。在一個RDD上執行一個transform後,並不立即運行,而是遇到action的時候,才去一層層構建啟動並執行DAG圖,DAG圖也是Spark之所以快的原因。

  • first(): 返回RDD裡面的第一個值。
  • take(n): 從RDD裡面取出前n個值。
  • collect(): 返回全部的RDD元素。
  • sum(): 求和。
  • count(): 求個數。

回到前面的WordCount例子,程式只有在遇到wc.collect()這個需要取全部資料的action時才執行前面RDD的各種transform,通過構建執行依賴的DAG圖,也保證了運行效率。

map與reduce

  初始的資料為一個列表,列表裡面的每一個元素為一個元組,元組包含三個元素,分別代表id、name、age欄位。RDD正是對這樣的基礎且又複雜的資料結構進行處理,因此可以使用pprint來列印結果,方便更好地理解資料結構,其代碼如下:


  parallelize這個運算元將一個Python的資料結構序列化成一個RDD,其接受一個列表參數,還支援在序列化的時候將資料分成幾個分區(partition)。分區是Spark運行時的最小粒度結構,多個分區會在叢集中進行分布式並行計算。 
  使用Python的type方法列印資料類型,可知base為一個RDD。在此RDD之上,使用了一個map運算元,將age增加3歲,其他值保持不變。map是一個高階函數,其接受一個函數作為參數,將函數應用於每一個元素之上,返回應用函數用後的新元素。此處使用了匿名函數lambda,其本身接受一個參數v,將age欄位v[2]增加3,其他欄位原樣返回。從結果來看,返回一個PipelineRDD,其繼承自RDD,可以簡單理解成是一個新的RDD結構。 
  要列印RDD的結構,必須用一個action運算元來觸發一個作業,此處使用了collect來擷取其全部的資料。 

  接下來的操作,先使用map取出資料中的age欄位v[2],接著使用一個reduce運算元來計算所有的年齡之和。reduce的參數依然為一個函數,此函數必須接受兩個參數,分別去迭代RDD中的元素,從而彙總出結果。效果與Python中的reduce相同,最後只返回一個元素,此處使用x+y計算其age之和,因此返回為一個數值,執行結果如所示。

AMPLab的野心

  AMPLab除了最著名的Spark外,他們還希望基於記憶體構建一套完整的資料分析生態系統,可以參考https://amplab.cs.berkeley.edu/software/上的介紹。 
  他們的目的就是BDAS(Berkeley Data Analytics Stack),基於記憶體的全棧大資料分析。前面介紹過的Mesos是叢集資源管理員。還有Tachyon,是基於記憶體的Distributed File System,類似於Hadoop的HDFS檔案系統,而Spark Streaming則類似於Storm即時計算。 
  強大的全棧式Spark,撐起了大資料的半壁江山。

  本文選自《全棧資料之門》,點此連結可在博文視點官網查看此書。 
                    

  想及時獲得更多精彩文章,可在中搜尋“博文視點”或者掃描下方二維碼並關注。
                         

強者聯盟——Python語言結合Spark架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.