8t's BBR

よくつまったあれこれをメモ

HiBenchを使ってみた

数ヶ月ぶりの更新。
先々月、就活も無事終わりました。
ぼちぼち研究もやり始めていこうということで、今回は研究で使うことになったHiBenchの導入時の話です。

※以下、HiBench 6.0時点の話。

HiBenchはビッグデータ用のベンチマークスイートです。
さまざまなビッグデータフレームワーク(Hadoop、Spark)を速度、スループット、システムリソースの利用率の点で評価するのに役立ちます。


オープンソースで公開されており、以下から利用できます。
github.com


Build

Build方法も利用目的別に丁寧に説明してくれています。
HiBench/build-hibench.md at master · intel-hadoop/HiBench · GitHub


例えば、私みたいにSparkとかを利用していなくて、Hadoop用のだけでいい場合は

mvn -Phadoopbench -Dspark=2.1 -Dscala=2.11 clean package

とするだけ。

BuildにはMahoutやNutchのような3rdパーティーのツールを使っているので時間がかかると書かれていますが、Mavenの設定とかをしっかりしておかないと、以下のようにかなり時間かかった挙句に失敗したりします。

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] hibench ........................................... SUCCESS [30:19.090s]
[INFO] hibench-common .................................... FAILURE [1:21:40.787s]
[INFO] HiBench data generation tools ..................... SKIPPED
[INFO] hadoopbench ....................................... SKIPPED
[INFO] hadoopbench-sql ................................... SKIPPED
[INFO] mahout ............................................ SKIPPED
[INFO] PEGASUS: A Peta-Scale Graph Mining System ......... SKIPPED
[INFO] nutchindexing ..................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

※設定を適切にしてあげたら、十数分で終わりました。


BenchMarkを実行

※今回はHadoopベンチを例に説明します。Spark用とかは公式を参照してください。

前準備

Python 2.x(>= 2.6)以上を用意
・Hibenchのレポート用にbcを用意
・サポートするHadoopのバージョンを用意(Apache Hadoop 2.x, CDH5.x, HDPのいずれか)
HDFS、YARNデーモンを起動させておく


余談ですが、Apachehadoop-3.0.0-alpha4での動作も確認しました。
(追記)
一部(wordcount, terasort, sort, sleep)のみ動作を確認。
その他のワークロードは、javaのIllegalAccessErrorにより失敗するみたい。
他にも同じような方がいるっぽいので、これはサポートを待つしかないかも。
https://github.com/intel-hadoop/HiBench/issues/466

(更に追記)
IllegalAccessErrorは、対象ソースのアクセス修飾子いじれば解決できるっぽい。
dfsioeは2.x系の時からあるメソッド(名前忘れた)が削除されているため、それをもう一度組み込めば良い。
ml系のテストはmahoutのバージョンをあげたりとかで解決できました。
色々調整した結果、micro系全てとbayesとkmeansの動作は確認できました。

hadoop.confファイルの作成

これは用意されているテンプレートファイルをコピーしてくるだけです。

cp conf/hadoop.conf.templete conf/hadoop.conf
hadoop.confの設定
プロパティ 説明 apache hadoopでの例
hibench.hadoop.home hadoopのインストール場所 /home/user/hadoop-2.7.2
hibench.hadoop.executable hadoopの実行可能ファイルのパス /home/user/hadoop-2.7.2/bin/hadoop
hibench.hadoop.configure.dir hadoopの設定ファイルのパス /home/user/hadoop-2.7.2/etc/hadoop
hibench.hdfs.master HiBenchデータを置いておくHDFSのパス hdfs://localhost:9000/user/username
hibench.hadoop.release Hadoopのリリースプロバイダ。apacheかcdh5かhdpのいずれかを設定する。 apache

4つめのhibench.hdfs.masterプロパティのhdfs://localhost:9000/の部分はhadoop本体のcore-site.xmlで設定しているfs.defaultFSの値と同じにすると良いかもしれない。私の環境では、localhostのままだとうまくいかなかった。

ワークロードの実行

例えば、wordcountのワークロードを実行する時は、以下のようにするだけ。

bin/workloads/micro/wordcount/prepare/prepare.sh
bin/workloads/micro/wordcount/hadoop/run.sh

conf/benchmarks.lstとconf/frameworks.lstにある全てのワークロードを実行する場合は

bin/run_all.sh

とするだけ。

レポート
report/hibench.report ワークロード名、実行時間、データサイズ、クラスタごとのスループット、ノードごとのスループットなど、要約されたワークロードレポート
(workload)/hadoop/bench.log クライアント側の未加工のログ
(workload)/hadoop/monitor.html システム使用率モニター結果
(workload)/hadoop/conf/(workload).conf このワークロード用に生成された環境変数の設定一覧
その他

