① 《Spark大數據分析實戰》pdf下載在線閱讀全文,求百度網盤雲資源
《Spark大數據分析實戰》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1JDqefPZ3_TjMKTxJ0MnD5g
② 科普Spark,Spark是什麼,如何使用Spark
科普Spark,Spark是什麼,如何使用Spark
1.Spark基於什麼演算法的分布式計算(很簡單)
2.Spark與MapRece不同在什麼地方
3.Spark為什麼比Hadoop靈活
4.Spark局限是什麼
5.什麼情況下適合使用Spark
Spark與Hadoop的對比
Spark的中間數據放到內存中,對於迭代運算效率更高。
Spark更適合於迭代運算比較多的ML和DM運算。因為在Spark裡面,有RDD的抽象概念。
Spark比Hadoop更通用
Spark提供的數據集操作類型有很多種,不像Hadoop只提供了Map和Rece兩種操作。比如map, filter, flatMap, sample, groupByKey, receByKey, union, join, cogroup, mapValues, sort,partionBy等多種操作類型,Spark把這些操作稱為Transformations。同時還提供Count, collect, rece, lookup, save等多種actions操作。
這些多種多樣的數據集操作類型,給給開發上層應用的用戶提供了方便。各個處理節點之間的通信模型不再像Hadoop那樣就是唯一的Data Shuffle一種模式。用戶可以命名,物化,控制中間結果的存儲、分區等。可以說編程模型比Hadoop更靈活。
不過由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
容錯性
在分布式數據集計算時通過checkpoint來實現容錯,而checkpoint有兩種方式,一個是checkpoint data,一個是logging the updates。用戶可以控制採用哪種方式來實現容錯。
可用性
Spark通過提供豐富的Scala, Java,Python API及互動式Shell來提高可用性。
Spark與Hadoop的結合
Spark可以直接對HDFS進行數據的讀寫,同樣支持Spark on YARN。Spark可以與MapRece運行於同集群中,共享存儲資源與計算,數據倉庫Shark實現上借用Hive,幾乎與Hive完全兼容。
Spark的適用場景
Spark是基於內存的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反復操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小(大資料庫架構中這是是否考慮使用Spark的重要因素)
由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。總的來說Spark的適用面比較廣泛且比較通用。
運行模式
本地模式
Standalone模式
Mesoes模式
yarn模式
Spark生態系統
Shark ( Hive on Spark): Shark基本上就是在Spark的框架基礎上提供和Hive一樣的H iveQL命令介面,為了最大程度的保持和Hive的兼容性,Shark使用了Hive的API來實現query Parsing和 Logic Plan generation,最後的PhysicalPlan execution階段用Spark代替Hadoop MapRece。通過配置Shark參數,Shark可以自動在內存中緩存特定的RDD,實現數據重用,進而加快特定數據集的檢索。同時,Shark通過UDF用戶自定義函數實現特定的數據分析學習演算法,使得SQL數據查詢和運算分析能結合在一起,最大化RDD的重復使用。
Spark streaming: 構建在Spark上處理Stream數據的框架,基本的原理是將Stream數據分成小的時間片斷(幾秒),以類似batch批量處理的方式來處理這小部分數據。Spark Streaming構建在Spark上,一方面是因為Spark的低延遲執行引擎(100ms+)可以用於實時計算,另一方面相比基於Record的其它處理框架(如Storm),RDD數據集更容易做高效的容錯處理。此外小批量處理的方式使得它可以同時兼容批量和實時數據處理的邏輯和演算法。方便了一些需要歷史數據和實時數據聯合分析的特定應用場合。
Bagel: Pregel on Spark,可以用Spark進行圖計算,這是個非常有用的小項目。Bagel自帶了一個例子,實現了Google的PageRank演算法。
End.
③ spark和hadoop的區別
直接比較Hadoop和Spark有難度,因為它們處理的許多任務都一樣,但是在一些方面又並不相互重疊。
比如說,Spark沒有文件管理功能,因而必須依賴Hadoop分布式文件系統(HDFS)或另外某種解決方案。
Hadoop框架的主要模塊包括如下:
Hadoop Common
Hadoop分布式文件系統(HDFS)
Hadoop YARN
Hadoop MapRece
雖然上述四個模塊構成了Hadoop的核心,不過還有其他幾個模塊。這些模塊包括:Ambari、Avro、Cassandra、Hive、 Pig、Oozie、Flume和Sqoop,它們進一步增強和擴展了Hadoop的功能。
Spark確實速度很快(最多比Hadoop MapRece快100倍)。Spark還可以執行批量處理,然而它真正擅長的是處理流工作負載、互動式查詢和機器學習。
相比MapRece基於磁碟的批量處理引擎,Spark賴以成名之處是其數據實時處理功能。Spark與Hadoop及其模塊兼容。實際上,在Hadoop的項目頁面上,Spark就被列為是一個模塊。
Spark有自己的頁面,因為雖然它可以通過YARN(另一種資源協調者)在Hadoop集群中運行,但是它也有一種獨立模式。它可以作為 Hadoop模塊來運行,也可以作為獨立解決方案來運行。
MapRece和Spark的主要區別在於,MapRece使用持久存儲,而Spark使用彈性分布式數據集(RDDS)。
性能
Spark之所以如此快速,原因在於它在內存中處理一切數據。沒錯,它還可以使用磁碟來處理未全部裝入到內存中的數據。
Spark的內存處理為來自多個來源的數據提供了近乎實時分析的功能:營銷活動、機器學習、物聯網感測器、日誌監控、安全分析和社交媒體網站。另 外,MapRece使用批量處理,其實從來就不是為驚人的速度設計的。它的初衷是不斷收集來自網站的信息,不需要這些數據具有實時性或近乎實時性。
易用性
支持Scala(原生語言)、Java、Python和Spark SQL。Spark SQL非常類似於SQL 92,所以幾乎不需要經歷一番學習,馬上可以上手。
Spark還有一種交互模式,那樣開發人員和用戶都可以獲得查詢和其他操作的即時反饋。MapRece沒有交互模式,不過有了Hive和Pig等附加模塊,採用者使用MapRece來得容易一點。
成本
「Spark已證明在數據多達PB的情況下也輕松自如。它被用於在數量只有十分之一的機器上,對100TB數據進行排序的速度比Hadoop MapRece快3倍。」這一成績讓Spark成為2014年Daytona GraySort基準。
兼容性
MapRece和Spark相互兼容;MapRece通過JDBC和ODC兼容諸多數據源、文件格式和商業智能工具,Spark具有與MapRece同樣的兼容性。
數據處理
MapRece是一種批量處理引擎。MapRece以順序步驟來操作,先從集群讀取數據,然後對數據執行操作,將結果寫回到集群,從集群讀 取更新後的數據,執行下一個數據操作,將那些結果寫回到結果,依次類推。Spark執行類似的操作,不過是在內存中一步執行。它從集群讀取數據後,對數據 執行操作,然後寫回到集群。
Spark還包括自己的圖形計算庫GraphX。GraphX讓用戶可以查看與圖形和集合同樣的數據。用戶還可以使用彈性分布式數據集(RDD),改變和聯合圖形,容錯部分作了討論。
容錯
至於容錯,MapRece和Spark從兩個不同的方向來解決問題。MapRece使用TaskTracker節點,它為 JobTracker節點提供了心跳(heartbeat)。如果沒有心跳,那麼JobTracker節點重新調度所有將執行的操作和正在進行的操作,交 給另一個TaskTracker節點。這種方法在提供容錯性方面很有效,可是會大大延長某些操作(即便只有一個故障)的完成時間。
Spark使用彈性分布式數據集(RDD),它們是容錯集合,裡面的數據元素可執行並行操作。RDD可以引用外部存儲系統中的數據集,比如共享式文件系統、HDFS、HBase,或者提供Hadoop InputFormat的任何數據源。Spark可以用Hadoop支持的任何存儲源創建RDD,包括本地文件系統,或前面所列的其中一種文件系統。
RDD擁有五個主要屬性:
分區列表
計算每個分片的函數
依賴其他RDD的項目列表
面向鍵值RDD的分區程序(比如說RDD是散列分區),這是可選屬性
計算每個分片的首選位置的列表(比如HDFS文件的數據塊位置),這是可選屬性
RDD可能具有持久性,以便將數據集緩存在內存中。這樣一來,以後的操作大大加快,最多達10倍。Spark的緩存具有容錯性,原因在於如果RDD的任何分區丟失,就會使用原始轉換,自動重新計算。
可擴展性
按照定義,MapRece和Spark都可以使用HDFS來擴展。那麼,Hadoop集群能變得多大呢?
據稱雅虎有一套42000個節點組成的Hadoop集群,可以說擴展無極限。最大的已知Spark集群是8000個節點,不過隨著大數據增多,預計集群規模也會隨之變大,以便繼續滿足吞吐量方面的預期。
安全
Hadoop支持Kerberos身份驗證,這管理起來有麻煩。然而,第三方廠商讓企業組織能夠充分利用活動目錄Kerberos和LDAP用於身份驗證。同樣那些第三方廠商還為傳輸中數據和靜態數據提供數據加密。
Hadoop分布式文件系統支持訪問控制列表(ACL)和傳統的文件許可權模式。Hadoop為任務提交中的用戶控制提供了服務級授權(Service Level Authorization),這確保客戶擁有正確的許可權。
Spark的安全性弱一點,目前只支持通過共享密鑰(密碼驗證)的身份驗證。Spark在安全方面帶來的好處是,如果你在HDFS上運行Spark,它可以使用HDFS ACL和文件級許可權。此外,Spark可以在YARN上運行,因而能夠使用Kerberos身份驗證。
總結
Spark與MapRece是一種相互共生的關系。Hadoop提供了Spark所沒有的功能特性,比如分布式文件系統,而Spark 為需要它的那些數據集提供了實時內存處理。完美的大數據場景正是設計人員當初預想的那樣:讓Hadoop和Spark在同一個團隊裡面協同運行。
然後看這篇文章:Link
註:對下面這一段持保留意見:
此外我們這里還要講到的是一個關於spark的重要誤區—「spark是基於內存的技術」。它不是基於內存的技術;spark是一個管道式的執行引擎,而且在shuffle的過程中會將數據寫入磁碟(比如說,如果我們想針對某個欄位做聚合操作)、如果內存不夠的話也一樣會內存溢出(但是內存可以調整)。因此,spark之所以比MapRece快主要是因為它是管道式處理方式而不是有些人說的「基於內存的優化」。當然,spark在內存中做了緩存來提高性能,但這不是spark真正工作快的原因。
現在,我們再來完整比對一下:
1. MapRece可以被Spark Core替換?是的,它會隨著時間的推移被替代,而且這種替代是合理的。但是spark目前還不是特別成熟能完全替代MapRece。此外,也沒有人會完全放棄MapRece,除非所有依賴MapRece的工具都有可替代方案。比如說,想要在pig上運行的腳本能在spark上執行還是有些工作要做的。
(註:Pig是一種數據流語言,用來快速輕松的處理巨大的數據,雅虎推出的,現在正在走下坡路。Pig可以非常方便的處理HDFS和HBase的數據,和Hive一樣,Pig可以非常高效的處理其需要做的,通過直接操作Pig查詢可以節省大量的勞動和時間。當你想在你的數據上做一些轉換,並且不想編寫MapRece jobs就可以用Pig.)
2. Hive可以被Spark SQL替換?是的,這又是對的。但是我們需要理解的是Spark SQL對於spark本身來說還是比較年輕的,大概要年輕1.5倍。相對於比較成熟的Hive來說它只能算是玩具了吧,我將在一年半到兩年之內再回頭來看Spark SQL.。如果我們還記得的話,兩到三年前Impala就號稱要終結Hive,但是截止到目前兩種技術也還是共存狀態,Impala並沒有終結Hive。在這里對於Spark SQL來說也是一樣的。
3. Storm可以被Spark Streaming替換?是的,可以替換。只不過平心而論storm並不是Hadoop生態系統中的一員,因為它是完全獨立的工具。他們的計算模型並不太形同,所以我不認為storm會消失,反而仍會作為一個商業產品。
4. Mahout可以被MLib替換?公平的講,Machout已經失去了市場,而且從過去的幾年來看它正在快速失去市場。對於這個工具,我們可以說這里是Spark真正可以替換Hadoop生態系統中的地方。 (註:同意!Spark的ML非常好用!要好好學!)
因此,總的來說,這篇文章的結論是:
1.不要被大數據供應商的包裝所愚弄。他們大量推進的是市場而不是最終的真理。Hadoop最開始是被設計為可擴展的框架,而且其中很多部分是可替換的:可以將HDFS替換為Tachyon(現在新的名字是Alluxio),可以將YARN替換為Mesos,可以將MapRece替換為Tez並且在Tez之上可以運行Hive。這將會是Hadoop技術棧的可選方案或者完全替代方案?倘若我們放棄的MR(MapRece)而使用Tez,那麼它還會是Hadoop嗎?
2. Spark不能為我們提供完整的技術棧。它允許我們將它的功能集成到我們的Hadoop集群中並且從中獲益,而不用完全脫離我們老的集群方案。
3. Spark還不夠成熟。我認為在過三到四年我們就不會再叫「Hadoop棧」而是叫它「大數據棧」或者類似的稱呼。因為在大數據棧中我們有很廣泛的選擇可以選出不同的開源產品來組合在一起形成一個單獨的技術棧使用。
④ 大數據中的Spark指的是什麼
謝謝邀請!
spark最初是由伯克利大學的amplab於2009年提交的一個項目,現在已經是Apache軟體基金會最活躍的項目,對於spark,apache給出的官方定義是:spark是一個快速和通用的大數據處理引擎。可以理解為一個分布式大數據處理框架,spark是基於Rdd(彈性分布式數據集),立足於內存計算,在「one stack to rule them all」 的思想引導下 ,打造了一個可以流式處理(spark streaming),機器學習(mllib),實時查詢(spark sql),圖計算(graphx)等各種大數據處理,無縫連接的一棧式計算平台,由於spark在性能和擴展上快速,易用,通用的特點,使之成為一個一體化,多元化的大數據計算平台。
spark的一棧式優勢
1 快速處理,比hadoop快100倍,因為spark是基於內存計算,而hadoop是基於磁碟計算
2易用性,spark支持多種語言
3 通用性強,可以流式處理,及時查詢,圖計算,機器學習
4 可以和hadoop數據集成,運行在yarn上,統一進行資源管理調度
5 活躍和壯大的社區
以上是關於spark的簡單定義,希望我的回答可以採納,謝謝
⑤ 如何利用spark快速計算笛卡爾積
設A,B為集合,用A中元素為第一元素,B中元素為第二元素構成有序對,所有這樣的有序對組成的集合叫做A與B的笛卡爾積,記作AxB. 笛卡爾積的符號化為: A×B={(x,y)|x∈A∧y∈B} 例如,A={a,b}, B={0,1,2},則 A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b...
⑥ Spark一種快速數據分析替代方案
Spark一種快速數據分析替代方案
Spark 是一種與 Hadoop 相似的開源集群計算環境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負載方面表現得更加優越,換句話說,Spark 啟用了內存分布數據集,除了能夠提供互動式查詢外,它還可以優化迭代工作負載。
Spark 是在 Scala 語言中實現的,它將 Scala 用作其應用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數據集。
盡管創建 Spark 是為了支持分布式數據集上的迭代作業,但是實際上它是對 Hadoop 的補充,可以在 Hadoo 文件系統中並行運行。通過名為 Mesos 的第三方集群框架可以支持此行為。Spark 由加州大學伯克利分校 AMP 實驗室 (Algorithms, Machines, and People Lab) 開發,可用來構建大型的、低延遲的數據分析應用程序。
Spark 集群計算架構
雖然 Spark 與 Hadoop 有相似之處,但它提供了具有有用差異的一個新的集群計算框架。首先,Spark 是為集群計算中的特定類型的工作負載而設計,即那些在並行操作之間重用工作數據集(比如機器學習演算法)的工作負載。為了優化這些類型的工作負載,Spark 引進了內存集群計算的概念,可在內存集群計算中將數據集緩存在內存中,以縮短訪問延遲。
Spark 還引進了名為 彈性分布式數據集 (RDD) 的抽象。RDD 是分布在一組節點中的只讀對象集合。這些集合是彈性的,如果數據集一部分丟失,則可以對它們進行重建。重建部分數據集的過程依賴於容錯機制,該機制可以維護 「血統」(即充許基於數據衍生過程重建部分數據集的信息)。RDD 被表示為一個 Scala 對象,並且可以從文件中創建它;一個並行化的切片(遍布於節點之間);另一個 RDD 的轉換形式;並且最終會徹底改變現有 RDD 的持久性,比如請求緩存在內存中。
Spark 中的應用程序稱為驅動程序,這些驅動程序可實現在單一節點上執行的操作或在一組節點上並行執行的操作。與 Hadoop 類似,Spark 支持單節點集群或多節點集群。對於多節點操作,Spark 依賴於 Mesos 集群管理器。Mesos 為分布式應用程序的資源共享和隔離提供了一個有效平台(參見 圖 1)。該設置充許 Spark 與 Hadoop 共存於節點的一個共享池中。
圖 1. Spark 依賴於 Mesos 集群管理器實現資源共享和隔離。
Spark 編程模式
驅動程序可以在數據集上執行兩種類型的操作:動作和轉換。動作 會在數據集上執行一個計算,並向驅動程序返回一個值;而轉換 會從現有數據集中創建一個新的數據集。動作的示例包括執行一個 Rece 操作(使用函數)以及在數據集上進行迭代(在每個元素上運行一個函數,類似於 Map 操作)。轉換示例包括 Map 操作和 Cache 操作(它請求新的數據集存儲在內存中)。
我們隨後就會看看這兩個操作的示例,但是,讓我們先來了解一下 Scala 語言。
Scala 簡介
Scala 可能是 Internet 上不為人知的秘密之一。您可以在一些最繁忙的 Internet 網站(如 Twitter、LinkedIn 和 Foursquare,Foursquare 使用了名為 Lift 的 Web 應用程序框架)的製作過程中看到 Scala 的身影。還有證據表明,許多金融機構已開始關注 Scala 的性能(比如 EDF Trading 公司將 Scala 用於衍生產品定價)。
Scala 是一種多範式語言,它以一種流暢的、讓人感到舒服的方法支持與命令式、函數式和面向對象的語言相關的語言特性。從面向對象的角度來看,Scala 中的每個值都是一個對象。同樣,從函數觀點來看,每個函數都是一個值。Scala 也是屬於靜態類型,它有一個既有表現力又很安全的類型系統。
此外,Scala 是一種虛擬機 (VM) 語言,並且可以通過 Scala 編譯器生成的位元組碼,直接運行在使用 Java Runtime Environment V2 的 Java? Virtual Machine (JVM) 上。該設置充許 Scala 運行在運行 JVM 的任何地方(要求一個額外的 Scala 運行時庫)。它還充許 Scala 利用大量現存的 Java 庫以及現有的 Java 代碼。
最後,Scala 具有可擴展性。該語言(它實際上代表了可擴展語言)被定義為可直接集成到語言中的簡單擴展。
Scala 的起源
Scala 語言由 Ecole Polytechnique Federale de Lausanne(瑞士洛桑市的兩所瑞士聯邦理工學院之一)開發。它是 Martin Odersky 在開發了名為 Funnel 的編程語言之後設計的,Funnel 集成了函數編程和 Petri net 中的創意。在 2011 年,Scala 設計團隊從歐洲研究委員會 (European Research Council) 那裡獲得了 5 年的研究經費,然後他們成立新公司 Typesafe,從商業上支持 Scala,接收籌款開始相應的運作。
舉例說明 Scala
讓我們來看一些實際的 Scala 語言示例。Scala 提供自身的解釋器,充許您以交互方式試用該語言。Scala 的有用處理已超出本文所涉及的范圍,但是您可以在 參考資料 中找到更多相關信息的鏈接。
清單 1 通過 Scala 自身提供的解釋器開始了快速了解 Scala 語言之旅。啟用 Scala 後,系統會給出提示,通過該提示,您可以以交互方式評估表達式和程序。我們首先創建了兩個變數,一個是不可變變數(即 vals,稱作單賦值),另一個變數是可變變數 (vars)。注意,當您試圖更改 b(您的 var)時,您可以成功地執行此操作,但是,當您試圖更改 val 時,則會返回一個錯誤。
清單 1. Scala 中的簡單變數
$ scalaWelcome to Scala version 2.8.1.final (OpenJDK Client VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val a = 1a: Int = 1
scala> var b = 2b: Int = 2
scala> b = b + ab: Int = 3
scala> a = 26: error: reassignment to val
a = 2
^
接下來,創建一個簡單的方法來計算和返回 Int 的平方值。在 Scala 中定義一個方法得先從def 開始,後跟方法名稱和參數列表,然後,要將它設置為語句的數量(在本示例中為 1)。無需指定任何返回值,因為可以從方法本身推斷出該值。注意,這類似於為變數賦值。在一個名為 3的對象和一個名為 res0 的結果變數(Scala 解釋器會自動為您創建該變數)上,我演示了這個過程。這些都顯示在 清單 2 中。
清單 2. Scala 中的一個簡單方法
scala> def square(x: Int) = x*xsquare: (x: Int)Int
scala> square(3)res0: Int = 9
scala> square(res0)res1: Int = 81
接下來,讓我們看一下 Scala 中的一個簡單類的構建過程(參見 清單 3)。定義一個簡單的Dog 類來接收一個 String 參數(您的名稱構造函數)。注意,這里的類直接採用了該參數(無需在類的正文中定義類參數)。還有一個定義該參數的方法,可在調用參數時發送一個字元串。您要創建一個新的類實例,然後調用您的方法。注意,解釋器會插入一些豎線:它們不屬於代碼。
清單 3. Scala 中的一個簡單的類
scala> class Dog( name: String ) {
| def bark() = println(name + " barked")
| }defined class Dog
scala> val stubby = new Dog("Stubby")stubby: Dog = Dog@1dd5a3d
scala> stubby.barkStubby barked
scala>
完成上述操作後,只需輸入 :quit 即可退出 Scala 解釋器。
⑦ 有什麼關於 Spark 的書推薦
附錄從spark的角度解釋了Scala,並詳細解釋了Scala函數編程和面向對象編程。
⑧ 《Spark機器學習》pdf下載在線閱讀全文,求百度網盤雲資源
《Spark機器學習》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1kiagkVpdB5pvRoSyg-VOOg
⑨ 如何用Spark來實現已有的MapRece程序
假定我們需要計算大文本中每一行的長度,並且報告每個長度的行數。在HadoopMapRece中,我們首先使用一個Mapper,生成為以行的長度作為key,1作為value的鍵值對。
public class LineLengthMapper extends
Mapper<LongWritable, Text, IntWritable, IntWritable> {
@Override
protected void map(LongWritable lineNumber, Text line, Context context)
throws IOException, InterruptedException {
context.write(new IntWritable(line.getLength()), new IntWritable(1));
}
}
值得注意的是Mappers和Recers只對鍵值對進行操作。所以由TextInputFormat提供輸入給LineLengthMapper,實際上也是以文本中位置為key(很少這么用,但是總是需要有東西作為Key),文本行為值的鍵值對。
與之對應的Spark實現:
lines.map(line => (line.length, 1))
Spark中,輸入只是String構成的RDD,而不是key-value鍵值對。Spark中對key-value鍵值對的表示是一個Scala的元組,用(A,B)這樣的語法來創建。上面的map操作的結果是(Int,Int)元組的RDD。當一個RDD包含很多元組,它獲得了多個方法,如receByKey,這對再現MapRece行為將是至關重要的。
Rece
rece()與receBykey()
統計行的長度的鍵值對,需要在Recer中對每種長度作為key,計算其行數的總和作為value。
public class LineLengthRecer extends
Recer<IntWritable, IntWritable, IntWritable, IntWritable> {
@Override
protected void rece(IntWritable length, Iterable<IntWritable> counts,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable count : counts) {
sum += count.get();
}
context.write(length, new IntWritable(sum));
}
}
Spark中與上述Mapper,Recer對應的實現只要一行代碼:
val lengthCounts = lines.map(line => (line.length, 1)).receByKey(_ + _)
Spark的RDD API有個rece方法,但是它會將所有key-value鍵值對rece為單個value。這並不是Hadoop MapRece的行為,Spark中與之對應的是ReceByKey。
另外,Recer的Rece方法接收多值流,並產生0,1或多個結果。而receByKey,它接受的是一個將兩個值轉化為一個值的函數,在這里,就是把兩個數字映射到它們的和的簡單加法函數。此關聯函數可以被調用者用來rece多個值到一個值。與Recer方法相比,他是一個根據Key來Rece Value的更簡單而更精確的API。
Mapper
map() 與 flatMap()
現在,考慮一個統計以大寫字母開頭的單詞的個數的演算法。對於每行輸入文本,Mapper可能產生0個,1個或多個鍵值對。
public class CountUppercaseMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable lineNumber, Text line, Context context)
throws IOException, InterruptedException {
for (String word : line.toString().split(" ")) {
if (Character.isUpperCase(word.charAt(0))) {
context.write(new Text(word), new IntWritable(1));
}
}
}
}
Spark對應的寫法:
lines.flatMap(
_.split(" ").filter(word => Character.isUpperCase(word(0))).map(word => (word,1))
)
簡單的Spark map函數不適用於這種場景,因為map對於每個輸入只能產生單個輸出,但這個例子中一行需要產生多個輸出。所以,和MapperAPI支持的相比,Spark的map函數語義更簡單,應用范圍更窄。
Spark的解決方案是首先將每行映射為一組輸出值,這組值可能為空值或多值。隨後會通過flatMap函數被扁平化。數組中的詞會被過濾並被轉化為函數中的元組。這個例子中,真正模仿Mapper行為的是flatMap,而不是map。
groupByKey()
寫一個統計次數的recer是簡單的,在Spark中,receByKey可以被用來統計每個單詞的總數。比如出於某種原因要求輸出文件中每個單詞都要顯示為大寫字母和其數量,在MapRece中,實現如下:
public class CountUppercaseRecer extends
Recer<Text, IntWritable, Text, IntWritable> {
@Override
protected void rece(Text word, Iterable<IntWritable> counts, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable count : counts) {
sum += count.get();
}
context
.write(new Text(word.toString().toUpperCase()), new IntWritable(sum));
}
}
但是redeceByKey不能單獨在Spark中工作,因為他保留了原來的key。為了在Spark中模擬,我們需要一些更像Recer API的操作。我們知道Recer的rece方法接受一個key和一組值,然後完成一組轉換。groupByKey和一個連續的map操作能夠達到這樣的目標:
groupByKey().map { case (word,ones) => (word.toUpperCase, ones.sum) }
groupByKey只是將某一個key的所有值收集在一起,並且不提供rece功能。以此為基礎,任何轉換都可以作用在key和一系列值上。此處,將key轉變為大寫字母,將values直接求和。
⑩ 基於spark的深度學習怎麼實現,具體應用實例
Apache Spark項目於2009年誕生於伯克利大學的AMPLab實驗室,當初的目的在於將內存內分析機制引入大規模數據集當中。在那個時候,Hadoop MapRece的關注重點仍然放在那些本質上無法迭代的大規模數據管道身上。想在2009年以MapRece為基礎構建起分析模型實在是件費心費力而又進展緩慢的工作,因此AMPLab設計出Spark來幫助開發人員對大規模數據集執行交互分析、從而運行各類迭代工作負載——也就是對內存中的同一套或者多套數據集進行反復處理,其中最典型的就是機器學習演算法。
Spark的意義並不在於取代Hadoop。正相反,它為那些高度迭代的工作負載提供了一套備用處理引擎。通過顯著降低面向磁碟的寫入強度,Spark任務通常能夠在運行速度方面高出Hadoop MapRece幾個數量級。作為逗寄生地在Hadoop集群當中的得力助手,Spark利用Hadoop數據層(HDFS、HBase等等)作為數據管道終端,從而實現原始數據讀取以及最終結果存儲。