天天看點

Spark是什麼?用Spark進行資料分析

Spark是什麼?用Spark進行資料分析

1. 什麼是apache spark?

apache spark是一個為速度和通用目标設計的叢集計算平台。

從速度的角度看,spark從流行的mapreduce模型繼承而來,可以更有效地支援多種類型的計算,如互動式查詢和流處理。速度在大資料集的進行中非常重要,它可以決定使用者可以互動式地處理資料,還是等幾分鐘甚至幾小時。spark為速度提供的一個重要特性是其可以在記憶體中運作計算,即使對基于磁盤的複雜應用,spark依然比mapreduce更有效。

從通用性來說,spark可以處理之前需要多個獨立的分布式系統來處理的任務,這些任務包括批處理應用、互動式算法、互動式查詢和資料流。通過用同一個引擎支援這些任務,spark使得合并不同的處理類型變得簡單,而合并操作在生産資料分析中頻繁使用。而且,spark降低了維護不同工具的管理負擔。

spark被設計的高度易通路,用python、java、scala和sql提供簡單的api,而且提供豐富的内建庫。spark也與其他大資料工具進行了內建。特别地,spark可以運作在hadoop的叢集上,可以通路任何hadoop的資料源,包括cassandra。

spark項目包含多個緊密內建的元件。作為其核心,spark是一個“計算引擎”,負責在多個工作機器之間或一個計算叢集上排程、分發和監控由計算任務組成的應用。spark核心引擎速度快且具有通用性,它可以驅動針對各種各樣負載的不同元件,例如sql或機器學習。這些元件可以緊密互動,使得你可以向庫程式一樣在一個軟體項目中組合他們。

緊耦合的方式有諸多好處。第一,所有棧中的庫和高層元件都可以從低層元件的改進中受益。例如,當spark的核心引擎進行了優化,sql和機器學習庫會自動加速。第二,運作棧的開銷最小化,因為不需要運作5-10個獨立的軟體系統,隻運作一個就夠了。這些運作開銷包括部署、維護、測試、支援和其他操作。這意味着每當spark棧有新的元件加入,使用spark的團隊可以立即試用這個新元件。過去嘗試一個新的資料分析軟體需要下載下傳、部署和學習,現在隻需要更新spark即可。

最後,緊耦合方式的一個最大的好處是可以建立應用,這些應用可以不停地合并不同的處理模型。例如,通過spark可以寫一個應用,根據輸入的資料流使用機器學習來實時的進行分類操作;于此同時,分析員可以通過sql實時地查詢結果資料。并且,更多的資料工程師和資料科學家可以用pyhton shell通路資料來進行廣告分析。其他人員可能在單獨的批處理應用中通路資料。自始至終,it團隊隻需要維護一個系統。

這裡我們将簡單介紹spark的每個元件,見圖1-1

Spark是什麼?用Spark進行資料分析

圖1-1 spark棧

spark核心元件包含spark的基本功能,有任務排程元件、記憶體管理元件、容錯恢複元件、與存儲系統互動的元件等。spark核心元件提供了定義彈性分布式資料集(resilient distributed datasets,rdds)的api,這組api是spark主要的程式設計抽象。rdds表示分布在多個不同機器節點上,可以被并行處理的資料集合。spark核心元件提供許多api來建立和操作這些集合。

spark sql

spark sql是spark用來處理結構化資料的包。它使得可以像hive查詢語言(hive query language, hql)一樣通過sql語句來查詢資料,支援多種資料源,包括hive表、parquet和json。除了為spark提供一個sql接口外,spark sql允許開發人員将sql查詢和由rdds通過python、java和scala支援的資料程式設計操作混合進一個單一的應用中,進而将sql與複雜的分析結合。與計算密集型環境緊密內建使得spark sql不同于任何其他開源的資料倉庫工具。spark sql在spark 1.0版本中引入spark。

shark是一個較老的由加利福尼亞大學和伯克利大學開發的spark上的sql項目,通過修改hive而運作在spark上。現在已經被spark sql取代,以提供與spark引擎和api更好的內建。

spark流(spark streaming)

spark流作為spark的一個元件,可以處理實時流資料。流資料的例子有生産環境的web伺服器生成的日志檔案,使用者向一個web服務請求包含狀态更新的消息。spark流提供一個和spark核心rdd api非常比對的操作資料流的api,使得程式設計人員可以更容易地了解項目,并且可以在操作記憶體資料、磁盤資料、實時資料的應用之間快速切換。spark流被設計為和spark核心元件提供相同級别的容錯性,吞吐量和可伸縮性。

mllib

spark包含一個叫做mllib的關于機器學習的庫。mllib提供多種類型的機器學習算法,包括分類、回歸、聚類和協同過濾,并支援模型評估和資料導入功能。mllib也提供一個低層的機器學習原語,包括一個通用的梯度下降優化算法。所有這些方法都可以應用到一個叢集上。

graphx

graphx是一個操作圖(如社交網絡的好友圖)和執行基于圖的并行計算的庫。與spark流和spark sql類似,graphx擴充了spark rdd api,允許我們用和每個節點和邊綁定的任意屬性來建立一個有向圖。graphx也提供了各種各樣的操作圖的操作符,以及關于通用圖算法的一個庫。

叢集管理器cluster managers

