2015年9月29日 星期二

Using Spark API with Java and Maven-使用 Maven 建置 java application 呼叫 Spark API

Spark Shell 本來就提供了 2種 shell 模式,一種是 scala 另一種是 python
雖然 Spark本身也支援 Java開發,但是要使用 java lib 則需用 scala or python call java library
這個練習目的是 單純使用 java 語法呼叫 Spark API 利用 Maven build jar
之後使用 spark-submit 來執行程式

首先當然需要安裝 Maven,我是將 Maven 安裝在我的 Windows環境(可對外),原因是我的Spark環境不可連網, Maven請至 這裡 Download , 因為 Maven build jar 會利用到 JDK 所以也請您事先安裝好 JDK 版本,都安裝好後請使用 mvn --version 來確認是否安裝完成

這邊建議您的JDK版本不要太新,我先前使用了1.8.0.51的版本,發現我使用 mvn package時會失敗,而且記得設定 JAVA_HOME至環境變數
待會我們將在Windows環境利用 Maven 建置 java jar,之後利用 WinSCP將檔案傳至 Spark Linux 環境後執行程式

首先我在桌面建置了名為Spark的目錄,接著再建立了一個名為 java_source的目錄,此時使用記事本建立一個檔名為 pom.xml 的檔案(maven 建置時所使用的檔案)
檔案內容如下:

<project>
  <groupId>edu.berkeley</groupId>
  <artifactId>simple-project</artifactId>
  <modelVersion>4.0.0</modelVersion>
  <name>Simple Project</name>
  <packaging>jar</packaging>
  <version>1.0</version>
  <dependencies>
    <dependency> <!-- Spark dependency -->
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_2.10</artifactId>
      <version>1.5.1</version>
    </dependency>
  </dependencies>
</project>

然後依目錄結構 依序建立了 3個目錄 /src,/src/main,/src/main/java
在最後的java目錄下建立了一個檔案名為 SimpleApp.java
檔案內容如下:
/* SimpleApp.java */
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;

public class SimpleApp {
  public static void main(String[] args) {
    String logFile = "/opt/SparkLogFile.log"; // Should be some file on your system
    SparkConf conf = new SparkConf().setAppName("Simple Application");
    JavaSparkContext sc = new JavaSparkContext(conf);
    JavaRDD<String> logData = sc.textFile(logFile).cache();

    long numAs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("a"); }
    }).count();

    long numBs = logData.filter(new Function<String, Boolean>() {
      public Boolean call(String s) { return s.contains("b"); }
    }).count();

    System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
  }
}

注意一下內容 /opt/SparkLogFile.log 是我在 Linux 環境所要測試的資料目錄,請記得修改成您的檔案路徑,此程式主要是調用 Spark API 並計算文件中包含字母"a"和"b"的行數各有幾行

接著請在命令提示字元,至java_source目錄下(pom.xml所在)執行指令  mvn package
結果如下
這時會發現與 src同一層的目錄中出現了一個名為  target 的目錄點連去就有建立好的 simple-project-1.0.jar了,該檔案就是待會要在 Spark 環境中執行的 jar 檔


接著請該檔案複製至 Spark Linux環境(我是使用WinSCP工具)
我將該檔案複製至我在Linux上已事先建立的目錄/install_source/java_source下
在執行 Spark-submit之前,如果您還記得程式內容的話,我們必須指定一個file讓Spark來分析
因此我們必須依照程式所設定的路徑/opt下建立一個名為 SparkLogFile.log,我的範例內容如下
如果您上述工作都沒問題的話,就可以執行 spark-submit嘍! 本來應該要至你安裝Spark的bin目錄下執行指令,但是參考前面文章我們已經先將執行目錄設在 Path 了
於是 執行指令看看吧! (請切換至jar所在目錄)
#spark-submit --class simpleApp simple-project-1.0.jar
結果如下圖
#還記得嗎?先前的文章已經在spark-env.sh中預設了我們要執行的instance為2個,所以假設您的環境想run在4個instance下的話,可執行(記得至 spark-env.sh將 worker-instance mark掉,除非您之前尚未預設)
#spark-submit --class simpleApp  --master local[4] simple-project-1.0.jar

我的環境執行結果如下

你會發現計算結果已經出現 在 SparkLogFile.log中 含有"a"的有9行,"b"的只有1行

恭喜成功嘍XD







沒有留言:

張貼留言