【Python×データ分析】Apache Sparkを使ってみた【大規模分散処理】

こんにちは。Yutaro@年末合宿中です。この年末は、これまで耳にしていたけれど実際に使ってみれていなかった技術を色々と触ってみようと思っています!

その第一弾がSparkというわけです。

現在はアドホックなデータ分析やモデル構築が多いのですが、より大規模なデータを扱ったり、アドホックな分析をちゃんとした運用にのせる機会が増えてきているため、大規模データをより効率的に扱えると言われているSparkでできることをしっかり理解しておくことが目的です。

それでは参ります。

Contents

Apache Sparkとは?

・高速かつ汎用的であることを目標に設計された、クラスタコンピューティングプラットフォーム

・広く使われているMap Reduceのモデルを拡張し、より多くの種類の演算処理を効率的にサポート

Apache Sparkのトレンドは?

Google Trendでみてみると、綺麗すぎる右肩上がりです。これから大規模なデータを扱う機械学習システムの需要がますます高まって、Sparkの需要も高まっていきそうです。

過去5年間のトレンド

そしてやはり中国が一番サーチの比率が高いです。

地域別

ちなみに、最初の図で直近(12月末)がガクッと下がっていますが、この原因はアメリカにありそうです。中国や日本などの地域では、このような急落はみられませんでした。これはおそらく、クリスマスのホリデーシーズンでみんな休みに入っているからと思われます・・(ヨーロッパ圏でも同様の傾向がありましたので・・)

Apache Sparkの構成

・Apache Sparkは、複数のコンポーネントから構成されます。Spark Coreの上に、様々な拡張機能がのっかっているようなイメージでしょうか。

1、Spark Core:タスクスケジューリング、メモリ管理、障害回復などのSparkの基本機能を提供。Sparkのエンジン。

2、Spark SQL:構造化データを扱うためのパッケージ

3、Spark Streaming:データのリアルタイム処理を実現する機能を提供

4、MLlib:機械学習の機能を含むライブラリ。Spark上でスケールアウトできるように設計されている。

5、GraphX:ソーシャルグラフなどのグラフに対して並列に演算処理を実行するためのライブラリ

6、クラスタマネージャ:複数のサーバ上で分散処理を行うための機能を提供。

なんとなく概念はわかるけれど、ちょっと使ってみないことには具体的なイメージが持てないですね・・。

実際に使う準備をしていきましょう。

Apache Sparkのダウンロード

Apache Sparkの動作にはJRE(Javaのランタイム)が必要になりますので、事前にJREのインストールも行います。

Javaの実行環境構築については、こちらの手順をご参考ください。

その上で、Apache Sparkのインストールを行なっていきます。インストールにあたっては、はじめにプログラムをSparkの公式ページからダウンロードします。

Apache Sparkダウンロードページ

ダウンロードの実行コマンドはこちら。バージョンは2020年1月1日時点のものなので、適宜最新のものをダウンロードしてください。ダウンロード後に、パス系の設定を行えば、初期設定は完了です!

#ダウンロード
http://mirrors.viethosting.com/apache/spark/spark-3.0.0-preview2/spark-3.0.0-preview2-bin-hadoop2.7.tgz

#解凍
tar xvfz spark-3.0.0-preview2-bin-hadoop2.7.tgz

#シンボリックリンクの作成
ln -s $HOME/spark-3.0.0-preview2-bin-hadoop2.7 $HOME/spark

#環境変数の設定
echo 'export SPARK_HOME=$HOME/spark' >> ~/.bash_profile
echo 'export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin' >> ~/.bash_profile
source ~/.bash_profile


Apache Sparkのディレクトリ構成を確認

解凍したsparkのディレクトリを覗くと、以下のような構成になっていることが分かります。

Sparkのディレクトリ構成

Apache SparkをScala(スタンドアロン)で起動

Apache Sparkには、Python上で呼び出して使えるPySparkと、単体で利用できる(スタンドアロンの)spark-shellが存在しています。はじめに,Spark Shellを少し触ってみましょう。

Spark-Shellは以下のコマンドで起動できます。

$HOME/spark/bin/spark-shell
Sparkの起動画面

お試しで、以下のコードを打ってみます。

lines = sc.textFile("README.md")
lines.count()
lines.first()
CTRL+Cで終了
実行結果

テキストを読み込んだ際にRDDというものが生成されていますが、これは耐障害性分散データセット(Resilient Distributed Dataset)というもので、SparkはRDDに含まれるデータを自動的にクラスタ内に分散させ、処理を並列化しています。このRDDは、Apacheの中核となる概念になります。

Apache SparkをJupyter Notebook上で起動

それでは、次はJupyterNotebook上でPythonを通してApache Sparkを実行できるようにしていきたいと思います。

方法1:PySparkをJupyterで起動させるように設定する

Python上で実行するためのモジュールとして、PySparkが提供されています。(bin/pyspark)

これを、起動時にJupyter Notebookが開くように設定するのが一つ目の方法です。

export PYSPARK_DRIVER_PYTHON=jupyter

#Jupyter Notebookで起動させたい場合
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

#Jupyter Labで起動させたい場合
export PYSPARK_DRIVER_PYTHON_OPTS='lab'

この設定を行なった上で、以下でPysparkを起動すると、Jupyter Notebookが立ち上がります。

$HOME/spark/bin/pyspark

例えば、以下のコードでSparkが利用できていることを確認できます。

%%time
import random
num_samples= 100000000
def inside(p):
    x, y = random.random(), random.random()
    return x * x + y * y < 1

count = sc.parallelize(range(0,num_samples)).filter(inside).count()
pi = 4 * count/num_samples

print(pi)

方法2:FindSparkライブラリを利用する

いちいちPySparkを起動しなくても、Spark_Homeの環境変数を読み込んで、すぐにSparkを使えるようにしてくれるライブラリがあるようです。

conda install -c conda-forge findspark

インストール完了後は、Jupyter上でFindsparkをインポートし、sparkのホームディレクトリのパスを通せば利用可能になります。

import findspark
findspark.init()

#.init()では$SPARK_HOMEのパスを自動的に読み込むはずだが、うまくいかないケースがあるらしく、その場合はパスを直接指定
findspark.init("SPARK_HOMEのパス")
import pyspark
import random

sc = pyspark.SparkContext(appName="Pi")
num_samples = 100000000

def inside(p):     
  x, y = random.random(), random.random()
  return x*x + y*y < 1

count = sc.parallelize(range(0, num_samples)).filter(inside).count()

pi = 4 * count / num_samples
print(pi)

sc.stop()

SparkContextについて補足説明

SparkContextは、演算クラスタへの接続を表現します。

Sparkのドライバプログラムは、SparkContextオブジェクトを通してSparkにアクセスします。Sparkの各処理はこのSparkContextを経由して実行します。

以上で、Jupyter上でいつでもSparkを利用できるようになりました!

今後は、実際のユースケースに対してSparkがどのくらい効率的に処理できるかの比較検証も行なってみたいと思います。

本日も最後までご覧いただきありがとうございました!

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。