ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Asakusa Frameworkで10億件のFizz Buzz

2017-12-25 00:00:00 | PG(分散処理)

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



最新の画像もっと見る

コメントを投稿