この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS Glueでは、公式から提供されているライブラリを利用して、GlueジョブのスクリプトをローカルPCで開発することができます。 これを利用して、ローカルでSparkを動かしてみます。
個人的趣味で言語はScalaにしています。Pythonを使いたい場合は下記の記事が参考になります。
準備
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が分からん、という状態だったのでやってみましたが、意外とすんなり動きました。
なお、試したソースコード全体は以下に置いてあります。