LoginSignup
14
14

More than 5 years have passed since last update.

Spark(Java)で"Hello World !" on Eclipse

Last updated at Posted at 2016-02-17

最近なんだかSparkっていうのがすごいらしい。
ちょっと試してみたいけどHadoopクラスタとか組むの大変だし。。。
と感じている方も多いのではないでしょうか。
大丈夫です。SparkはローカルPC上でもちゃんと動きます。

今回はEclipseでSparkアプリを開発、実行する手順を紹介します。
もちろん普通のJavaアプリケーションと同様にデバッグ(ステップ実行)することもできます。

OSはWindows10で説明しますが、MacやLinuxでもほとんど同じ手順でいけると思います。
(そもそもOSやEclipseについては詳しく説明していません)

まずは定番(?)の「Hello World !」をコンソールに表示するSparkアプリケーションを書いて動かしてみましょう。

【1】 インストール

ローカルPC(Windows 10 Home 64bit)上に開発環境をインストールします。

[1-1] Java SE 8(1.8) 64bit インストール

OracleのサイトからJavaをダウンロードしてインストールします。

[1-2] Eclipse Pleiades All in One 4.5.1 Java 64bit Standard Edition インストール

PleiadesのサイトからEclipseをダウンロードしてインストールします。
解凍したeclipseフォルダを適当なフォルダ1にコピーします。

【2】 セットアップ

Eclipseに開発環境をセットアップします。
eclipseフォルダのeclipse.exeをクリックしてEclipseを起動させます。

[2-1] プロジェクト作成

パッケージエクスプローラーの白い背景を右クリックし、「新規」→「その他」をクリックします。
「Maven プロジェクト」を選択して次へ進み、「シンプルなプロジェクトの作成」をチェックして次へ進みます。
適当にグループIdとアーティファクトIdを入力し、完了します。
新規Mavenプロジェクト.jpg

[2-2] pom.xmlファイル修正

プロジェクトの直下にあるMavenビルドファイルpom.xmlにSparkの依存関係を追加します。

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hoge.spark.examples</groupId>
    <artifactId>spark-java-examples</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spark-java-examples</name>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.10</artifactId>
            <version>1.6.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

[2-3] Maven実行

Mavenのeclipse:eclipseゴールを実行すると、依存関係やクラスパスが設定されます。これ、最高に便利です。

パッケージエクスプローラーのpom.xmlファイルを右クリックし、「実行」→「Mavenビルド」をクリックすると、依存jarをダウンロードし2、クラスパスが設定されます。
maven実行.jpg

更新された内容を反映するため、パッケージエクスプローラーのspark-java-examplesプロジェクトを右クリックし、「リフレッシュ」をクリックします。

「プロジェクト構成がpom.xmlの最新ではありません」みたいな意味不明なエラーが出るので、パッケージエクスプローラーのspark-java-examplesプロジェクトを右クリックし、「Maven」→「プロジェクトの更新」→「OK」をクリックします。

【3】 Hello World ! 実装&実行

[3-1] パッケージ作成

パッケージエクスプローラーのsrc/main/javaフォルダを右クリックし、「新規」→「パッケージ」をクリックします。
「名前」に「com.hoge.spark.examples」を入力し、完了します。

[3-2] クラス実装

パッケージエクスプローラーのsrc/main/javaフォルダの下にあるcom.hoge.spark.examplesパッケージを右クリックし、「新規」→「クラス」をクリックします。

「名前」に「HelloWorld」を入力し、「public static void main(String[] args」にチェックを入れて、完了します。

HelloWorldクラスを以下のように実装します。

HelloWorld.java
package com.hoge.spark.examples;

import java.util.Arrays;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

public class HelloWorld {
    public static void main(String[] args) {
        try (JavaSparkContext sc = new JavaSparkContext("local", "Hello World")) {
            JavaRDD<String> rdd = sc.parallelize(Arrays.asList("Hello", "World", "!"));
            rdd.foreach(val -> System.out.print(val + " "));
        }
    }
}

[3-3] クラス実行

パッケージエクスプローラーのHelloWorldクラスを右クリックし、「実行」→「Javaアプリケーション」をクリックします。
コンソールビューに大量の赤文字と黒文字「Hello World !」が表示されます。
コンソール出力.jpg

赤文字がジャマなので、ログの出力レベルをINFOからERRORに変更しておきます。
パッケージエクスプローラーのsrc/main/resourcesフォルダを右クリックし、「新規」→「ファイル」をクリックします。
「ファイル名」に「log4j.properties」を入力し、完了します。
log4j.propertiesファイルに以下の内容を書きます。

log4j.properties
log4j.rootCategory=ERROR, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

もう一度HelloWorldクラスを実行すると、今度は「Hello World !」だけが出力されるはずです。

【4】 おまけ winutils.exeが見つからない問題

今回は元になるデータを
JavaRDD<String> rdd = sc.parallelize(Arrays.asList("Hello", "World", "!"));
のように、プログラム内で生成したので問題ありませんでしたが、
JavaSparkContext.textFile("ファイルパス");
のようにファイルからデータを読み込むと、winutils.exeが見つからないというエラーが発生します。

16/02/18 21:17:24 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278)

winutils.exeはWindows上でHadoopを動かすときに使うのですが、どうやらSparkでファイルを読み込む際にこの実行ファイルを探しにいって、見つからずにエラーが起きているようです。

この問題を解決するにはwinutils.exeをローカルPC上に置いて読めるようにしてやる必要があります。

あらかじめC:\dev\hadoop\binというフォルダを作っておきます。
hadoop-winutils-2.6.0.zipをダウンロードし、winutils.exeファイルを取り出してC:\dev\hadoop\binフォルダの中にコピーします。

次にOSの環境変数HADOOP_HOMEを設定するか、Javaのシステムプロパティhadoop.home.dirを設定します。
ローカルPC環境とクラスタ環境の両方でちゃんと動くように、OSの環境変数を使ったほうがいいでしょう。
環境変数HADOOP_HOMEを作って値に「C:\dev\hadoop」を設定し、Eclipseを再起動します。

HelloWorldクラスを実行すると、winutils.exeが見つからないエラーは起きなくなっているはずです。

【5】 まとめ

これでローカルPC上でSparkアプリケーションを開発する環境が整いました。
あとはRDDなどのSparkのAPIを使い込んで慣れていくだけです。
今回のコードはGitHubにあげておきましたので、手順を実行するのも面倒くさい!という方はそちらを使ってみてください。
今後はRDDのサンプルコードを追加していこうかなと思っていますので、よろしくお願いします。


  1. トラブルを避けるため、スペースや全角文字を含まない短めのパスがベターです。 

  2. 処理の状況はコンソールビューに表示されます。初回はダウンロードに時間がかかります。 

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14