VPC環境で利用できます。
本ガイドでは、Spark Scala Jobを作成した後、Cloud Hadoopクラスタに提出する方法について説明します。
Scalaコードの作成とコンパイル
Scalaで Sparkアプリケーションを作成し、jarファイルとしてパッケージ化する方法には、以下のような2つの方法があります。
1.ターミナルで Scalaを使用する
ターミナルで HelloScalaを出力する Scalaコードを作成し、コンパイルして jarファイルにパッケージ化する例を挙げて説明します。
Scalaバイナリファイルのダウンロード
Scalaバイナリをダウンロードして圧縮を解凍します。
MacOSで Homebrewを使用している場合は、以下のようにインストールできます。
brew install scala
環境変数設定
次のコマンドを使用して、実行ファイル(例: .bashrc)に SCALA_HOME 環境変数を設定し、PATHに $SCALA_HOMEを追加します。
export SCALA_HOME=/usr/local/share/scala
export PATH=$PATH:$SCALA_HOME/
Sparkアプリケーション作成
Sparkアプリケーションを作成する方法は、次の通りです。
- scala REPLを実行して、
scalaを実行します。
❯ scala
# Welcome to Scala version ...
# Type in expressions to have them evaluated.
# Type :help for more information.
# scala>
- 次のように HelloWorld.scala classを作成して保存します。
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
scala> :save HelloWorld.scala
scala> :q
- 以下のコマンドを使用して
scalacにコンパイルします。
❯ scalac HelloWorld.scala
lsコマンドを使用して、正常にコンパイルされたかを.classファイルで確認します。
❯ ls HelloWorld*.class
HelloWorld$.class HelloWorld.class
jarファイル作成
jarファイルを作成する方法は、次の通りです。
jarコマンドを実行するには、Java SE、JREがインストールされている必要があります。
- HelloWorld*.classファイルがあるディレクトリに移動した後、次のコマンドを使用してクラスファイルを jarファイルにパッケージ化します。
❯ jar cvfe HelloWorld.jar HelloWorld HelloWorld*.class
added manifest
adding: HelloWorld$.class(in = 670) (out= 432)(deflated 35%)
adding: HelloWorld.class(in = 645) (out= 524)(deflated 18%)
- パッケージ化された jarファイル内で、HelloWorld classがアプリケーションの entry pointとして設定されているかを MANIFEST.MFで確認します。
❯ unzip -q -c HelloWorld.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_181 (Oracle Corporation)
Main-Class: HelloWorld # entry point
2.IntelliJ SBTプラグインを使用する
本ガイドでは、Sparkアプリケーションの開発およびデバッグを行うための環境を IntelliJに設定し、Hello Scalaという WordCount Jobを構築する方法を例に挙げて説明します。
- ビルドマネージャ: SBT
- 作成環境の例: Windows OS、IntelliJ Ultimate 2022.1.4
プロジェクト作成
プロジェクトを作成する方法は、次の通りです。
IntelliJを実行します。
-
左側の Pluginsメニューから Scalaを検索してインストールします。

-
プラグインを反映させるには再起動が必要です。[Restart IDE] ボタンをクリックして、IntelliJを再起動します。

-
ホーム画面左側のメニューから Projectsをクリックし、New Projectをクリックします。

-
次のように Scalaと sbtを選択し、 [Create] ボタンをクリックします。
- プロジェクト名: WordCountに指定
- Scalaと sbtのバージョンを選択

-
プロジェクトが正常に作成されたか確認します。
- プロジェクトが作成されると、デフォルトでは次のような構造のディレクトリおよびファイル情報を確認できます。
- .idea: IntelliJ構成ファイル
- project: コンパイルに使用されるファイル
- src: ソースコード。アプリケーションコードのほとんどは src/mainに配置する必要がある。src/testはテストスクリプトのためのスペース
- target: プロジェクトをコンパイルするとこの場所に保存
- build.sbt: SBT構成ファイル

- プロジェクトが作成されると、デフォルトでは次のような構造のディレクトリおよびファイル情報を確認できます。
SBTライブラリのインポート
IntelliJが Sparkコードを認識するには、spark-coreライブラリとドキュメントをインポートする必要があります。
- spark-coreライブラリは特定のバージョンの Scalaと互換性があるため、ライブラリをインポートする場合は spark-coreと Scalaのバージョンをそれぞれご確認ください。
-
mvn repositoryで、spark-coreライブラリと Artifact Idと併せて互換性のある Scalaのバージョンを確認します。

-
Target > build.sbtをクリックし、スクリプトウィンドウに以下の内容を追加します。
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
- ライブラリが正常にインポートされたか、Buildコンソールで確認します。

SBTでライブラリをインポートする際は、以下の構文(syntax)を使用してください。
Group Id %% Artifact Id % Revision
Sparkアプリケーション作成
ここでは、シェイクスピアのソネットのテキストファイル(shakespeare.txt)をデータセットとして使用し、ソネットに含まれる単語を数える WordCountアプリケーションの作成方法を例に挙げて説明します。
-
shakespeare.txtをダウンロードして src/main/resourcesに保存します。
- Cloud Hadoopクラスタでこのアプリケーションを実行する際は、S3バケットまたは HDFSにデータセットをアップロードして使用します。