在底層,spark可以有效地從一個計算節點擴充到成百上千個節點。為了在最大化靈活性的同時達到這個目标,spark可以運作在多個叢集管理器上,包括hadoop yarn,apache mesos和一個包含在spark中的叫做獨立排程器的簡易的叢集管理器。如果你在一個空的機器群上安裝spark,獨立排程器提供一個簡單的方式;如果你已經有一個hadoop yarn或mesos叢集,spark支援你的應用允許在這些叢集管理器上。第七章給出了不同的選擇,以及如何選擇正确的叢集管理器。

由于spark是一個面向叢集計算的通用架構,可用于許多不同的應用。在序言中我們指出了這本書的兩種讀者:資料科學家和資料工程師。我們仔細地分析一下這兩種人和他們使用spark的方式。明顯地,典型的使用案例是不同的,但我們可以将他們粗略地分為兩類,資料科學和資料應用。

當然了,這是一個不精确的分類和使用模式,許多人同時具有着兩種技能,有時扮演資料挖掘科學家的角色,然後又編寫一個資料處理的應用。盡管如此,區分為兩個組以及他們的使用案例仍然是有意義的。

資料科學的任務

資料科學,近幾年出現的一門學科,專注于分析資料。盡管沒有一個标準的定義,我們認為一個資料科學家的主要工作是分析和模組化資料。資料科學家可能會sql,統計學,預測模型(機器學習),用python、matlab或r程式設計。資料科學家能将資料格式化,用于進一步的分析。

資料科學家為了回答一個問題或進行深入研究,會使用相關的技術分析資料。通常,他們的工作包含特殊的分析,是以他們使用互動式shell,以使得他們能在最短的時間内看到查詢結果和代碼片段。spark的速度和簡單的api接口很好地符合這個目标,它的内建庫意味着很多算法可以随時使用。

spark通過若幹元件支援不同的資料科學任務。spark shell使得用python或scala進行互動式資料分析變得簡單。spark sql也有一個獨立的sql shell,可以用sql進行資料分析,也可以在spark程式中或spark shell中使用spark sql。mllib庫支援機器學習和資料分析。而且,支援調用外部的matlab或r語言編寫的程式。spark使得資料科學家可以用r或pandas等工具處理包含大量資料的問題。

有時,經過初始的資料處理階段後,資料科學家的工作将被産品化,擴充,加強(容錯性),進而成為一個生産資料處理應用,作為商業應用的一個元件。例如,一個資料科學家的研究成果可能會産生一個産品推薦系統,內建到一個web應用上,用來向使用者生成産品建議。通常由另外的人員(如工程師)對資料科學家的工作進行産品化。

資料處理應用

spark的另外一個主要的使用可以從工程師的角度進行描述。在這裡,工程師指使用spark來建構生産資料處理應用的大量的軟體開發者。這些開發者了解軟體工程的概念和原則,如封裝、接口設計和面向對象程式設計。他們通常有計算機學科的學位。他們通過自己的軟體工程技能來設計和建構實作某個商業使用場景的軟體系統。

對工程師而言,spark提供了一個簡單的方式在叢集之間并行化這些應用,隐藏了分布式系統、網絡通信和容錯處理的複雜性。系統使得工程師在實作任務的同時,有充足的權限監控、檢查和調整應用。api的子產品特性使得重用已有工作和本地測試變得簡單。

spark使用者使用spark作為其資料處理應用,因為他提供了豐富的功能,易于學習和使用,而且成熟可靠。

spark是一個開源項目,由多個不同的開發者社群進行維護。如果你或你的團隊第一次使用spark,你可能對它的曆史感興趣。spark由uc伯克利rad實驗室(現在是amp實驗室)在2009年作為一個研究項目建立。實驗室的研究人員之前基于hadoop mapreduce工作,他們發現mapreduce對于疊代和互動式計算任務效率不高。是以,在開始階段,spark主要為互動式查詢和疊代算法設計,支援記憶體存儲和高效的容錯恢複。

在2009年spark建立不久後,就有關于spark的學術性文章發表,在一些特定任務中,spark的速度可以達到mapreduce的10-20倍。

一部分spark的使用者是uc伯克利的其他組,包括機器學習的研究人員,如mobile millennium項目組,該組用spark來監控和預測舊金山灣區的交通擁堵情況。在一個非常短的時間内,許多外部的機構開始使用spark,現在,已經有超過50個機構在使用spark,還有一些機構公布了他們在spark meetups和spark summit等spark社群的使用情況。spark主要的貢獻者有databricks,雅虎和因特爾。

在2011年,amp實驗室開始開發spark上的上層元件,如shark和spark流。所有這些元件有時被稱為伯克利資料分析棧(berkeley data analytics stack,bdas)。

spark在2010年3月開源,在2014年6月移入apache軟體基金會,現在是其頂級項目。

自從建立以來,spark是一個非常活躍的項目和社群,每個釋出版本的貢獻者都在增長。spark 1.0有超過100個貢獻者。盡管活躍等級迅速增長,社群依然以一個固定的規劃釋出spark的更新版本。spark 1.0在2014年5月釋出。這本書主要基于spark 1.1.0編寫,但其概念和例子也适用較早的版本。

spark可以從存儲在hadoop分布式檔案系統(hdfs)中的任何檔案,或其他hadoop api支援的存儲系統(如本地檔案系統,amazon s3, cassandra, hive,hbase等)建立分布式資料集。有一點一定要記住,hadoop對spark來說不是必須的,spark可以支援任何實作了hadoop api的存儲系統。spark支援文本檔案、序列檔案、avro、parquet,以及任何其他hadoop的輸入格式。我們将在第五章介紹spark與這些資料源的互動。

本文作者:李劉強

來源:51cto

繼續閱讀