Apache Spark 2.2環境の構築


AWSのAmazon LinuxインスタンスにApache Spark 2.2環境を構築する。Amazon Linuxだけでなく、CentOS 7でも並行して確認しているので、そちらでも問題ないだろう。Apache Sparkによってビッグデータを高速に処理、分析することが可能となる。今回はバイナリでなくソースからApache Sparkをビルドして構築する。

  1. インストールの準備
  2. Apache Sparkのインストール
  3. Apache Sparkの動作確認
  4. Scalaでアプリケーションを書く
  5. アプリケーションの実行

インストールの準備

Spark 2.2からはJava 8以上が必要となる。Amazon Linuxなら以下のコマンドでOpenJDK 8をインストールできるだろう。

# yum install java-1.8.0-openjdk-devel

元々OpenJDK 7がインストール済みでOpenJDK 8をインストールした場合、alternativesコマンドでJREの切り替えが必要となる。コマンドを実行して以下のような状況になっていれば、2を選択してJRE 8に切り替えることができる。

# alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2

尚、Sparkをビルドするためには少なくともメモリ4GB程度は必要なようだ。従って、AWSのインスタンスタイプで言えば、t2.medium程度以上が必要になる。

今回、ソースからSparkをビルドしてインストールするため、ダウンロードするのは例えば"spark-2.2.1.tgz"のようなファイル名になる。これを書いている時点で最新のSpark 2.2.1をソースからビルドする。ダウンロードしたファイルを/usr/local等任意のディレクトリに置いてtarで展開する。


Download Apache Spark
# tar zxvf spark-2.2.1.tgz

Apache Sparkのインストール

次にMavenの環境変数を設定し、mvnコマンドでSparkをビルドする。とりあえず、Hadoopは使わないので以下のコマンドでビルドすれば良いだろう。尚、Mavenは"spark-2.2.1.tgz"を展開した中に含まれているので別途インストールしなくても良い。

# export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
# cd spark-2.2.1
# ./build/mvn -DskipTests clean package

必要なファイルのダウンロード(なので、Sparkをビルドするサーバはインターネットに接続できる必要がある)等を行いながら、10分前後でSparkのビルドが完了した。以下のような表示が出ていればビルドは成功している。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 09:48 min
[INFO] Finished at: 2018-01-03T20:26:13+09:00
[INFO] Final Memory: 84M/899M
[INFO] ------------------------------------------------------------------------

Apache Sparkの動作確認

Sparkのビルドに成功したらサンプルプログラムで動作確認をしてみよう。

$ ./bin/run-example SparkPi 10

上記のサンプルプログラムを実行すると、多量のログの中に以下のような結果が得られるはずだ。

Pi is roughly 3.1416151416151417

続いてSpark Shellも起動してみよう。

$ ./bin/spark-shell
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.2.1
      /_/

Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_151)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

Spark session(spark変数として予め用意されている)を使って"README.md"ファイルを読み込んでみる。spark.read.textFileメソッドでテキストファイルを読み込むことができる。

scala> val textFile = spark.read.textFile("README.md")
textFile: org.apache.spark.sql.Dataset[String] = [value: string]

textFileメソッドからはDataFrameが返されるので、countメソッドで読み込んだ"README.md"ファイルの行数(Rowの数)を数えてみる。

scala> textFile.count()
res0: Long = 103

Scalaでアプリケーションを書く

SparkのアプリケーションはScala、Java、及びPythonで書くことができる。ここではScalaでアプリケーションを書いて実行してみる。以下はSparkのサイトにあるサンプルをほとんどそのままコピーしたものだ。処理内容はSparkのインストールディレクトリの直下にある"README.md"を読み込んでaとbの文字数をそれぞれカウントするだけのものである。

import org.apache.spark.sql.SparkSession

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "/usr/local/spark-2.2.1/README.md"
    val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
  }
}

上記を"SimpleApp.scala"としてsrc/main/scalaディレクトリに保存する。例えば、プロジェクトのディレクトリがSimpleAppならば、SimpleApp/src/main/scala/SimpleApp.scalaになる。

このアプリケーションを実行するためには、sbtでビルドしてjarにパッケージする必要がある。そのためにはプロジェクトディレクトリの直下に"build.sbt"を用意しなければならない。SimpleApp/build.sbtの内容は以下である。

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0"

sbtは以下のコマンドでインストールすることができる。

$ curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo
$ sudo yum install sbt

結果として、このようなディレクトリ・ファイル構成になっていれば良い。

.
|-- build.sbt
`-- src
    `-- main
        `-- scala
            `-- SimpleApp.scala

sbtと"build.sbt"を用意したらプロジェクトディレクトリで

$ sbt package

するとアプリケーションをビルドできる。アプリケーションのビルドが成功すると、プロジェクトディレクトリのtarget/scala-2.11ディレクトリの下に"simple-project_2.11-1.0.jar"が生成されるはずである。

アプリケーションの実行

sbtでパッケージされたjarを実行するには、spark-submitコマンドを使用する。プロジェクトディレクトリの直下で以下のコマンドを入力すれば、アプリケーションを実行できる。

$ /usr/local/spark-2.2.1/bin/spark-submit --class "SimpleApp" --master local[*] target/scala-2.11/simple-project_2.11-1.0.jar

アプリケーションの実行が成功すると、以下のような結果が得られる。

Lines with a: 61, Lines with b: 30

Spark SQLのアプリケーションについては以下にまとめた。

(2018/01/05)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2022 モバイル開発系(K) All rights reserved.
[Home]