楽屋

Hivemall Getting Started

この記事はHadoop/Hive/Hivemall環境をローカルマシン(mac)上に構築して、テストしてみたい方向けに執筆しています。

はじめに

昨今、数多くの機械学習向けライブラリがリリースされています。今回紹介するHivemallは、HiveUDF上で動作するため、大量データに対して分散処理を行う際に高い性能を示します。分散環境の構築を1から始めるのは容易ではないですが、擬似分散モードであれば、マシンが1台あれば比較的容易に構築から動作確認まですることができます。今回は、 Hivemallを使って、Kaggleのチュートリアル的タイトルの「Titanic」に挑戦したいと思います。 今回やることは以下の通りです。
  • HomeBrewのインストール
  • Hadoopのインストール
  • Hiveのインストール
  • Hivemallのインストール
  • Hivemallによる機械学習

Javaのインストール

今回、インストールするソフトウェアを動かすには、Java7以上が必要になります。お使いのマシンに、インストールされていないようであれば、Oracleから最新バージョン(Java8)をダウンロードしてください。

Homebrewのインストール

今回は、できるだけ簡単に進めるために、Homebrewを使用します。Homebrewがインストールされていない場合はインストールしてください。下記コマンドでインストールできます。 以降、特に断りがなければ、「$...」はターミナルからのコマンド実行を示しています。 Homebrewについて詳しくは、下記URLを参照してください。

Hadoopのインストール

ここでは、HadoopをSingle Node Clusterで利用できるようにします。Homebrewがインストールされていれば、なんら恐れる必要はありません。次のコマンドひとつでインストールできます。 インストールが完了したら、正常にHadoopがインストールされているかを確認してみましょう。ここではスタンドアロンモードで動作を確認します。これには、Hadoopに同封されているテストプログラムを利用した単語の集計(wordcount)を利用します。 では、テスト用の入力データを作成しましょう。 Hadoopを起動します。 ここでは、inputディレクトリ以下のファイルが読み込まれて、ファイル内に記載される単語の件数が集計され、outputディレクトリに出力されます。${HADOOP_INSTALL}は、インストール環境によって異なる値となるため、設定前に確認してください。Homebrewのデフォルト設定であれば、「/usr/local/Cellar」以下にインストールされていると思います。集計している間は、色々とログが出ます。 結果を確認します。 集計された結果が「part-r-xxxx」の形式で出力されます。_SUCCESSは、正常終了された場合に出力される空のファイルです。 ちゃんと集計されていることがわかります。 次にHiveを利用可能な状態にするためにHadoopを擬似分散モードで起動できるようにします。擬似分散モード実行には、マシンへのssh接続許可が必要です。「システム環境設定」から「共有」を選択し、「リモートログイン:入」に設定してください。 また、擬似分散モードにするためには設定ファイルを変更する必要があります。Hadoopにはたくさんの設定ファイルがありますが、テスト的に動作させる分には、次のような変更で十分です。 Namenodeを初期化します。 *localhostのパスワードを要求される場合、ログインパスワードを入力してください。 Hadoopを分散モード(HDFS)で起動します。 JavaのjpsツールでHDFSの起動を確認します。 数値は、その時によって変わります。この3つのプロセスが動いていることを確認してください。 また、以下のURLに接続できることを確認してください。
  • http://localhost:50070/
この画面から、HDFSのステータスを確認することができます。 正常に起動していれば、画面が表示されます。起動できていない場合、画面が表示されません。 では、実際に動かしてみましょう。 先ほどのテストデータを使って、wordcountで確認してみたいと思います。 まず、HDFS管理下にディレクトリを作成します。 HomeBrewでインストールした場合、以下のようなWARNログが出る場合があります。 今回の確認では、動作に支障ありませんので、そのまま勧めていただいても構いません。解決方法はAPPENDIXを参照してください。 先に作成したテストデータをHDFS管理下にコピーします。 擬似分散環境下でのwordcountの動作を確認しましょう。 問題なく動作していることが確認できたので、Hiveのインストールに続きたいと思います。

Hiveのインストール

ここでは、Hiveをインストールし接続できるようになるところまでを確認します。HiveもHomebrewを利用すれば、簡単にインストールできます。 これでインストールは完了したので、初期設定と接続確認を行っていきましょう。 Hiveメタストアを初期化します。 HiveServerを起動します。 クライアントを起動し、Hiveに接続します。 schematool実行時にmetastore_dbが作成されます。クライアント起動時にmetastore_dbを参照しています。beelineコマンドはmetastore_dbディレクトリの配置されるディレクトリと同じディレクトリ内で実行してください。 テストとして、データベースの一覧を表示します。 *以降、特に断りがなければ、「//>」はbeelineプロンプトからのクエリ実行になります。 初期化以外何もしていないので、default以外の表示はないと思います。

Hivemallのインストール

HivemallはHiveUDFなためHomebrewではインストールできません。HivemallのWEBページから、「1.2. Getting Started」「1.2.1. Instllation」「Prerequisites」下の「hivemall-core-xxx-with-dependencies.jar」リンク先からjarファイルと「define-all.hive」をダウンロードしてください。 beelineから、以下のコマンドを実行してください。 sourceは正常終了しない場合があります。その場合はdefine-all.hive内の「CREATE FUNCTION」を手動実行することで、代替する必要があります。

