Azure上架設與使用Apache Spark 服務 - 入門篇

Apache Spark 是近年來快速興起的巨量資料處理技術。 一開 始在2009年由加州大學柏克萊分校的AMPLab開發,並於2010年成為Apache的Open Source 專案之一。Spark 藉由在資料處理過程中(運算, 儲存等)大量採用In-Memory 的處理方式,具有優於過往以MapReduce 架構為核心的資料處理技術速度,一般說來可以達到數十倍的效能提升(理論上甚至可以達到百倍的處理效能提升)。 在2014年的Sort Benchmark Competition(資料排序基準競賽)中,Spark用更少機器且花了不到一半的時間,打破過去由Hadoop 保持的世界紀錄,更是奠定它在巨量資料處理速度上的領先者地位。 目前在Spark 的框架上,已經發展出 Spark SQL (以SQL 語法操作查詢資料), MLlib (機器學習),以及處理即時串流資料的Spark Stream。豐富的擴充模組加上效能的優勢,讓Spark 的使用人數快速增加。尤其MLlib的機器學習演算法日益完備,在Apache 專案中已經逐漸取代Mahout專案在機器學習中的地位。 

 

Microsoft Azure 的HDInisght 叢集服務原本就支援Spark 1.0, 在今年(2015)三月12號後 HDInsight 叢集服務 3.2 也正式支援Spark 1.2.  Spark 1.2 相較於 Spark 1.0 提高了效能跟穩定度, 並且在各擴充模組上新增多項重要功能 (如在Spark Stream 上支援完整 H/A 模式). 本篇文章介紹逐步介紹如何在微軟 Azure 雲端服務中部屬Spark 1.2.  (Spark 在2015 六月11日推出1.4 版, 日後會再補充1.4版的安裝)

 

 [開發環境準備]

  • Microsoft Azure 帳號 (如果尚未有帳號, 可以到這邊來申請免費試用帳號)

  • Azure Storage 管理工具 : 本篇使用的是 ClumsyLeft 出的免費工具CloudXplorer, 可以在這邊下載.

 

首先第一步建立Azure HDInsight (Hadoop) 環境

 

 

為了指定使用HDInsight 3.2 (Hadoop 2.6, HDP2.2) 版本, 在建立時選擇 “自訂建立”

 

記得HDInsight版本要指定3.2, 以確保能相容Spark 1.2 以上版本.

在作業系統上目前HDInsight 支援使用 Ubuntu 12.04 LTS或是Windows Server 2012 R2 資料中心版.  (Ubuntu 版目前在預覽)

在操作Spark 上並無太大差異, 主要是操作上 Ubuntu 需要透過Terminal (使用Windows 的人可以考慮用 Putty ) 連入操作. 而 Windows Server 版可以透過遠端桌面 (RDP) 連線操作. 可以選擇自己習慣的系統就好.  ( 這段有點廢話)

 

 

設定叢集節點大小, 這邊可以視需要調整.

 

 

分別設定叢集HTTP及 遠端桌面登入帳號密碼.  稍後我們會直接用遠端桌面登入操作Spark.

設定儲存體帳戶, 如果沒有既有儲存體帳戶的話就先去建立一個. 建立完後會出現在下拉選單中

最後一個也是最重要的一個, 就是要指定指令碼動作 ( Script Action) 來同時將Spark 1.2 環境安裝到這個HDInsight( Hadoop) 叢集中.

網路上已經有寫好的  Spark 1.2 安裝 指令碼動作 ( Script Action).

直接在 Script URI 欄位中填入以下網址:

https://hdiconfigactions.blob.core.windows.net/sparkconfigactionv03/spark-installer-v03.ps1

Node Type 選擇 Head Node

 

最後按下打勾符號確認開始建置Azure HDInsight +Spark 1.2 叢集,  這部分會花一點時間, 一般要20分鐘以上.

 

 

在耐心等候叢集建置完後, 就可以開始準備使用Spark了.

在Azure 管理介面上點選剛剛建立的HDInsight叢集, 選 “連接”透過遠端桌面登入.

 

登入後應該可以看到類似下面的桌面.

 

 

然後到 C:\Apps\Dist\Spark-1.2.1 的目錄.  

由於本篇我們會使用Scala 語言來操作Spark, 所以輸入  “.bin\spark-shell --master yarn”來啟動 Spark的 Scala 操作環境.

 

經過約莫一分鐘後Scala 操作環境就準備好, 可以開始透過Scala 語言使用Spark 豐富的功能.

 

這時也可以開啟瀏覽器http://headnodehost:9014/cluster, 可以看到Hadoop 上的確正在執行Spark

再點選ApplicationMaster 連結, 就可以看到Spark 執行過那些工作

 

 

  

接下來要小試牛刀用Spark 簡單的處理文字資料。

由於要處理的資料需要放在Azure Blob Storage, Blob Storage 本身並不是採用樹狀目錄結構的概念, 但是可以透過檔名中包含 "/" 資源來模擬類似效果.

為了方便處理, 我們使用 免費的CloudXplorer 來瀏覽Azure Blob Storage, 它可以用類似檔案總管的介面自動模擬出樹狀結構目錄, 並進行檔案操作.  

先用CloudXplorer 連上 Azure Storage , 在  /user/[user name]  下建立一個SparkTestingData 資料夾,  並且將英文版的湯姆歷險記 ( The Adventures of Tom Sawyer.txt) 文字檔放到該目錄中。

 

 

在Scala 介面中執行:

// 讀取湯姆歷險記 英文版文字檔

val file = sc.textFile("SparkTestingData\\The Adventures of Tom Sawyer.txt")

print (file.count())

 

// 挑出內含"Tom" 的句子

val TomCount = file.filter(line => line.contains("Tom"))

//挑出內含"Harper" 的句子

val HarperCount = file.filter(line => line.contains("Harper"))

// 計算Tom 出現的句子數

TomCount.count()

// 計算Harper出現的句子數

HarperCount.count()

就可以透過Spark 很快計算出在湯姆歷險記中, 提到湯姆(Tom)幾次, 提到他的好朋友哈伯(Harper)幾次了.

  

 

執行完後可以再打開 Spark  ApplicationMaster網頁 , 可以看到剛剛的工作花了多少時間執行.

下一篇我們會再介紹如何透過Spark + MLlib 進行機器學習的應用.

 

<參考資料>