MacBook AirのPython環境メモ

7月ぐらいから、pyenv、pyenv-virtualenv 使うように変更、その時のメモ

1 ) install pyenv

$ brew install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile 
$ exec -l $SHELL

2 ) install 2.7.10
#普通にpyenv install 2.7.10 だとzlib extensionのコンパイルでエラー
Common build problems · yyuu/pyenv Wiki · GitHub

$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.10
$ pyenv rehash

3 ) install pyenv-virtualenv

$ brew install pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
$ exec -l $SHELL

4 ) 仮想環境の作成

$ pyenv virtualenv 2.7.10 data_analysis_env_2.7.10
$ cd ~/Develop/pywork
$ mkdir python_for_data_analysis/
$ cd mkdir python_for_data_analysis/
$ pyenv local data_analysis_env_2.7.10
$ pip install numpy==1.9.2
$ pip install nose
$ pip install scipy==0.15.1
$ pip install -U scikit-learn
$ pip install -U pandas
$ pip install -U matplotlib
$ pip install -U ipython

おまけで3系の最新も入れとく

5 ) install 3.4.3
#普通にpyenv install 3.4.3 だとssl extensionのコンパイルでエラー
Mac OS X 10.9 Mavericksでpyenv installが失敗する時 - dackdive's blog

# xcodeのコマンドラインツールを入れる
$ xcode-select --install
$ pyenv install 3.4.3

Sparkコンテナ(勉強用)

Sparkの勉強するのに、また手元の開発環境ごちゃごちゃになるのは困るのでDockerコンテナを作ってみた話。

github.com

初め探してsequenceiqのとかあったけど、Dockerのマルチコンテナでのクラスタの組み方とかも勉強したかったので作ることにした。クラスタマネージャはとりあえずYARN、今回は1つのDockerホストで、マスター(クラスタマネージャ)、スレーブ(ワーカー)、Sparkクライアントのコンテナを走らせる。
#はじめ、マルチホストのDockerクラスタでも動くようにしたかったけど、まだちょっとあれだった

コンテナ接続

クラスタ内のコンテナ接続、単純なクライアントサーバ的な一方行の静的なコンテナ接続は、Dockerのリンク機能が使えるけど、Sparkクラスタの場合、いろいろ動的にJVMプロセスが立ち上がってIPCするので、厳しい。

コンテナ接続パターンはいろいろあるけど、シングルDockerホストマルチコンテナのクラスタであれば今のところdnsmasqを利用する方法がシンプルかと

Using dnsmasq to link Docker containers

chef/centos-7.0のVagrant boxをベースにセットアップ、dockerのバージョンは1.6、1.7+だとBridgeインタフェースが作成されなくて動かなかった、なんかネットワーク周りに機能変更あったぽい

1. dnsmasqをインストール

$ yum install -y dnsmasq

2. dockerネットワークの設定を追加

# /etc/dnsmasq.d/docker-dns
addn-hosts=/etc/docker-container-hosts
interface=docker0

3. 自動起動を有効化、起動

$ systemctl enable dnsmasq
$ systemctl start dnsmasq

あとは、コンテナの起動ときに、dnsオプションでdocker0(172.17.42.1)インタフェースを指定して、hostnameも指定しておけばコンテナ間で名前解決できる

hostsファイルは、コンテナをrun, startした後に、下のスクリプトで更新する仕組み。

#!/bin/bash
 
# Domain name for containers
CONTAINER_DOMAIN=containers.dev
 
# Path to the addn-hosts file
CONTAINER_HOSTS=/etc/docker-container-hosts

