FizzBuzz Advent Calendar 2017の25日目です。
Asakusa FrameworkでFizz Buzzを書いてみました。
Asakusa FrameworkはJavaでバッチアプリケーションを開発・実行する為のフレームワークです。
特徴は、大量のデータ(いわゆるビッグデータ)を処理するのに適していること(分散並列処理)と、
実行基盤としてApache Hadoop・Apache Spark・M3BPを使用できることです。(同一のソースから、それぞれの基盤で実行できるバイナリー(jarファイル等)を生成できます)
AsakusaFWは結構重厚なフレームワークなので、本来はFizz Buzzのようなシンプルなアプリケーションには向いていないのですが、面白そうなので作ってみましたw
ソースは長くなるのでそちらを参照してもらうとして、ポイントだけ挙げておきます。
入出力
AsakusaFWはファイル(HadoopのHDFS上のファイルが基本だが、ローカルファイルやAmazon S3、RDBのテーブルでもよい)を読み込んで加工し、ファイルを出力する構造になっています。
つまり、入力が全く無い状態からデータを作り出すという事は出来ません。
そこで、数値が入ったファイルを用意し、その数値をFizz/Buzzに変換したCSVファイルを出力することにします。
↓入力ファイルの例
1 2 3 4 5
↓出力結果
1,1 2,2 3,Fizz 4,4 5,Buzz
データの並び順
AsakusaFWは分散処理を行う(入力データを行毎に分割して並列で処理する)ので、基本的にはデータの並び順に依存しないコーディングをしなければなりません。
ファイル出力時にソートして出力することは出来ますが。
1行に1つの数値という入力データを変換していくFizz BuzzはAsakusaFW向きの処理と言えます。
処理のコーディング方法
AsakusaFWは処理本体をJavaで書きますが、そのメソッドの事を演算子と呼びます。
関数型プログラミング言語によるあるStream系処理に似ており、mapやfilterに渡す関数を演算子(メソッド)として定義していくイメージです。
演算子の種類はいくつかあるので、どの演算子を選ぶかがコーディングの肝になりますが、例えば以下のようになります。
private final FizzBuzzModel result = new FizzBuzzModel(); @Convert public FizzBuzzModel convertFizzBuzz(NumberModel in) { long number = in.getNumber(); result.reset(); result.setNumber(number); result.setFizzBuzzAsString(getFizzBuzz(number)); return result; }
実行時間
最初に書いたとおり、基本的にAsakusaFWは大量のデータを処理することを目的としているので、100件程度の入力データではあまり有り難味がありません^^;
AsakusaFWの実行基盤がM3BPならデータ量が数十~数百GB、SparkならTB級も扱えるので、Fizz Buzz換算だと10億件以上ですかねw
※コメント投稿者のブログIDはブログ作成者のみに通知されます