使用 Scala Eclipse IDE 於本機開發 Spark 1.6 程式

Coding Spark Program Using Scala Eclipse IDE。

Eclipse 是許多工程師愛用的IDE,但用 Eclipse 寫 Scala 開發 Spark 程式卻容易在一開始環境設定上遇到一些坑。

本人處於軟體工程師轉職為資料工程師的過程,決定將這些細節全部記下來,一方面做紀錄,一方面也讓想學用 Scala 開發 Spark 程式的人不必再踏入同樣的坑內,浪費太多時間。

 

1.環境準備與設定

請下載以下相關程式與Jar檔( Url 都幫你準備好了~),我們預計會用 Spark 1.6 + Scala Eclipse IDE 4.7 + OpenJDK 1.8 實作。

Scala IDE:http://downloads.typesafe.com/scalaide-pack/4.7.0-vfinal-oxygen-212-20170929/scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64.zip

OpenJDK 1.8:https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.242-1.b08/java-1.8.0-openjdk-1.8.0.242-1.b08.ojdkbuild.windows.x86_64.msi

Jar File:http://archive.apache.org/dist/spark/spark-1.6.1/spark-1.6.1-bin-hadoop2.6.tgz

winutils.exe:https://github.com/steveloughran/winutils/blob/master/hadoop-2.6.0/bin/winutils.exe

Jar File下載解壓縮後,請找尋lib資料夾內的 spark-assembly-1.6.1-hadoop2.6.0.jar ,取出後備用。

winutils.exe 為於 Eclipse 本機跑 Spark 程式所需之應用程式。

下載完成後,安裝 Open JDK、安裝 Eclipse,並執行以下步驟:

a. 將 spark-assembly-1.6.1-hadoop2.6.0.jar 放在 D:\\ jar 內

b. 將 winutills.exe 放在 D:\\ scala_winutil \ bin 內

c. 起一個 Scala 專案檔命名 ScalaProgramTest,並於Build Path 引入 spark-assembly-1.6.1-hadoop2.6.0.jar。

做完這些動作,你應該就會發現,你的專案檔上面出現了奇怪的叉叉,這是因為 Scala 對於 JVM 版本的支援度問題(請參考下面第2張圖)。

我們用的是 Java 1.8,請將專案檔內的 Scala Compiler 內的 Scala Installation 調整為 2.10.6(built-in) 後,aplly 設定,叉叉就會消失。

2.撰寫測試程式

接著我們寫一段程式,讀取一個csv檔,並將內容印出。

a. 新增一個文字檔 test_scala.csv 內容如下,放在 D:\\ 下。

b. 新增一個 Scala 檔,命名為 ScalaInitial.scala,並把檔案內部的 class 字眼調整為 object。

接著輸入完整程式碼。

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object ScalaInitial {
	
  //讀取winUtil.exe,會至所設定的路徑下的bin資料夾讀取
  System.setProperty("hadoop.home.dir", "D:\\scala_winutil")
  
  def main(args: Array[String]): Unit = {
	  
    //檔案路徑
    var inFile= "D:///test_scala.csv"
	  
    //設定SparkConf與SparkContext
    val conf = new SparkConf().setAppName("test_scala").setMaster("local[1]")
    val sc = new SparkContext(conf)
	  
    //讀檔入RDD
    val rdd = sc.textFile(inFile)
      
    //取10筆印出
    rdd.take(10).foreach(println)
  }
}

執行結果如下: