2015 年 12 月

第 30 卷,第 13 期

本文章是由機器翻譯。

測試回合 - 為 .NET 開發人員簡介 Spark

James McCaffrey | 2015 年 12 月

James McCaffreySpark 是一個開放原始碼運算架構巨量資料,以及它變得越來越普遍,尤其是在機器學習案例。在本文中我將說明如何在執行 Windows 作業系統的機器上安裝 Spark,從.NET 開發人員的觀點說明 Spark 的基本功能。

若要查看其中本文開頭都是最佳的方式是看一下示範互動式工作階段中所示 圖 1。從 Windows 命令殼層,在 [系統管理模式中執行,我一開始 Spark 環境發出 spark 殼層命令。

作用中的 Spark
圖 1 中的 Spark

Spark 殼層命令會產生 Scala 直譯器,在殼層中執行,並接著發出 Scala 提示 (scala >)。Scala 是 Java 為基礎的指令碼語言。有其他方式互動 Spark,但使用 Scala 直譯器最常見的方法,部分因為 Spark 架構主要撰寫 Scala。使用 Python 語言命令,或撰寫 Java 程式,您也可以互動使用 Spark。

請注意多個警告訊息中的 圖 1。這些訊息是很常見,因為 Spark 有許多選用元件,如果未執行 Spark 時發現,產生警告。一般情況下,簡單的案例可以忽略警告訊息。

示範工作階段中輸入第一個命令是:

scala> val f = sc.textFile("README.md")

這可以鬆散意思解譯 」 存放區到不可變的 RDD 物件名為 f README.md 檔案的內容。 」 Scala 物件可以宣告為 val 或 var。物件宣告為 val 是固定不變,而且無法變更。

Scala 直譯器都有內建的 Spark 內容物件,名為 sc,可用來存取 Spark 功能。TextFile 函式會將文字檔的內容載入 Spark 資料結構,稱為彈性的分散式資料集 (RDD)。RDDs 是主要的程式設計抽象概念,以在 Spark 中使用。您可以想像 RDD 做為儲存在 RAM 到多部電腦為.NET 集合有點類似。

文字檔案 (.md 副檔名代表 markdown 文件) 的 README.md 位於 C:\spark_1_4_1 Spark 根目錄中。如果目標檔案位於某處否則,您可以提供完整的路徑,例如 C:\\Data\\ReadMeToo.txt。

示範工作階段中的第二個命令為:

scala> val ff = f.filter(line => line.contains("Spark"))

這表示,「 儲存到不可變的 RDD 物件命名為 ff 只有這些行 object f 含有 'Spark' 這個字的。 」 Filter 函式接受了稱為 closure。您可以將像是匿名函式的封閉區段。在這裡,closure 接受空的字串輸入的參數名為列,以及如果列包含 「 Spark,"false 否則會傳回 true。

因為 「 列 」 是參數名稱,我無法所使用的任何其他名稱的 closure 中,例如:

ln => ln.contains("Spark")

Spark 是區分大小寫的因此,下列會產生錯誤:

ln => ln.Contains("Spark")

Scala 某些功能的程式設計語言特性,而且可以撰寫多個命令。比方說前, 兩個命令可以合併成一個做為:

val ff = sc.textFile("README.md").filter(line => lne.contains("Spark"))

示範工作階段中的最後三個命令如下:

scala> val ct = ff.count()
scala> println(ct)
scala> :q

Count 函數會傳回的項目數 RDD,在此情況下是 README.md 檔中包含單字 Spark 的行數。有這類 19 行。若要結束 Spark Scala 工作階段,您可以輸入: q 命令。

在 Windows 電腦上安裝 Spark

有一部 Windows 電腦上安裝 Spark 的四個主要步驟。首先,您安裝 Java Development Kit (JDK) 和 Java 執行階段環境 (JRE)。第二,您可以安裝 Scala 語言。第三,您會安裝 Spark 架構。而第四,您設定主機電腦的系統變數。

Spark 配送.tar 壓縮格式,因此您將需要一個公用程式來解壓縮 Spark 檔案。建議您安裝在您開始前的開放原始碼 7 Zip 程式。

雖然 Spark 和其元件正式不支援的各種範圍 Windows 作業系統的版本中,我已成功地執行 Windows 7 機器上安裝 Spark 8、 10 和 Server 2008 和 2012年。此示範中所示 圖 1 Windows 8.1 機器上執行。

您可以執行自動解壓縮可執行,您可以藉由在網際網路上搜尋找到安裝 JDK。我使用版本 jdk-8u60-windows-x64.exe。

當安裝 64 位元版本的 jdk,預設安裝目錄是 C:\Program Files\Java\jdkx.x.x_xx\ 所顯示的 圖 2。我建議您不要變更預設位置。

預設 JDK 位置
圖 2 的預設 JDK 位置

安裝的 JDK,也會安裝相關聯的 JRE。在安裝完成之後,預設 Java 父目錄將包含 JDK 目錄和相關的 JRE 目錄中所示 圖 3

![Java JDK 和 JRE 安裝到 C:\Program Files\Java\](images/mt595756.McCaffrey_Figure3-JavaInstallDirectories_hires(zh-tw,MSDN.10).png "Java JDK 和 JRE 安裝到 C:\Program Files\Java\")
圖 3 Java JDK 和 JRE 安裝到 C:\Program Files\Java\

請注意,您的電腦可能也會有一個或多個 32 位元 JRE 目錄是 Java 的目錄在 C:\Program Files (x86)。還是可以有 32 位元和 64 位元版本的 Jre 上您的電腦,但建議使用僅 Java JDK 的 64 位元版本。

安裝 Scala

下一個步驟是安裝 Scala 的語言,但這麼做之前,您必須進入 spark 下載站台 (如本文的下一節所述),然後決定要安裝的 Scala 版本。Scala 版本必須與您將在下列步驟來安裝 Spark 版本相容。

不幸的是,也來說 Scala Spark 版本相容性資訊。我已安裝 Spark 元件 (很久以前時您閱讀本文),目前版本的 Spark 1.5.0,但我找不到任何有關的版本資訊 Scala 時與該版本的 Spark 相容。因此,我探討了舊版的 Spark 1.4.1,以及開發人員討論建議的 Scala 2.10.4 版的網站上的一些資訊是可能的相容版本的 Spark 1.4.1。

安裝 Scala 很簡單。安裝程序只會包含執行.msi 安裝程式檔案。

Scala 安裝精靈會引導您完成程序。有趣的是,Scala 的預設安裝目錄是在 32 位元的目錄 C:\Program Files (x86) \ 而不是 64 位元 C:\Program Files\ 目錄中 (請參閱 圖 4)。

![安裝至 C:\Program Files (x86) 的 Scala \scala\](images/mt595756.McCaffrey_Figure5-ScalaInstallDirectories_hires(zh-tw,MSDN.10).png "安裝至 C:\Program Files (x86) 的 Scala \scala\")
圖 4 Scala 安裝到 C:\Program 檔案 (x86) \scala\

如果您想要撰寫 Java 程式,而不是使用 Scala 命令,您將需要安裝其他的工具稱為 Scala 簡單建置工具 (SBT) 來操作 Spark。透過編譯 Java 程式互動 Spark 是比使用互動式 Scala 多了更困難。

安裝 Spark

下一個步驟是安裝 Spark 架構。首先,不過是確定您擁有的公用程式,例如 7 Zip 可以解壓縮.tar 格式檔案。Spark 的安裝程序是手動 — 壓縮的資料夾下載到本機電腦、 解壓縮壓縮的檔案,並接著將檔案複製到根目錄。這表示,如果您想要解除安裝 Spark,您只是刪除 Spark 檔案。

您可以找到 spark.apache.org 的 Spark 站台。[下載] 頁面可讓您選取的版本及封裝類型。Spark 是運算架構,而且需要分散式的檔案系統 (DFS)。到目前為止最常見的 DFS 搭配 Spark 架構是 Hadoop 分散式檔案系統 (HDFS)。測試和實驗的用途,例如示範工作階段中的 圖 1, ,您可以在沒有 DFS 的系統上安裝 Spark。在此案例中,Spark 將使用本機檔案系統。

如果您還沒有解壓縮.tar 檔案之前,您可能會發現處理程序有點令人困惑因為您通常必須解壓縮兩次。首先,下載.tar 檔案 (我名為 spark 1.4.1-bin hadoop2.6.tar) 到暫存目錄 (我使用 C:\Temp)。接下來,.tar 檔案上按一下滑鼠右鍵並選取 [從內容功能表的 [擷取檔案],然後將解壓縮到暫存目錄內的新目錄。

第一個擷取程序會建立新的壓縮的檔,而不需要任何副檔名 (在我寫 spark-1.4.1-bin-hadoop2.6)。接下來,以滑鼠右鍵按一下新的檔案,並選取 [擷取檔案] 再次從內容功能表,然後擷取至不同的目錄。這個第二個擷取將會產生在 Spark 架構檔案。

建立 Spark 架構檔案的目錄。常見慣例是,建立名為的 C:\spark_x_x_x,其中的 x 值會指出版本的目錄。使用下列慣例,我建立了 C:\spark_1_4_1 目錄並解壓縮的檔案複製到該目錄中,如所示 圖 5

![已解壓縮的 Spark 檔案手動複製 C:\spark_x_x_x\](images/mt595756.McCaffrey_Figure6-SparkFilesInstalled_hires(zh-tw,MSDN.10).png "已解壓縮的 Spark 檔案手動複製 C:\spark_x_x_x\")
圖 5 手動複製擷取的 Spark 檔案到 C:\spark_x_x_x\

設定您的電腦

安裝 Java、 Scala 和 Spark 之後, 的最後一個步驟是設定主機電腦。這牽涉到下載適用於 Windows 所需的特殊公用程式檔案、 設定三個使用者定義的系統環境變數、 設定系統 Path 變數,以及選擇性地修改 Spark 設定檔。

在 Windows 上執行 Spark 會要求名為 winutils.exe 的特殊公用程式檔案放在名為 C:\hadoop 的本機目錄。您可以在幾個地方找到檔案,藉由在網際網路上搜尋。我建立 C:\hadoop 目錄,然後找到一份在 winutils.exe http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe 和下載檔案至目錄。

接下來,建立及設定三個使用者定義的系統環境變數,並修改系統路徑變數。移至 [控制台] |系統 |進階系統設定 |進階 |環境變數。在 [使用者變數] 區段中,建立三個新的變數取代這些名稱和值:

JAVA_HOME     C:\Program Files\Java\jdk1.8.0_60
SCALA_HOME    C:\Program Files (x86)\scala
HADOOP_HOME   C:\hadoop

然後,在系統變數中,編輯 Path 變數新增 Spark 二進位檔 C:\spark_1_4_1\bin 的位置。請務必小心。您真的不想失去 Path 變數中的任何值。請注意,Scala 安裝程序已經將 Scala 二進位檔的位置,供您 (請參閱 圖 6)。

設定您的系統
圖 6 設定您的系統

設定您的系統變數之後,我建議您修改 Spark 組態檔。移至根目錄 C:\spark_1_4_1\config,並複製一份檔案 log4j.properties.template。移除.template 延伸模組來重新命名該複本。編輯的第一個組態項目從 log4j.rootCategory=INFO log4j.rootCategory=WARN。

其概念是預設 Spark spews 所有類型的參考用訊息。變更記錄層級資訊中,就發出警告大幅降低訊息的次數,並使 Spark 較不需要進行互動。

Hello World 的 Spark

分散式運算環境的 Hello World 範例是計算的不同資料來源中的字數。圖 7 示範使用 Spark 的字數統計範例。

字數統計範例中使用 Spark
圖 7 使用 Spark 的字數統計範例

Scala 殼層有時也稱為讀取、 評估、 列印迴圈 (REPL) 介面。您可以清除 Scala REPL 輸入 CTRL + L。中的第一個命令 圖 7 名為 f,RDD README.md 檔案的內容載入,如先前所述。在實際案例中,您的資料來源可能是散佈在幾百部電腦,大型檔案,或可能分散式資料庫,例如 Cassandra。

下一個命令是:

scala> val fm = f.flatMap(line => line.split(" "))

FlatMap 函式呼叫會分割空白空格字元,而 f RDD 物件中的每一行,以便產生 RDD 物件 fm 將保留集合的所有文字檔案中。從開發人員的觀點來看,您可以想像調頻廣播,像是.NET 清單 < 字串 > 集合。

下一個命令是:

scala> val m = fm.map(word => (word, 1))

Map 函式會建立 RDD 物件,包含組的項目,其中每個配對組成一個字,以及整數值 1。您可以更清楚地看到這個如果您發出 m.take(5) 命令。您會看到檔案 README.md 中,而 1 值旁邊的每個字的前五個字。從開發人員的觀點來看,m 大致清單 < 組 > 集合中每一組物件所組成的字串和整數。(在 README.md 中的文字) 的字串是索引鍵的整數值,而且不同於 Microsoft.NET Framework 中的任何索引鍵-值配對,在 Spark 中允許重複的索引鍵值。RDD 持有之物件的索引鍵 / 值組有時也稱為組區別一般 RDDs RDDs。

下一個命令是:

scala> val cts = m.reduceByKey((a,b) => a + b)

ReduceByKey 函式結合 m 物件中的項目,將相同的索引鍵值相關聯的整數值。如果您未 cts.take(10) 您會看到 10 README.md 後面接著檔案中的每個單字出現的次數中的文字。您也可能注意到物件 cts 中的字數不一定能夠以任何特定順序。

ReduceByKey 函式接受 closure。您可以使用替代的 Scala 捷徑標記法:

scala> val cts = m.reduceByKey(_ + _)

底線是參數萬用字元,因此可以解譯的語法,為 [新增接收任何兩個值。

請注意這個字數統計範例使用 map 函式,後面接著 reduceByKey 函式。這是 MapReduce 架構的範例。

下一個命令是:

scala> val sorted =
     cts.sortBy(item => item._2, false)

此命令會排序 cts RDD,根據第二個值 (整數計數) 的項目中的項目。False 引數表示要以遞減的順序,亦即從最低到最高計數排序。Sort 命令的 Scala 捷徑語法格式會是:

scala> val sorted = cts.sortBy(_._2, false)

因為 Scala 有許多功能性語言的特性,而且使用大量的符號而不是關鍵字,就可以撰寫非常不僅 Scala 程式碼。

中的 Hello World 範例的最後一個命令會顯示結果:

scala> sorted.take(5).foreach(println)

這表示,「 提取 RDD 物件名稱的前五個物件排序,逐一查看該集合,每個項目上套用 println 函式。 」 結果如下:

(,66)
(the,21)
(Spark,14)
(to,14)
(for,11)

這表示有 66 字的出現次數空白/空值在 README.md 中,21 出現的文字"the"、"Spark"等等的 14 項目。

總結

本文中的資訊應該會收到您立即啟動及執行,如果您想要在一部 Windows 電腦上進行試驗 Spark。Spark 是相當新技術,(在 UC Berkeley 2009 中建立),但在 Spark 中大幅增加過去的幾個月,至少在我的同事。

巨量資料處理架構之間 2014年競賽,Spark 設定新的效能記錄,輕鬆地打設定 Hadoop 系統之前一年的上一個記錄。由於其絕佳的效能特性,Spark 是特別適合用於機器學習系統。Spark 支援機器學習演算法名為 MLib 的開放原始碼程式庫。


Dr。James McCaffrey Redmond,華盛頓中的 Microsoft Research 的運作方式他曾在包括 Internet Explorer 和 Bing 的數個 Microsoft 產品。Dr.McCaffrey 可以到達jammc@microsoft.com

感謝以下的微軟技術專家對本文的審閱: Gaz Iqbal 和 Umesh Madan