MacのローカルでPySparkをJupyterNotebookから使う

はじめに

データインテグレーション部の平野です。 データベースやデータ分析のことについてまだまだ勉強中ですが、以前少しSparkをいじっていたことがあるので、そちらの方も再開してみようと思います。 AWS Glueにも興味があるので、おいおいそちらにも手を出していきたいですね。

ということで、まずはMacのローカル環境にSparkをインストールして、JupyterNotebookで動作確認するところまで行いたいと思います。

Sparkをインストール

公式サイト の「Download」へ行き、バージョンを選択してダウンロードします。

バージョンは最新(執筆時点で2.3.2)を選べば良いですし、「package type」も最初に選択されているもので大丈夫です。 Hadoopに対応したものと書いてありますが、はじめは特に気にする必要はありません。 (少なくとも当面はHadoopと関連させて使う予定はありません)

tgzファイルがダウンロードされますので、解凍して任意の場所に置いてください。 私はとりあえず何も考えず~/Spark/spark-2.3.2-bin-hadoop2.7に置きました。 以下ではこのディレクトリをSPARK_HOMEと表記します。

インストールは以上で完了です。

起動確認

SparkはScalaで書かれており、Scala、Java、Pythonなどのプログラミング言語をサポートしています。 今回はPythonで動作確認をしてみます。

pysparkの起動

${SPARK_HOME}/bin/pysparkを実行すると以下のように表示され、インタラクティブのPythonが立ち上がります。

$ bin/pyspark
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
2018-10-12 10:19:23 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.3.2
      /_/

Using Python version 2.7.10 (default, Oct  6 2017 22:29:07)
SparkSession available as 'spark'.
>>>

ここで立ち上がったPythonは、Sparkを使うのに必要なライブラリの読み込みやオブジェクトの作成が事前に行われていますが、普通のPythonと思って大丈夫です。

>>> print "hoge"
hoge
>>> for x in range(5):
...   print x
...
0
1
2
3
4

Spark機能の確認

普通のPythonだけ動いても仕方がないので、Sparkの機能を使ってみます。

>>> rdd = sc.textFile("NOTICE")
>>> rdd.take(3)
[u'Apache Spark', u'Copyright 2014 and onwards The Apache Software Foundation.', u'']

sc(SparkContextの略)は上記で言った、「Sparkを使うのに必要なライブラリの読み込みやオブジェクトの作成」によって定義されたオブジェクトになります。

sc.textFile("NOTICE")1 は、ファイルをテキストファイルとして開き、Spark特有のRDDという形式にするという関数になります。2 RDD(Resilient Distributed Dataset)についての詳しい説明はここでは割愛しますが、RDDとは あるデータ型の配列のこと です。
・・・こんな説明だと偉い人に怒られそうなので、一言加えると ただの配列みたいに扱えるように裏で色々頑張っているもの です。

RDDは配列ですから、rddは、ファイルを読み込んで改行でsplitした各行が格納されている配列だと思えばOKです。 rdd.take(3) は、その配列の先頭の3要素だけを取り出して出力する関数です。 "NOTICE"の先頭3行と一致しているのが確認できます。

非常に簡単ですが、これでSparkの動作確認ができ、プログラミングをする最低限の土台が整いました。 Ctrl+dでPythonを終了します。

Jupyterノートブックで使う

やはり素のpythonではコーディングがツラいですので、Jupyterノートブックで動くようにしてみます。

Jupyterのインストール

  • pipをインストールします
  • pipからjupyterをインストールします
    • ~/Library/Python/2.7/bin/pip install jupyter --user

pysparkがJupyterで立ち上がるように設定する

Spark起動時に読まれる設定ファイルに、Jupyterノートブックを使用するように設定します。

環境変数は${SPARK_HOME}/conf/spark-env.shに設定を書きます。 インストール時に置いてある${SPARK_HOME}/conf/spark-env.sh.templateを複製して作成します。

cp conf/spark-env.sh.template conf/spark-env.sh

作成したファイルに以下の2行を追加します。

export PYSPARK_DRIVER_PYTHON=~/Library/Python/2.7/bin/jupyter  #Jupyterがインストールされた場所
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

以上で設定は完了です。 なお、常にJupyterで開きたくはないという場合には、上記の2つの環境変数を別途設定した上でpysparkを実行しても大丈夫です。

PYSPARK_DRIVER_PYTHON=~/Library/Python/2.7/bin/jupyter PYSPARK_DRIVER_PYTHON_OPTS="notebook" bin/pyspark

動作確認

Jupyterノートブックを使用しない時と同様に、${SPARK_HOME}/bin/pysparkを実行するとJupyterが起動され、デフォルトでは自動的にブラウザでJupyterの画面が開かれます。 開かれない場合は http://localhost:8888/tree にアクセスします。

「New」 -> 「Python2」 で新しいノートブックを開きます

先ほどと同じコードを実行してみます

先ほどと同じ動作をしていることが確認できました。 「File」 -> 「Close and Halt」 でノートブックを終了できます。

おわりに

Sparkのダウンロード・インストールから、JupyterNotebookでpysparkの動作確認を行うところまで紹介しました。

見ての通り、Sparkをローカルで試すことは非常に手軽に行うことができます。 新しいものに触れる時、最初の導入が簡単かどうかは非常に重要だと思うのですが、Sparkはプログラミングを始めるまでは本当にすぐできて素晴らしいです。 もちろん大規模なデータを処理できる環境を整えるのは簡単なことではないのですが、まずは触りやすいコーディングの部分で遊んでみると楽しいのではないかと思います。


  1. "NOTICE"はSPARK_HOMEにあるファイルで、ただの適当なテキストファイルとして使っているだけです。 
  2. textFileは遅延評価されるので、実際はこの行を実行しただけではファイルはオープンされません。