<b>1.5 spark rdd和dataframe</b>
<b></b>
本節關注資料以及spark如何表示群組織資料。我們将介紹spark rdd和dataframe技術。
通過本節的學習,讀者将掌握spark的兩個關鍵概念:rdd和dataframe,并将它們應用于機器學習項目。
1.5.1 spark rdd
spark主要以一種分布式項集合的形式進行資料抽象,稱之為彈性分布式資料集(resilient distributed dataset,rdd)。rdd是spark的關鍵創新,使其比其他架構計算更加快速和高效。
特别地,rdd是不可改變的對象集合,分布在叢集之中。它靜态地定義對象類型,例如rdd[t]對象類型則是t,主要有字元串rdd、整數rdd和對象rdd。
此外,rdd:
是基于使用者劃分的分布在叢集上的對象集合
由并行轉換器(如map和filter)建立
也就是說,rdd實體上分布在一個叢集上,邏輯上作為一個實體進行操作。rdd具有容錯特性,可以自動進行失效重建。
新的rdd可以從hadoop輸入格式化(hdfs檔案)建立,或通過其他rdd進行轉換得到。
建立rdd,使用者可以:
通過驅動程式将對象集合分散化(使用spark上下文的并行化方法)
加載外部資料集
轉換已有的rdd
spark團隊稱上述兩類rdd操作為:行動(action)和轉換(transformation)。
行動傳回結果,轉換傳回新rdd的指針。rdd行動的例子有:collect、count和take。
轉換是延遲評估的,rdd轉換的例子有:map、filter和join。
rdd的行動和轉換可以組合起來實作複雜的運算。
了解更多rdd的知識,可通路https://www.cs.berkeley.edu/~matei/papers/ 2012/ nsdi_spark.pdf。
1.5.2 spark dataframe
dataframe是一個列資料組成的分布式資料集合,實際上,是按列的名字分組的分布式資料集合,也就是帶有模式的rdd。換句話說,spark dataframe是rdd的擴充。
dataframe相當于每列具有名字命名,可以使用名字替代索引進行操作的rdd。
spark dataframe在概念上與r語言dataframe等價,與關系資料庫中的表類似,這項技術促進了機器學習社群快速接受spark。使用者可以(使用spark dataframe)直接操作列資料,而這是rdd所不具備的。具備了資料模式知識,使用者可以利用自己熟悉的sql資料操作技術來操作資料,可以從很多原始資料源建立spark dataframe,例如結構化關系資料檔案、hive表或已有的rdd。
spark已經建立了特殊的dataframe api和spark sql來處理dataframe。spark dataframe api和spark sql都支援scala、java、python和r語言。作為已有rdd api的擴充,dataframe api具有下列特性:
具備(從單個筆記本電腦幾kb資料到大型叢集pb級資料)可伸縮計算能力
支援各類資料格式和存儲系統
通過spark sql catalyst優化器提供最先進的優化和代碼生成
通過spark與所有大資料工具和架構無縫內建
spark sql與spark dataframe良好內建,有利于使用者簡便地進行etl資料抽取和操作任何資料子集。使用者可以對它們進行轉換,并提供給包括R語言使用者在内的其他使用者。spark sql也可以與hiveql一起使用,它的處理速度非常快。相對于使用hadoop和直接使用rdd,使用spark sql可以大幅減少代碼數量。
更多資訊,請通路:http://spark.apache.org/docs/latest/sql-programming-guide.html。
1.5.3 r語言dataframe api
dataframe是機器學習程式設計的一個關鍵元素。spark提供r語言、java和python的dataframe api,以便使用者在他們熟悉的環境和語言中操作spark dataframe。本節将簡要介紹一下spark dataframe的操作,并提供一些簡單的r語言例子,供讀者實踐。
在spark環境中,所有相關功能的使用入口都是spark的sqlcontext類,或它的派生類。建立一個基本的sqlcontext類,所有使用者需要執行下面的sparkcontext指令:
建立一個spark dataframe,使用者可以執行如下指令:
下面給出一些spark dataframe操作的例子:
更多資訊,請通路:http://spark.apache.org/docs/latest/sql-programming-guide.html#creating-dataframes。
1.5.4 機器學習架構、rm4e和spark計算
本節,我們以rm4e作為例子讨論機器學習的架構,以及其與spark計算的關系。
學習完本節之後,讀者将掌握機器學習的概念和一些例子,并能夠将它們與spark計算相結合來規劃和實作機器學習項目。
1.5.5 機器學習架構
正如前幾節所讨論的,spark計算與hadoop的mapreduce非常不同,spark計算速度更快,使用更加容易。在機器學習中采用spark計算有很多的優勢。
然而,對于機器學習專業人員來講,隻有具有良好的機器學習架構才能實作所有的優勢。這裡,機器學習架構意味着一個能夠整合包括機器學習算法在内的所有機器學習元素的系統或方法,使使用者最有效地使用它們。具體來講,這包括資料表示與處理的方法、表示和建立預測模型的方法、評價和使用模組化結果的方法。從這方面來看,在資料源的處理、資料預處理的執行、算法的實作,以及複雜計算支援方面的不同,使得機器學習架構與衆不同。
目前有多種機器學習架構,正如有多種不同的計算平台支援這些架構。在所有可用的機器學習架構中,着重于疊代計算和互動處理的架構被公認為是最好的,因為這些特性可以促進複雜預測模型估計和研究人員與資料間的良好互動。當下,優秀的機器學習架構仍然需要包含大資料功能、大量快速處理能力,以及容錯能力。優秀的架構通常包括大量的機器學習算法和可用的統計檢驗。
正如前幾節提到的,由于采用了記憶體資料處理技術,apache spark擁有卓越的互動計算性能和較高的成本效益。它可以相容hadoop的資料源和檔案格式,由于擁有友好的api,它提供多種語言版本,另外它還具有更快速的學習曲線。apache spark還包含圖像處理和機器學習能力。基于以上原因,以apache spark為基礎的機器學習架構在機器學習從業者中很受歡迎。
盡管如此,hadoop mapreduce是一個更加成熟的平台,它就是為解決批處理問題應運而生。相較于spark,它對于處理一些無法放入記憶體或者由于有經驗的研究人員追求更好的可用性的這類大資料來說更加高效。此外,由于具有更多的支援項目、工具和雲服務,hadoop mapreduce目前擁有更加龐大的生态系統。
即使目前看來spark像是更大的赢家,但是機器學習從業者也很可能不隻使用spark平台,他們仍會使用hdfs存儲資料,也可能會使用hbase、hive、pig、impala,或者其他hadoop工具。很多情況下,這意味着機器學習從業者為了處理全部的大資料程式包,仍需要運作hadoop和mapreduce。
1.5.6 rm4e
在前幾節,我們大緻讨論了機器學習架構。具體來說,一個機器學習架構包括如何處理資料,分析方法,分析計算,結果評估和結果利用,rm4e可以很好地代表滿足上述需求的架構。rm4e(research methods four elements)是總結機器學習元件和過程的一個很好的架構。rm4e包括:
方程:方程用來表示我們研究的模型。
估計:估計将方程(模型)和研究用資料聯系起來。
評估:評估用來衡量模型是否适合資料。
解釋:解釋是将方程(模型)和我們的研究目标聯系起來。我們如何解釋研究結果通常依賴于研究目的和研究主體。
rm4e是差別一個機器學習方法的四個關鍵方面。在任意給定時刻,rm4e足以代表機器學習狀态。此外,使用rm4e可以簡便、充分地表示機器學習的工作流。
關聯我們目前讨論的内容,方程類似于機器學習庫,估計代表計算完成的方式,評估是評價一個機器學習是不是更好,至于疊代計算,是我們應該考慮繼續還是停止。解釋也是機器學習的關鍵部分,因為我們的目标是将資料轉換為可使用的有見地的結果。
基于以上讨論,好的機器學習架構需要處理大規模資料提取和資料預處理,還需要處理快速計算、大規模和高速的互動式評估,以及簡單易懂的結果解釋和部署。
1.5.7 spark計算架構
在本章前幾節,我們讨論了spark計算如何支援疊代機器學習計算。回顧機器學習架構,以及spark計算如何與機器學習架構相關聯之後,我們已經準備好去了解更多選擇spark計算用于機器學習的原因。
spark是為服務機器學習和資料科學而開發的,能夠使得大規模的機器學習和機器學習部署更加容易。如前所述,spark在rdd上的核心創新使其具有快速友善的計算能力和良好的容錯能力。
spark是通用計算平台,其程式包括兩個部分:驅動程式和工作程式。
為了程式設計,開發者需要編寫一個執行應用進階控制流程,以及并行啟動各種操作的驅動程式。所有開發的工作程式将在叢集節點或在本地線程上運作,rdd操作會貫穿所有的工作程式。
正如前面提到的,spark提供了并行程式設計的兩個主要抽象概念:彈性分布式資料集以及對這些資料集的并行運算(通過将一個函數應用在資料集上來調用)。
此外,spark支援兩種類型的共享變量:
廣播變量:如果有大量的隻讀資料段(例如,查找表)被用在多個并行操作中,最好是一次性将其配置設定給工作程式,而不是用每個閉包來打包。
累加器:這些變量工作程式隻能添加到關聯操作中,并且隻能由驅動程式讀出。它們可以在mapreduce中用來實作計數器,并且可以為并行求和提供一個更為必要的文法。可以為具有附加操作和零值的任何類型定義累加器。由于它們的語義隻能添加,它們很容易具備容錯能力。
總而言之,apache spark計算架構能夠支援各種需要快速并行處理,并帶有容錯機制的機器學習架構。
更多内容請見如下網址:http://people.csail.mit.edu/matei/papers/2010/hotcl-o-ud_spark.pdf。