AWS Glue ETLライブラリを使ってローカルでSparkを動かす

AWS Glueでは、公式から提供されているライブラリを利用して、GlueジョブのスクリプトをローカルPCで開発することができます。これを利用して、ローカルでSparkを動かしてみます。
2020.01.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Glueでは、公式から提供されているライブラリを利用して、GlueジョブのスクリプトをローカルPCで開発することができます。 これを利用して、ローカルでSparkを動かしてみます。

個人的趣味で言語はScalaにしています。Pythonを使いたい場合は下記の記事が参考になります。

AWS Glueをローカル環境で実行してみた

準備

AWS Glueの公式ドキュメントを参考に環境を構築します。

ライブラリのダウンロード

まずはMavenとSparkをダウンロードして展開します。今回はGlueバージョン1.0を使用します。

$ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-common/apache-maven-3.6.0-bin.tar.gz
$ tar zxvf apache-maven-3.6.0-bin.tar.gz -C /path/to/maven

$ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.8.tgz -C /path/to/spark

環境変数を設定します。PATHはMavenとSparkの両方の配下に通しておきます。

$ export SPARK_HOME=/path/to/spark/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8
$ export PATH=/path/to/maven/apache-maven-3.6.0/bin:$SPARK_HOME/bin:$PATH

pom.xmlの作成

公式ドキュメントに載っているpom.xmlをコピーして足元に保存します。今回はGlueバージョン1.0を使用するので、AWSGlueETLのバージョン( Glue version と書いてあるところ)は1.0.0に変更します。

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.amazonaws</groupId>
    <artifactId>AWSGlueApp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <description>AWS Glue ETL application</description>

        <properties>
        <scala.version>2.11.1</scala.version>
        </properties>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>AWSGlueETL</artifactId>
			
            <version>1.0.0</version>
			
        </dependency>
    </dependencies>
    
    ...(以下略)

※バージョンを1.0.0にしたpom.xml全体をこちらに置いてあります。

Spark shellを動かしてみる

ダウンロードしたSparkのライブラリにはspark-shellが入っていますので、そのまま起動することができます。

$ spark-shell
20/01/21 19:27:44 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://192.168.10.108:4040
Spark context available as 'sc' (master = local[*], app id = local-1579602475404).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/
         
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191)
Type in expressions to have them evaluated.
Type :help for more information.

scala>

簡単な処理を書いてみます。以下のように動作します。

scala> val rdd = sc.parallelize(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> rdd.reduce(_ + _)
res0: Int = 55

ビルドして実行してみる

Mavenでビルド、実行することもできます。ソースコードはScalaの標準的なパスに従ってsrc/main/scala/に置きます。

src/main/scala/SparkSample.scala

import org.apache.spark.SparkContext

object SparkSample {
  def main(args: Array[String]): Unit = {
    val sc = new SparkContext("local", "example")
    val data = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val rdd = sc.parallelize(data)
    val sum = rdd.reduce(_ + _)
    println(s"sum=$sum")
    sc.stop()
  }
}

以下のようにビルド、実行します。-Dexec.mainClassで実行するコードのクラス名を指定します。

$ mvn package
$ mvn exec:java -Dexec.mainClass="SparkSample" -Dexec.args="--JOB-NAME SparkSample"

まとめ

AWS Glueで提供されているライブラリを使ってローカルでSparkを動かしてみました。 個人的にAWS Glueを使いたいけどそもそもSparkが分からん、という状態だったのでやってみましたが、意外とすんなり動きました。

なお、試したソースコード全体は以下に置いてあります。

https://github.com/ktsmy/study-aws-glue