- Cloud Hadoopクラスタでこのアプリケーションを実行する際は、S3バケットまたは HDFSにデータセットをアップロードして使用します。
-
src > mainを選択してディレクトリを拡張し、scalaディレクトリを右クリックして New > Scala Classをクリックします。
-
WordCount/src/main/scalaの下位に新しいクラスを作成します。
- Kind: Object

- Kind: Object
-
正しく設定されているか確認するため、WordCount.scalaに以下のサンプルコードを作成して実行します。
object WordCount {
def main(args: Array[String]): Unit = {
println("This is WordCount application")
}
}
-
結果が正常に出力されているか確認します。

-
WordCount.scalaに適用していたサンプルコードを削除した後、シェイクスピアのソネットのテキストファイルの単語数を数えるコードを以下のように作成します。
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]) : Unit = {
//Create a SparkContext to initialize Spark
val conf = new SparkConf()
conf.setMaster("local")
conf.setAppName("Word Count")
val sc = new SparkContext(conf)
// Load the text into a Spark RDD, which is a distributed representation of each line of text
val textFile = sc.textFile("src/main/resources/shakespeare.txt")
//word count
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.foreach(println)
System.out.println("Total words: " + counts.count())
counts.saveAsTextFile("/tmp/sonnetWordCount")
}
}
Master URLs
Sparkのリリース環境によって、Master URLが異なります。
-
Local(pseudo-cluster):
local、local[N]、local[*](使用する thread数に応じて分類、「*」は JVMが使用可能な最大数のプロセッサ分だけ threadsを使用) -
Clustered
Spark Standalone:spark://host:port,host1:port1...
Spark on Hadoop YARN:yarn
Spark on Apache Mesos:mesos://
- WordCount.scalaを実行して出力結果を確認します。

jarファイル作成
- Object Storageのバケットにデータセットをアップロードした後、ソースコード内の resourceファイルパスを次のように変更します。
- データセットを HDFSにアップロードして使用する場合は、
s3a://の代わりにhdfs://を使用します。
- データセットを HDFSにアップロードして使用する場合は、
// FROM
conf.setMaster("local")
// TO
conf.setMaster("yarn-cluster")
// FROM
val textFile = sc.textFile("src/main/resources/shakespeare.txt")
// TO
val textFile = sc.textFile("s3a://deepdrive-hue/tmp/shakespeare.txt")
// FROM
counts.saveAsTextFile("/tmp/sonnetWordCount");
// TO
counts.saveAsTextFile("s3a://deepdrive-hue/tmp/sonnetWordCount");
本ガイドは Spark 1.6を基準としているため、conf.setMaster()を yarn-clusterに指定する必要があります。Spark 2からは yarnで使用可能です。
- ターミナルコンソールで次のコマンドを使用して、アップデートしたコードを Cloud Hadoopクラスタに提出できるよう、compiled jarとしてパッケージ化します。
- jarファイルには、アプリケーションコードと build.sbtで定義されたすべての dependenciesが含まれています。
sbt packageコマンドは$PROJECT_HOME/target/scala-2.11の下位に wordcount_2.11-0.1.jarファイルを作成します。
> cd ~/IdeaProjects/WordCount # PROJECT_HOME
> sbt package

Cloud Hadoopクラスタへの Spark Job提出
ローカルで作成した Sparkアプリケーション(.jar)を Cloud Hadoopにリリースして実行する方法について説明します。
Object Storageへの jarsアップロード
Hueの S3ブラウザまたは Object Storageコンソールを使用して、shakespeare.txtと jarを Object Storageバケットにコピーします。
- Hueへのアクセスおよび使用方法の詳細は、Hue を使用するガイドをご参照ください。
- Object Storageバケットに関する詳細は、Object Storage の概要ガイドをご参照ください。

Job提出
jarファイルをクラスタに提出する2つの方法について説明します。
spark-defaults.confに、以下のような propertyが正しく設定されている必要があります。
spark.hadoop.fs.s3a.access.key <OBJECT-STORAGE-ACCESS-KEY>
spark.hadoop.fs.s3a.endpoint kr.objectstorage.ncloud.com
spark.hadoop.fs.s3a.secret.key <OBJECT-STORAGE-SECRET-KEY>
-
Hueでの Spark Submit Jar利用

-
Sparkクライアントノードからの提出
- Sparkクライアントがインストールされているクラスタノードで、次のように
spark-submitコマンドを実行します。
spark-submit --class WordCount --master yarn-cluster --deploy-mode cluster s3a://deepdrive-hue/tmp/wordcount_2.11-0.1.jar
- Jobの実行が完了したら、以下のように結果が指定したバケットパス内に保存されているか確認します。

Deploy modeはリリース環境においてドライバ(SparkContext)が実行される場所によって決まります。モードには以下のようなオプションがあります。
client(デフォルト値): Sparkアプリケーションが実行されているマシン上でドライバが実行cluster: クラスタ内のランダムなノードでドライバが実行
spark-submit コマンドの --deploy-mode CLIオプション、または Spark propertyの構成で spark.submit.deployModeに変更できます。