Hivemallによる機械学習

ようやく、本題になります。今回は、KaggleのTitanicデータに対してRandomForestを行い、生存者予測を行いたいと思います。

データの取得

まずは、Kaggleに登録して、データをダウンロードしてください。検索フォームから「titanic」と検索し、「Titanic: Machine Learning from Disaster」(https://www.kaggle.com/c/titanic)を開けば、「Data」から訓練データtrain.csvとテストデータtest.csvをダウンロードできます。 ここからは、Hivemallの「Kaggle Titanic tutorial」ページの内容に沿って進めていきたいと思います。

データ準備

まずは、データベースを作成します。 作業用にCURRENT_DBを切り替えます。 訓練データ用のTABLEを作成します。 データは次の工程で追加します。そのまま先に進んでください。 テストデータ用のTABLEを作成します。

データロード

先ほど作成したテーブルにデータをロードします。 FPATを利用したawkは、意図した動作をしない場合があるので、sedで代替しています。 同様にテストデータもLOCATIONにputします。 これで、Hiveからデータが確認できるようになっているはずです。確認してみます。

前処理

データ前処理の前にhiveの設定を一時的に変更します。 次に使うUDTF:quantifyは現在、CBO管理外となっているため、一時的に使用不可とします。trueの場合、ERRORログが出ます。ログ出力されても、動作上は問題ないですが気持ちが悪いので停止します。 前処理UDTF用の変数を設定します。 設定ができたので、データの前処理を行なっていきます。 train_rfの内容はこのようになっています。 quantifyによりデータを定量化します。文字列の入力についても変換可能なものは数値に変換されます(例えば、sexなど)。randは乱数を出力します。クロスバリデーション時など、サンプリングする際に利用します。arrayで指定した説明変数を一つの配列とします。これは、ランダムフォレストの学習用関数(train_randomforest_classifier)が、説明変数をdoubleの配列として受け取ることを前提としているからです。 同様にテストデータも処理していきます。 次に、説明変数のメタ情報を設定します。 guess_attribute_typesにより、Hivemallが与えられた変数値を「Q:量的」であるか「C:質的」のどちらと認識するかを確認できます。 これを確認すると、「pclass:乗客のグレード」が量的と判断されており、明示する必要があることがわかります。そこで、説明変数の属性を明示しておきたいと思います。 これは、次のクエリで使用する変数の設定です。

学習

では、モデルを構築していきたいと思います。 train_randomforest_classifierの詳しいオプションは、以下のクエリで確認してください。 私が確認した限りこのクエリでは例外ログが多量に出力されますが。何が違うのかよくわかってないです。スミマセンm(_ _)m。hivemallのWEBページかソースなどから確認してください。 気をとりなおして、モデルのimportanceは下記のクエリで確認してみます。 予測 ここまでで、データの準備ができたので、予測を行ってみましょう。 このクエリでは先に指定したtree=500から、予測結果とそのもっともらしさを集計しています。最終的には得られた結果も確認しておきましょう。 最後にKaggleに結果を提出するために、データをファイル出力します。 まず次のクエリで提出用の形式に変換します。 次にターミナルからHive上のデータを通常ファイルに変換します。 predicted_rf_submitディレクトリ以下のファイルを結合して、predicted_rf_submit_raw.csvとして取得します。 また、結果にはヘッダーが必要なので、追加します。 あとは、KaggleのTitanicページ上の「Submit Predictions」から、結果をアップロードしてみてください。 以上で、終了になります。おつかれさまでした。

APPENDIX

HadoopをHomebrewでインストールした場合、hdfsが実行されるたびにWARNログが出力されると思います。これは、native-hadoop libraryがインストールされていないことが原因です。ここでは、そのHadoopをソースからコンパイルし、ライブラリをインストールしていきたいと思います。 コンパイルには、以下が必要になります。
  • JDK 1.7+
  • Maven 3.0 or later
  • ProtocolBuffer 2.5.0
  • CMake 2.6 or newer (if compiling native code), must be 3.0 or newer on Mac
  • Zlib devel (if compiling native code)
JDKは、すでにインストール済みですね。maven、cmake、zlibはインストールされていなければ、Homebrewでインストールしてしまいましょう。 環境によっては、ProtocolBufferのインストールは多少の手間が必要かもしれません。私は、以降の手順でインストールしました。 まずは、Hadoopのバージョンを確認します。 ここから、HadoopのコンパイルにつかったシリアライザProtocol Buffersのバージョンを確認してください。おそらくprotoc 2.5.0となっているかと思います。 HomebrewからProtocolBufferについて検索し、2.5系をインストールします。 このままでは、インストール済みのProtocolBufferが優先され、2.5系を使用できません。そこで一度リンクを削除し、2.5系からリンクを再作成します。 Hadoopのソースをダウンロード、コンパイルし、ライブラリをインストールします。 これで、作業は完了です。最後にWARNログが出なくなっていることを確認します。