Author Archives: S.R

2017-12-07

SparkのWebUIでモニタリング

皆さん

こんにちは、GMOアドマーケティングのS.Rです。

SparkのProgramを開発する上で、Performanceの改良やInstanceの設定のTuningはかなり重要です。

これらのチューニングはSparkのWebUIを使えばかなり簡単に制御できます。

そこで、今回はSparkのWebUIを皆さんへ紹介致します。

※この記事を理解するには、Spark、Hadoop、Linuxのshellコマンドの基本知識が必要です。

1 Sparkとは?

Sparkの概要は以下のWikipediaの記事を参考にして下さい。

Apache Sparkはオープンソースのクラスタコンピューティングフレームワークである。カリフォルニア大学バークレー校のAMPLabで開発されたコードが、管理元のApacheソフトウェア財団に寄贈された。Sparkのインタフェースを使うと、暗黙のデータ並列性と耐故障性を備えたクラスタ全体をプログラミングできる(Apache Spark、2014年5月30日、ウィキペディア日本語版、https://ja.wikipedia.org/wiki/Apache_Spark)

 

2 Sparkのインストール:

  1. Sparkの公式ダウンロードサイトで任意のバージョンをダウンロードします。
    今回は例として最新のSpark2.2.0、Pre-bulit版をダウンロードしました。
  2. Sparkのモードを選びます。Sparkには3つの起動モードがあります。
    1. WorkerNodeがない状態で起動します(Standalone Deploy Mode)。
      今回は例としてこのモードで説明します。
    2. Yarnで起動します。YARN(Yet Another Resource Negotiator )は、Hadoopクラスタのリソース管理、ジョブスケジューリングを担当するモジュールです(YARN、2014年5月30日、ウィキペディア日本語版、https://ja.wikipedia.org/wiki/Apache_Hadoop#Yet_Another_Resource_Negotiator_.28YARN.29)
    3. Mesosで起動します。Mesosはカリフォルニア大学バークレー校の研究機関AMPLabのプロジェクトによって開発されたクラスタのリソース管理のモジュールです(Mesos, 30 October 2017, Wikipedia, https://en.wikipedia.org/wiki/Apache_Mesos)
  3. SparkのShellを起動します。Sparkは四種類のShell(Scala, Java, Python, R )を実行できます。
    今回は例としてScalaのShellを起動します。起動するコメントは下記です:

SparkのShellを起動すると下記の画面を確認することが出来ます:

図1:Sparkの起動画面

3 WebUIへアクセス:

今回は二つモード(StandaloneとDataproc)でSparkのWebUIをアクセスする方法を紹介します。

  1. Standalone:
    例としてStandaloneモードでSparkの公式サイトに記載されているLinearRegressionのSampleCodeを実行します。SampleCodeやデータはSpark公式のGithub(Source CodeData)からDownloadしてください。今回はWebUIを確認しやすくするために、ソースコードの最後に下記の”halting”のコードを追加します。

    操作の手順は以下の通りです:

    1. Sparkをインストールします。
    2. LinearRegressionのSampleCodeをsubmitします。
    3. SampleCodeが動作しているときにBrowserへMaster NodeのIPやPortを入力してWebUIへアクセスします(Standaloneの場合はhttp://127.0.0.1:4040/jobs/を入力します)。
      WebUIのアクセスに成功すると図2のような画面を確認することが出来ます。
      WebUIの各部については第3章で詳しく説明します。

      図2:StandaloneのWebUI

     

  2. Google Cloud Dataproc:
    今回はGoogle社により提供されている Spark / Hadoop のマネージドサービスであるDataprocのWebUIにアクセスする方法を紹介します。

    1. Google SDKを設定します。設定方法はGoogle Cloudの公式サイトを参考にしてください。
    2. DataprocのInstanceを立ち上げます。使うCommandは下記の通りです。
    3. Step2で作ったDataprocのInstanceのMasterNodeと連携するSSH tunnelを作ります。
      使うCommandは下記の通りです。

      Commandの詳細の説明はGoogle Cloudの公式サイトを参考にしてください。
    4.  Sparkのapplicationをsubmitします。今回は例としてLinearRegressionのSampleCodeをsubmitします。使うCommandは下記の通りです。
    5. Terminal(Mac, Linux)やCommand Line(Window)でChromeを起動します。
      使うCommandは下記の通りです。

      各OSでのChromeのDefault Pathは表1の通りです。

      表1:ChromeのDefault  Path

      Operating System Default  Path of Google Chrome
      Mac OS X /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
      Linux /usr/bin/google-chrome
      Windows C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
    6. 起動したChromeでhttp://[MasterNodeのInstance名]:8088へアクセスします。
      アクセスすると、DataprocのWebUIを確認することができます(図3)。
      DataprocのWebUIの項目「TrackingUI」から「History」をクリックすることで、図3の様なSparkのWebUIに遷移できます。

      図3:DataprocのWebUI

4 WebUIの説明
SparkのWebUI には6つのTabがあります。

  1. Jobs:
    Tab JobでJobのListが確認できます(図4)。
    JobのDescriptionをクリックすることでさらに詳細のJobを確認することができます。
    今回は例としてJob 5(count at LinearRegression.scala:696)をクリックしてみます。
    図4はJob 5の詳細画面です。

    図4:Job の詳細

    Jobの詳細画面にはstageが並んでいます。気になるstageのDescription項目をクリックするとさらに詳細な情報を確認することができます(図5)。

    図5:Stage の詳細

  2. Stages
    Tab Stagesで全てのStagesのListが確認できます。気になるStagesをクリックすることで、そのStageの詳細を確認することができます(図6)。

    図6:Tab Stages

  3. Storage
    Storageで当InstanceのStorageの状況を確認できます。今回のSample CodeではRDDの詳細はないのでStorgeの詳細画面はBlankになりました(図7)。

    図7:Stage の詳細

  4. Executors
    Executorsで当Executorsの詳細状況を確認できます(図8)。

    図8:Executors の詳細

  5. SQL
    SQLでSubmitしたCodeで実行されたSQLの詳細状況を確認できます(図9)。
    気になるStepのDescriptionをクリックして当Stepの詳細情報を確認できます。
    今回は例としてID: 1(first at LinearRegression.scala:198)をクリックしてみました。
    図10はクリック後の遷移画面です。

    図9:SQLの詳細

     

    図10:SQLの詳細状況

5 まとめ

今回はSparkのWebUIについて紹介しました。いかがだったでしょうか。
私は以前、大規模なデータのSparkのProgramを開発していたときに一番悩んだのは、メモリ不足によるエラーを解決することでした。
現在はSparkのWebUI を利用することでProgramの各部分の処理時間、メモリの使用量などの状況を全て確認できるようになりました。
これにより、Programのエラー解決がスムーズになるので、皆さん興味があればSparkのProgramを開発する時にぜひ試してください。

2017-10-02

機械学習の実践入門ーRandom Forestの要約

皆さん

こんにちは、GMOアドマーケティングのS.Rです。

今回はよく使われる機械学習のアルゴリズムRodomForestを皆さんへ紹介致します。

この記事を理解するには、中学レベルの数学とPythonの基本知識が必要です。

Random Forestは2001年にLeo BreimanさんからDecision Treeを発展して提案されたアルゴリズムです。それでは、Random Forestを理解していただくために、まずはDecision Treeについて紹介いたします。

1 Decision Tree(決定木)

機械学習の分野において、Decision Tree(決定木)は予測モデルです。ある事項に対する観察結果から、その事項の目標値に関する結論を導きます。内部節点は変数に対応し、子節点への枝はその変数の取り得る値を示します。 葉(端点)は、根(Root)からの経路によって表される変数値に対して、目的変数の予測値を表します。Decision Treeの学習は、元となる集合を属性値テストに基づいて部分集合に分割することにより行うことができます。 この処理は、すべての部分集合に対して再帰的に繰り返されます。 繰り返しは、分割が実行不可能となった場合、または、部分集合の個々の要素が各々1つずつの分類となった段階で終了します。決定木、2017年8月15日、ウィキペディア日本語版、https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E6%9C%A8

例えば、ある人(山田さん)はゴルフが好きで、時々ゴルフ場へ出かけます。以下の表に山田さんが過去一ヶ月間にゴルフ場へ行った履歴と天気、風、週末などの情報を合わせて集計しました。この情報でDecision Treeのモデルを訓練して今日山田さんゴルフ場へ行くかを予測します。

表1:山田さんのゴルフカレンダー

まずDecision Treeを学習します。最初はRoot Nodeに天気でデータを分割します(図1)。分割された結果みると天気が晴れのときに山田さんはゴルフへ行く確率は50%,雨の時は47%です。天気だけで考えると、山田さんがゴルフへ行くかどうかの判別は難しいです。

図1:天気でデータを分割

次に、分割されたデータをさらに「風」の情報で分割します。図2は分割された結果です。分割された結果からみると雨が降ってるかつ風が強い時に山田さんはゴルフへ行かず、晴れてるかつ風が弱い、雨かつ風が弱い時にゴルフへ行く可能性が高いことがわかります。ただし、風が強いかつ晴れの時に山田さんがゴルフへ行くかどうかはまだ判別が難しいです。

図2:風でデータを再分割

 最後に、週末かどうかを特徴として、もう一度教師データを分割します(図3)。分割された結果はDecision Treeの学習した結果です。分割された結果を見ると、晴れの週末に風が強ければ山田さんはゴルフ場へ行く可能性が高いことがわかります。また、晴れの平日に風が強ければ山田さんはゴルフ場へ行かない結果となりました。そこで、山田さんがゴルフ場へ行くかどうかを予測するDecision Treeを学習しました。このDecision Treeで天気、風、週末かどうかなどの情報を分ければ 山田さんがゴルフ場へ行く確率を予測できます(表2)。

図3:Decision Tree

表2:山田さんゴルフ場へ行く確率

2 Random Forest

Decision Treeはアルゴリズムとしてすごく理解しやすいですが大きな欠点があります。その欠点は「Over Fitting」(Overfitting,( 2017/08/24 16:08). In Wikipedia: The Free Encyclopedia. Retrieved from https://en.wikipedia.org/wiki/Overfitting)です。これは、Decision Treeのモデルを訓練する時に教師データのノイズに対する処理を考えてないことが原因です。そのため、Decision Treeのモデルを訓練する時に正解データだけではなくノイズも含めて学習してしまうため、この学習で得られたDecision TreeのモデルはBiasが高いです。つまり、学習したモデルは教師データに対しては高い精度を持つが、実際に運用する際には精度が悪くなるということです。

Random Forestはこの欠点を改良しました。 解決方法はモデルを学習する前に教師データに ランダム性を入れて教師データのSubsetを作り、各SubsetのノイズのBiasを差し引きます。全体で2つのステップがあります。

  1. 教師データを復元抽出し、N分の新しいデータセットを作成します。よく使われる抽出されたデータセットのサイズはもとのデータセットサイズの平方根です。
  2. 抽出された新しいデータセットでDecision TreeをN本訓練します。

図4:Random Forestの訓練

訓練されたRandom ForestのモデルにDecision TreeがN本あります。予測する時に一つのCaseに対してDecision Treeの予測結果をN個出せます。Random Forestの結果はこのN個結果から”Vote”して点数が高い方で決まります。

3 Merit・Demerit

Random ForestのMerit・Demeritは表3の通りです。

表3:Random ForestのMerit・Demerit

4  Scikit-learnで検証する

最後はPythonの機械学習ツールScikit-learnで、irisの分類問題に対してRandom Forestを試してみましょう。irisの分類問題についてはこちらをご参考下さい。

Scikit-learn、またはPythonをインストールしていない人はこちらを参考してインストールしてください。

Step 1: Library Import

まずScikit-learnのlibraryをimportします。

Step 2: Download Training Dataset

irisの教師データをダウンロードします。

irisの教師データをダウンロードされたデータを確認する為に最初の五つデータをprint outします。ダウンロードに成功すれば表4ような結果が得られます。

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa

表4:Random Forestの教師データ

Step 2: Training と Test を分けます

irisの教師データからRandomに80%のデータを抽出しTraining Dataにします。残る部分はTest Dataにします。

Step 3: Random Forestのモデルを訓練します

Random Forestのモデルを訓練します。 n_estimatorsは木の数です。n_jobsは並列に実行するjob数です。

Step 4: モデルの精度を計算します。

Step 2に抽出されたTest Datasetでモデルの精度を計算します。計算に成功すれば表5ような結果が得られます。

Predicted Species setosa versicolor virginica
Actual Species
setosa 13 0 0
versicolor 0 5 2
virginica 0 0 12

表5:モデルの精度

5 Future Reading

今回はRandom Forestについて紹介しました。いかがだったでしょうか。

Random Forestの原理をさらに深く理解したい方は下記の論文とビデオをぜひ参考してください。

  1. Breiman,Leo. (2001). Random forests. Machine learning, 45(1), 5-32.
  2. Thales,Sehn Körting(2014).How Random Forest algorithm works,http://www.youtube.com/watch?v=Vja83KLQXZs.

Random Forestの実装については下記のブログをぜひ参考してください。

  1. The Apache Software Foundation.(2017), Random forest regression,spark.apache.org.
  2. Raja Iqbal.(2015/02/24).Tutorial: Creating a random forest regression model in R and using it for scoring,Data Science Dojo.