Hadoop分散処理の性能評価(MapReduceとSpark)

こんにちは。

Hadoopでは以前よりMapReduceを用いて分散処理を行ってきましたが、

最近、オンメモリで処理を行うSparkという分散処理技術が台頭してきています。

 

いずれMapReduceは使用されなくなり、全てSparkに置き換わるのではないかとも言われています。

MapReduceとSparkではどの程度、性能に違いがあるのでしょうか。

ここではレコメンドエンジンの作成・実行を通して、MapReduceとSparkの性能評価を行います。

 

使用するHadoopクラスタは1マスター、4スレーブの5台構成。

各マシンともに低スペック (2Core, メモリ1GB)マシンを使用しています。

 

性能を比較するのは以下の6パターンです。

  1. MapReduce: スレーブ1台
  2. MapReduce: スレーブ2台
  3. MapReduce: スレーブ4台
  4. Spark: スレーブ1台
  5. Spark: スレーブ2台
  6. Spark: スレーブ4台

 

 

レコメンドエンジンの作成

 

レコメンドエンジンとは何でしょうか。

Amazonや楽天で欲しい物を探していると下の方に「この商品を買った人はこんな商品も買っています」とか「お客様へのおすすめ商品」が表示されると思います。

このように、「どんなユーザーに対してどんな商品をおすすめするべきか」という処理を行うものがレコメンドエンジンです。

 

今回はユーザーの購入履歴から、おすすめ書籍を紹介するためのレコメンドエンジンをユーザーベース協調フィルタリング方式を使用して作成してみます。

まずは、少ないデータからアルゴリズムを考えていきましょう。

 

使用するデータ

[ユーザーデータ – 4件] 田中、鈴木、佐藤、石井の四人

[書籍データ – 4件] サスペンス、ミステリー、ラブストーリー、コメディの四冊

[購入履歴 – 8件] 田中がサスペンスを購入。
田中がラブストーリーを購入。
鈴木がサスペンスを購入。
鈴木がコメディを購入。
佐藤がサスペンスを購入。
佐藤がミステリーを購入。
佐藤がラブストーリーを購入。
石井がミステリーを購入。

 

レコメンドエンジン作成手順

  1.  購入履歴を集計し、数値化する。
  2. ユーザー毎の購入割合を計算する。
  3. ユーザー間の関係性を見るために、Jaccard係数を計算する。
  4. 購入割合とJaccard係数から書籍のスコアを算出する。

 

上記手順により、各ユーザーにレコメンドする書籍は

田中 = ミステリー

鈴木 = ラブストーリー

佐藤 = コメディ

石井 = サスペンス

となります。

 

 

大量データによるレコメンドエンジン作成

流石にユーザー4人に書籍4冊程度のデータでは性能評価には使用できませんので、もう少しデータを増やしてみたいと思います。

 

使用するデータ

[ユーザーデータ – 1,000人]

[書籍データ – 3,000冊]

[購入履歴 – 50,000件]

 

レコメンドエンジンの作成手順は上で行った事と同じです。

 

ユーザー同士の関係性を調査するのに 1,000人 × 1,000人で 1,000,000回の処理が必要。

推薦する書籍を見つけるために、3,000冊 × 1,000人 で3,000,000回の処理が必要。

さらに各々の処理で上記関係性データとのマッチングも必要。

一台のマシンで行うと約2時間程度掛かる処理です。

 

 

レコメンドエンジン実行結果 & 性能評価結果

MapReduce スレーブ1台 7,264秒
スレーブ2台 3,299秒
スレーブ4台 1,560秒
Spark スレーブ1台 626秒
スレーブ2台 443秒
スレーブ4台 266秒

 

MapReduceとSparkでは約5~10倍の性能差がありました。

スレーブマシンのメモリ数とCore数を増やし、同時実行するタスク数を増やしていけばさらなる速度の改善が見込めます。