EMRのSparkでWordCount

BODY:

EMRではSparkでファイルを開く際には*が使えるみたいだ 

こんな感じのBOWを数えるスクリプトを作成

s3にはgzで固められたファイルがたくさんある場合には

このような指定で起動すると全ファイルを解凍しながら計算し、outputへ結果を保存します

EMRでSparkSQLサンプル

SparkからHiveが使いづらいというか使えない?のでSparkSQLを使ってみました。

そこそこ試行錯誤する必要があったのでメモです。

データファイル

のフォーマットのファイルを用意しておきます。こんな感じ。

これをS3へアップしておきます

build.sbt

こんな感じで記述します。build assemblyでエラーが出るのでこんな記述にしています。

ちなみにproject/assembly.sbtはこれ

SqlSample.scala

http://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-15-to-16

この辺りを参考に

build

これで作成したJarを同じくS3へアップします

EMR

今までと同様にEMRを作成し、AddStepでSparkApplicationを追加します。Jarは先ほどアップしたものを指定します

Spark-submit options

Arguments

ここには出力ファイルが入ります

じっこすればOutputにMapで表現されたデータが保存されます

EMRでSparkサンプル

emr-4.2.0をベースにAdvancedOptionでSpark1.5.2を追加しクラスターを作成しておきます

今回はPiをモンテカルロシミュレーションで計算するSpark付属のサンプルプログラムをちょっと改造して使用します

build.sbt

build.sbtはこんな感じ

SparkPi

SparkConfを作成する際のここがポイントです

ビルド

Jarファイルが作成されたらS3にアップしておきます

EMRでの実行

AWSコンソールからEMRで作成したクラスターを選択し、AddStepで先ほどアップしたJarファイルを指定し追加します

step typeにはSpark applicationを選択、

Spark-submit optionsに

Argumentsに出力を保存するS3のロケーションを入れておきます。すでにフォルダがあるとエラーになるので注意

実行後、出力先にファイルが作成されます

AmazonS3にjavaSDKを用いて文字列を書き込む

ポイントは2回InputStreamを作成することです。

http://stackoverflow.com/questions/8351886/amazons3-putobject-with-inputstream-length-example

docker buildのエラー

dockerで今までうまくいっていたBuildが突然落ちるようになったりすることがあります

こういう時には一度キャッシュをクリーンすれば治ります

EMRでHadoopのJavaサンプル

こんな感じでディレクトリ作成します

pom.xmlを作成します

eclipseで読み込めるようにします

Javaファイルはこんな感じ

WordCountMain.java

WordCountMapper.java

WordCountReducer.java

Jar作成

AWS Console

  • まずEMRを作成します
  • Cleate Clusterから Go to advanced optionsへ
  • Hardware ConfigurationでEC2 instance typeを必要に応じ変更。m1.mediumが最安かな?
  • VPCに対応したのでVPC内に作成したい場合にはここで選択
  • その他、キーとかSecurityGroupなどを適宜設定します
  •  その後、作成したJarをS3へコピーしておきます
  • WordCount用のファイルをS3へコピーします

Stepsから起動します

  • StepTypeはCustomJARを選択
  • JAR locationに先ほどコピーしたJarファイルのS3のLocationを入力
  • Argumentsに

ちなみにouputディレクトリをあらかじめ作成しておくとエラーになります