INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

Spark on EMR 始めました & やめました

Amazon EMRのオプションにSparkが追加されたとのこと。

New – Apache Spark on Amazon EMR | AWS Official Blog


以下の書籍に参考に早速試してみたが色々ハマったのでメモしとく。

Machine Learning with Spark

Machine Learning with Spark


セキュリティグループの作成

ipython notebook改めJupyterからPySparkを使用したいため、Jupyter用のポートをオープンする。

  1. AWSのコンソールからEC2を選択する f:id:tak95:20150626184905p:plain

  2. 〜個のセキュリティグループを選択する f:id:tak95:20150626184921p:plain

  3. セキュリティグループの作成を選択する f:id:tak95:20150626184939p:plain

  4. 必要事項を記入して"作成"

    • セキュリティグループ名、説明は適当に入力
    • インバウンドのタブを選択し以下の通りに設定する。
      • タイプ : カスタムTCPルール
      • プロトコル : TCP
      • ポート範囲 : 9999
      • 送信元 : 任意の場所 f:id:tak95:20150626184952p:plain


EMRのクラスター作成

以下の通り変更してEMRのクラスターを作成する。

  • ソフトウェア構成
    • Hive, Pig, Hueは構築時間短縮のため外す
    • Sparkは上記ブログにある通り引数に"-x"を指定する
  • ハードウェア構成
  • セキュリティ
    • EC2キーペアを選択する
    • マスターインスタンス追加のセキュリティグループに先ほど作成したJupyterのセキュリティグループを設定する

f:id:tak95:20150626190219p:plain

クラスター作成が完了すればsshでマスターインスタンスに接続できるようになる。


ssh hadoop@マスターインスタンスのホスト名 -i ~/mykeypair.pem


Python 2.6から2.7へスイッチ

JupyterをインストールするにはPython 2.7以上が必要。
EMRには2.6.9, 2.7.9両方インストールされているがデフォルトでは2.6系が使用されるので2.7系を使用するように切り替える。

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.6 20 \
> --slave /usr/bin/pip pip /usr/bin/pip-2.6
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 10 \
> --slave /usr/bin/pip pip /usr/bin/pip-2.7
$ sudo update-alternatives --config python
alternative python (/usr/bin/python を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python2.6   20        自動モード
  1            /usr/bin/python2.6   20        手動モード
  2            /usr/bin/python2.7   10        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 2
update-alternatives: /usr/bin/python (python) を提供するために 手動モード で /usr/bin/python2.7 を使います


Jupyterのインストール

以下のコマンドを実行し、Jupyterをインストールする。

$ sudo pip install ipython[all]


Jupyterの設定

以下を参考にJupyterの設定を行なう。

How-to: Use IPython Notebook with Apache Spark | Cloudera Engineering Blog

  1. プロファイルの作成
$ ipython profile create pyspark
[ProfileCreate] Generating default config file: u'/home/hadoop/.ipython/profile_pyspark/ipython_config.py'
[ProfileCreate] Generating default config file: u'/home/hadoop/.ipython/profile_pyspark/ipython_kernel_config.py'
[ProfileCreate] Generating default config file: u'/home/hadoop/.ipython/profile_pyspark/ipython_console_config.py'
[ProfileCreate] Generating default config file: u'/home/hadoop/.ipython/profile_pyspark/ipython_notebook_config.py'
[ProfileCreate] Generating default config file: u'/home/hadoop/.ipython/profile_pyspark/ipython_nbconvert_config.py'


2. パスワードファイルの作成

$ python -c 'from IPython.lib import passwd; print passwd()' > ~/.ipython/profile_pyspark/nbpasswd.txt
Enter password: 
Verify password: 


3. プロファイルの編集

$ vi ~/.ipython/profile_pyspark/startup/00-pyspark-setup.py
$ vi ~/.ipython/profile_pyspark/ipython_notebook_config.py

編集内容は以下の通り。

Spark on EMR用Jupyter設定ファイル

  • ポートやpy4jのパスなどをClouderaの内容からEMR用に変更している
  • 00-pyspark-setup.pyはClouderaのものをそのままコピペするとインデントがおかしくて動かないので注意


これで以下のコマンドを実行するとJupyterが起動する。

$ ipython notebook --profile=pyspark


ブラウザからhttp://[マスターインスタンスのIP]:9999にアクセスするとログイン画面が表示される

f:id:tak95:20150626211436p:plain


ログインするとこのような感じに。

f:id:tak95:20150626211456p:plain


"New"から"Python 2"を選択するとこのような画面に遷移する。

f:id:tak95:20150626211505p:plain


Machine Learning with Spark

冒頭の書籍ではMovieLensのデータセットを使ってレコメンドシステムを構築していく。 以下のコマンドを実行してデータのダウンロード・HDFSへの格納を行なう。

$ wget http://files.grouplens.org/datasets/movielens/ml-100k.zip
$ unzip ml-100k.zip
$ hadoop fs -put ml-100k /


準備が整ったのでJupyterでサンプルコードを実行するとエラーに。。。

f:id:tak95:20150626212537p:plain


ipython - "ImportError: No module named" when trying to run Python script - Stack Overflowと同じ原因のようでipython_notebook_config.pyにc.NotebookManager.notebook_dirを設定すれば良さそうだけどこの時点でAWSの利用料が20$超えたので断念した。。。


  • Jupyterではなくコンソールで上記コマンドを実行すると正常に処理されるので、黒い画面でも良い人は問題ないかも
  • EMR、個人て試すには高い。。。皆さんはSparkをどのような環境で試されてるんだろう?