Quantcast
Channel: ひしだまの変更履歴
Viewing all articles
Browse latest Browse all 262

Asakusa Frameworkで10億件のFizz Buzz

$
0
0

FizzBuzz Advent Calendar 2017の25日目です。
Asakusa FrameworkでFizz Buzzを書いてみました。

Asakusa FrameworkはJavaでバッチアプリケーションを開発・実行する為のフレームワークです。
特徴は、大量のデータ(いわゆるビッグデータ)を処理するのに適していること(分散並列処理)と、
実行基盤としてApache Hadoop・Apache SparkM3BPを使用できることです。(同一のソースから、それぞれの基盤で実行できるバイナリー(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


Viewing all articles
Browse latest Browse all 262

Trending Articles