echo "# Auto-generated by $0" > $CONTAINER_HOSTS
for CID in `docker ps -q`; do
  IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CID`
  NAME=`docker inspect --format '{{ .Config.Hostname }}' $CID`
  echo "$IP  $NAME.$CONTAINER_DOMAIN $NAME" >> $CONTAINER_HOSTS
done

# Ask dnsmasq to reload addn-hosts
pkill -HUP -x dnsmasq

hostsファイル(/etc/docker-container-hosts)

# Auto-generated by ./bin/update_docker_hosts.sh
172.17.0.4  hdp2.containers.dev hdp3
172.17.0.3  hdp2.containers.dev hdp2
172.17.0.2  spark.containers.dev spark
172.17.0.1  hdp1.containers.dev hdp1

あと、ポートは、設定ファイル(core-site.xml, yarn-site.xml, hdfs-site.xml, mapred-site.xml, spark.defaults)に明示して、コンテナからEXPOSEしておく。
さらにVM(Dockerホスト)のホストOSからアクセスするポート(ノートブック等のWebUI)は、コンテナをrunする時に、portsオプションで見えるようにしとく。

ノートブック

ノートブック環境は、Python用に、IPython Notebook。Scala用に、Spark Notebookを使って見る。

設定は、Dockerファイルみればわかるけど、仕組みあんまり理解できてないので、またおいおい整理

その他備忘録

  • Java8でやっててなんかエラーでて、とりあえずJava7にしたら動いたので、そのままにしてるけど、なんか動きそうなのでもっかいやってみる

hadoop - Spark Pi Example in Cluster mode with Yarn: Association lost - Stack Overflow
[SPARK-6388] Spark 1.3 + Hadoop 2.6 Can't work on Java 8_40 - ASF JIRA

Sparkプログラミング ~ IntelliJ IDEAのインストール ~

Spark事始め
#事始めではないが、Learning Spark の日本語訳も発売されたことだし、ちょいちょいSparkネタを残しておこう。
#いままでやったことはそのうち整理していく予定

ScalaでSparkプログラミングするにはIntelliJがおすすめようなので気分転換がてらしばらく使って見ることにする。

の前に、brewでいろいろ探してたら、なんかエラーでたのでその備忘メモ

Error: GitHub API rate limit exceeded for 114.170.237.217. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)

Try again in 39 minutes 13 seconds, or create an personal access token:

  https://github.com/settings/tokens

and then set the token as: HOMEBREW_GITHUB_API_TOKEN

言われた通り、githubにいってtokenを生成して、~/.bash_profileに追加

export HOMEBREW_GITHUB_API_TOKEN=ed4aexxxxxxxxxxxxxxxxxxxxxxx

$ exec -l $SHELL

caskroomのversionsがあったので一応tapしとく
https://github.com/caskroom/homebrew-versions

$ brew tap caskroom/versions

インストール

$ brew cask search intellij
==> Partial matches
intellij-idea			   intellij-idea-ce		      intellij-idea-ce-eap		 intellij-idea-eap		    intellij-idea13
intellij-idea-bundled-jdk	   intellij-idea-ce-bundled-jdk	      intellij-idea-ce13		 intellij-idea12

$ brew cask info intellij-idea-ce
intellij-idea-ce: 14.1.4
IntelliJ IDEA Community Edition
https://www.jetbrains.com/idea/
Not installed
https://github.com/caskroom/homebrew-cask/blob/master/Casks/intellij-idea-ce.rb
==> Contents
  IntelliJ IDEA 14 CE.app (app)

$ brew cask install intellij-idea-ce
==> Downloading https://download.jetbrains.com/idea/ideaIC-14.1.4.dmg
######################################################################## 100.0%
==> Symlinking App 'IntelliJ IDEA 14 CE.app' to '/Users/hiroki/Applications/IntelliJ IDEA 14 CE.app'
🍺  intellij-idea-ce staged at '/opt/homebrew-cask/Caskroom/intellij-idea-ce/14.1.4' (1536 files, 366M)

~/ApplicationsにあるIntelliJ IDEA 14 CE.appを起動

f:id:hiropppee:20150819231529p:plain

なんかでて、立ち上がらない、言われたとおり Java for OS X 2014-001 をインストール、今のとこjava6で動かすのが無難らしい

IDE doesn't start after updating to Mac OS Yosemite or Mavericks – JetBrains Support

とりあえず、Sparkのソースをインポートしてみる

$ git clone https://github.com/apache/spark.git
$ cd spark
$ git checkout -b 1.4.1 refs/tags/v1.4.1

IntelliJを起動、Scalaプラグインを入れる。

  1. Import Project -> チェックアウトしたSparkを選択して次
  2. Import project from external model で [Maven] を選択して次
  3. Import Maven projects automatically にチェックを追加して次
  4. Select profilesは、勉強用のSparkコンテナに合わせて [scala-2.10] [yarn] [sbt] [hadoop-2.6] を選択して次
  5. Select Maven projects to import はそのまま次
  6. JDKを追加、インストール済のjdk1.8.0_40.jdkにしとく、次
  7. Project name、Project file locationはそのまま、終了

f:id:hiropppee:20150820004839p:plain