Spark機器學習

Spark機器學習

注:http://blog.csdn.net/u013719780/article/details/51768381

 

Spark python簡介

Spark簡介

Spark是一個分佈式計算框架,旨在簡化運行於計算集羣上的並行程序的編寫。該框架對資源調度,任務的提交/執行和跟蹤,節點間的通信以及數據並行處理的內在底層操作都進行了抽象。它提供了一個更高級別的API用於處理分佈式數據。

Spark支持的四種運行模式:

本地單機模式:所有Spark進程都運行在同一個JVM中。

集羣單機模式:使用spark自己內置的任務調度框架。

基於Mesos:Mesos是一個流行的開源集羣計算框架。

基於YARN:與Hadoop關聯的集羣計算和資源調度框架。

Spark Python安裝

1、 下載配置 hadopp、spark(bin\sbin)的環境變量

2、 在cmd模式下運行pyspark命令,驗證是否安裝成功

3、 將spark安裝包下的pyhon/pyspark包拷貝到python安裝包下的lib/site-packages下

Spark編程模式

SparkContext類與SparkConf類

SparkConf類:包含了Spark集羣配置的各種參數(比如主節點的URL)

SparkContext類:可用SparkContext對象所包含的各種方法來建和操作分佈式數據集和共享變量。

例如scala代碼:

val conf = new SparkConf().setAppName("Test Spark App").setMaster("local[4]")

val sc = new SparkContext(conf)

這段代碼會創建一個4線程的SparkContext對象,並將其相應的任務命名爲Test SparkAPP。我們也可通過如下方式調SparkContext的簡單構造函數,以默認的參數值來創建相應的對象。其效果和上述的完全相同:
val sc = new SparkContext("local[4]", "Test Spark App")

Spark shell

Spark支持用Scala或Python REPL(Read-Eval-Print-Loop,即交互式shell)來進行交互式的程序編寫。由於輸入的代碼會被立即計算,shell能在輸入代碼時給出實時反饋。

通過Scala來使用Spark shell,只需從Spark的主目錄執行./bin/spark-shell。命令執行結果的值與類型在代碼執行完後也會顯示出來。

在Python shell中使用Spark,直接運行./bin/pyspark命令即可,如果配置了pyspark的環境變量,則直接運行pyspark命令即可。

啓動Scala shell/Python shell並初始化一個SparkContext對象。我們可以通過sc這個Scala值來調用這個對象。

彈性分佈式數據集RDD

RDD(Resilient Distributed Dataset,彈性分佈式數據集)是Spark的核心概念之一。一個RDD代表一系列的“記錄”(嚴格來說,某種類型的對象)。這些記錄被分配或分區到一個集羣的多個節點上(在本地模式下,可以類似地理解爲單個進程裏的多個線程上)。Spark中的RDD具備容錯性,即當某個節點或任務失敗時(因非用戶代碼錯誤的原因而引起,如硬件故障、網絡不通等),RDD會在餘下的節點上自動重建,以便任務能最終完成。

RDD也可以基於Hadoop的輸入源創建,比如本地文件系統、HDFS和Amazon S3。基於Hadoop的RDD可以使用任何實現了Hadoop InputFormat接口的輸入格式,包括文本文件、其他Hadoop標準格式、Hbase、Cassandra等。

創建RDD:

集合創建

collection = list(["a", "b", "c", "d", "e"])
rddFromCollection = sc.parallelize(collection)

用一個本地文件系統裏的文件創建RDD:

rddFromTextFile = sc.textFile("LICENSE")

Spark操作:

創建RDD後,便有了一個可供操作的分佈式記錄集。在Spark編程模式下,所有的操作分爲兩種:

1、 轉換操作(最常用的轉換操作便是map操作):對一個數據集裏的所有記錄執行某種函數,從而使記錄發生改變。

2、 執行:運行某些計算或聚合操作,並將結果返回運行SparkContext的那個驅動程序。

Map操作:對一個RDD裏的每一條記錄都執行某個函數,從而將輸入映射成爲新的輸出。例如:將每一個字符串都轉換爲一個整數,從而返回一個由若干Int構成的RDD對象。
intsFromStringsRDD = rddFromTextFile.map(lambda line: line.size)

 

RDD緩存策略

調用RDD的cache函數把數據緩存在集羣的內存裏。例如:rddFromTextFile.cache

調用一個RDD的cache函數將會告訴Spark將這個RDD緩存在內存中。在RDD首次調用一個執行操作時,這個操作對應的計算會立即執行,數據會從數據源裏讀出並保存到內存。因此,首次調用cache函數所需要的時間會部分取決於Spark從輸入源讀取數據所需要的時間。但是,當下一次訪問該數據集的時候,數據可以直接從內存中讀出從而減少低效的I/O操作,加快計算。多數情況下,這會取得數倍的速度提升。

Spark的另一個核心功能是能創建兩種特殊類型的變量:廣播變量和累加器。

1、 廣播變量(broadcast variable)爲只讀變量,它由運行SparkContext的驅動程序創建後發送給會參與計算的節點。對那些需要讓各工作節點高效地訪問相同數據的應用場景,比如機器學習,這非常有用。例如:broadcastAList = sc.broadcast(list(["a", "b", "c", "d", "e"]))//創建廣播變量

  廣播變量也可以被非驅動程序所在的節點(即工作節點)訪問,訪問的方法是調用該變量的value方法:

sc.parallelize(list(["1", "2", "3"])).map(lambda x: broadcastAList.value).collect()

2、 累加器(accumulator)也是一種被廣播到工作節點的變量。累加器與廣播變量的關鍵不同,是後者只能讀取而前者卻可累加。但支持的累加操作有一定的限制。具體來說,這種累加必須是一種有關聯的操作,即它得能保證在全局範圍內累加起來的值能被正確地並行計算以及返回驅動程序。每一個工作節點只能訪問和操作其自己本地的累加器,全局累加器則只允許驅動程序訪問。累加器同樣可以在Spark代碼中通過value訪問。

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