入力データサイズやその他もチューニングもできる。conf/hibench.confをいじると良い。


おまけ(HiBenchのワークロード)

では、最後に、Readmeで説明されているものを和訳(機械学習とかの専門知識ないので誤訳あるかも)しただけのものでものっけておきます。


HiBenchには19個のワークロードがあり、それらは以下の6個のカテゴリー(micro, machine learning, sql, websearch, streaming)に分けられています。


Micro Benchmark

  1. Sort (sort)
    RandomTextWriterで生成されたテキスト入力データをソート。

  2. WordCount (wordcount)
    RandomTextWriterで生成された入力データ内の各単語の出現をカウント。

  3. TeraSort (terasort)
    Jim Grayによって作成された標準ベンチマーク
    入力データは、Hadoop TeraGenサンプルプログラムによって生成される。

  4. Sleep (sleep)
    フレームワークスケジューラをテストするために、各タスクで秒単位でスリープ。

  5. enhanced DFSIO (dfsioe)
    HadoopクラスタHDFSスループットを、書き込みと読み取りを同時に実行する多数のタスクを生成することによってテスト。
    各マップタスクの平均I / Oレート、各マップタスクの平均スループット、およびHDFSクラスタの集約スループットを測定できる。
    ※注:Spark対応の実装はなし。


Machine Learning

  1. Bayesian Classification (bayes)
    Spark-MLLib / Mahoutの例で実装されたNaiveBayesian Classificationのベンチマーク

  2. K-means clustering (kmeans)
    Mahout 0.7 / Spark-MLlibのK-means(知識発見とデータマイニングのためのよく知られたクラスタリングアルゴリズムクラスタリングをテスト。
    入力データセットは、Uniform DistributionおよびGuassian Distributionに基づいてGenKMeansDatasetによって生成される。

  3. Logistic Regression (lr)
    Spark-MLLibの例で実装されたロジスティック回帰のベンチマーク。Logistic RegreesionはLBFGSによって実現。入力データセットは、ランダムバランス決定ツリーに基づいてLabeledPointDataGeneratorによって生成される。 カテゴリデータ、連続データ、バイナリデータなど、3種類のデータ型が含まれる。

  4. Alternating Least Squares (als)
    Spark-MLLibの例で実装された交互最小二乗のベンチマーク。 入力データ・セットは、商品レコメンデーションシステムのためのRating Date Generatorによって生成される。


SQL

  1. Scan (scan)

  2. Join (join)

  3. Aggregate (aggregation)

    これらはSIGMOD 09の論文「A Comparison of Approaches to Large-Scale Data Analysis」とHIVE-396に基づいて開発されており、このホワイトペーパーで説明している一般的なOLAPクエリを実行するHiveクエリ(集計および結合)が含まれる。その入力は、Zipfian分布に従ってハイパーリンクを含むWebデータを自動的に生成。


Websearch Benchmarks

  1. PageRank (pagerank)
    Spark-MLLib / Hadoop(ペガサス2.0に含まれる検索エンジンランキングベンチマーク)の例で実装されたPageRankアルゴリズムベンチマーク。データソースは、ハイパーリンクがZipfian分布に従うWebデータから生成。

  2. Nutch indexing (nutchindexing)
    一般的なオープンソースApacheプロジェクト)検索エンジンであるNutchの索引付けサブシステムをテスト。ハイパーリンクと単語の両方がZipfian分布に従って対応するパラメータを持つWebデータ(自動的に生成される)を使用。 Webページのテキストを生成するために使用されるdictは、デフォルトのlinux dictファイル。


Graph Benchmarks

  1. NWeight (nweight)
    Spark GraphXとpregelによって実装される反復グラフ並列アルゴリズム。nホップ離れた2つの頂点間の関連付けを計算する。


Streaming Benchmarks

  1. Identity (identity)
    Kafkaから入力データを読み取り、Kafkaに結果を即座に書き込む。複雑なビジネスロジックは必要なし。

  2. Repartition (repartition)
    Kafkaから入力データを読み取り、より多くのまたはより少ないパーティション・ステートを作成することによって並列性のレベルを変更する。ストリーミングフレームワークにおけるデータシャッフルの効率をテスト。

  3. Stateful Wordcount (wordcount)
    数秒ごとにKafkaから累積的に受け取った単語をカウントします。 これにより、ストリーミングフレームワークのステートフルオペレータパフォーマンスとCheckpoint / Ackerコストがテストされる。

  4. Fixwindow (fixwindow)
    ウィンドウベースの集約を実行し、ストリーミングフレームワークでのウィンドウ操作のパフォーマンスをテスト。