1. ホーム >
  2. ブログ ~人材育成最前線~ >
  3. 【今求められる人材】夏の思い出はApache Sparkとともに... "Spark the season in the sun!" その2

【今求められる人材】夏の思い出はApache Sparkとともに... "Spark the season in the sun!" その2

[2014年9月18日]

 こんにちは、富士通ラーニングメディアの田中です。前回に引き続き、「夏の思い出はApache Sparkとともに... "Spark the season in the sun!"」ということで、Apache Sparkについて調査した結果を紹介します。

今回は、Sparkの関連プロジェクトと、SparkクラスタをAmazon EC2上に簡単に構築できる、spark-ec2スクリプトの使い方を紹介します。

 

講師画像

プロフィール:田中 健太

ビッグデータ、クラウドおよびシステム基盤関連の研修を担当。
組版ソフトTeXや、統計解析ソフトRなど、OSS関連のコミュニティ活動を学生時代から続けています。
また、趣味で南関東4場はもちろん、金沢、高知、荒尾、帯広ばんえいと、日本各地の競馬場を巡っています。めざせ、国内全15場踏破!

   

<Sparkの関連プロジェクト>

SQLによる検索や機械学習など、Sparkをより便利に活用するためのさまざまな関連プロジェクトがあります。いずれも、Spark本体と緊密に連携しながら開発されているため、特別な作業や設定は必要なく、容易に利用できます。以下に、Sparkが公式にサポートしている関連プロジェクトを紹介します。

Spark SQL
少し前まで、Sharkと呼ばれていました。Sparkのシェルまたはプログラム中でSQLクエリを発行できます。HadoopにおけるHiveと同じ位置づけです。また、Spark以外のRDBMSやBI(ビジネスインテリジェンス)ツールとの間で、JDBCやODBCドライバによる接続も可能です。

Spark Streaming
TwitterやApache Flumeなどのストリームデータを読み込み、リアルタイム処理ができます。JavaとScalaから利用できます。

MLlib
機械学習のためのライブラリです。機械学習とは、大量のデータから何らかの規則性(パターン)を発見し、分類や予測に役立てる統計学の応用的手法です。Scala、Java、Pythonでそれぞれ利用できます。現在のところMLlibでは、クラスタリング(k-means法)、線形回帰、ロジスティック回帰、決定木、サポートベクターマシン(SVM)、ナイーブベイズ分類器、協調フィルタリング(レコメンド)、数理計画法、次元削減などを行う機能が提供されています。HadoopにおけるMahoutと同じ位置づけです。

......なんのことだか、という方も多いと思いますが、要はビッグデータに対する難しい統計手法を、関数を呼び出すだけで簡単に利用できる、ということです。なお、上述のMahoutは、今年に入って"Goodbye, MapReduce"とHadoopからSparkへ開発の重心を移すことを発表しています。

GraphX
「グラフ」を作成するためのライブラリです。グラフといっても、普段ビジネス文書などで用いる円グラフや棒グラフのことではありません。数学の分野である「グラフ理論」をもとにした、モノや人、情報どうしのつながりを"ノード"と"エッジ"で表現するものです。

......これもなんのことだか、という方が多いと思います。例を挙げるとすれば、Webページ間のハイパーリンクによるつながりの分析(ページランク)があります。Webページは自身から別のページへのリンクを持ち、複雑なつながりが形成されています。単純には、多くのWebページからリンクされているページは、情報量の多い価値のあるページと言えます。それぞれのWebページをノード、リンク元からリンク先へのパスをエッジとして表現し、多くのエッジが集まるノードに高い点数を与え、Webページの価値を評価します。他にも、ソーシャルメディアにおいては、ユーザのつながり(Facebookの友達、Twitterのフォロワーなど)をグラフ構造として扱い、サービス提供に活用しています。

 イメージ図

 図5: SNSにおけるユーザのつながりを分析した例(当社Twitterとフォロワーの関係)

 GraphXは、そのようなグラフ理論に基づく分析を高速に実行できる機能を提供します。

 

<Apache Sparkの導入方法>

さて、ここまでSparkのさまざまな機能を紹介してきました。Sparkの魅力が少しはお伝えできたでしょうか。ここからは、Sparkを使ってみたいな、と思った際にどのようにして導入すればよいかをご紹介します。

Sparkの導入方法は大きく分けて5つあります。

  1. Sparkをソースからインストールする
  2. Sparkのバイナリパッケージをインストールする
  3. spark-ec2スクリプトを用いて、Amazon EC2上に仮想マシンとSpark環境をデプロイする
  4. Cloudera社が提供するCDHディストリビューションを用いて、Sparkを含むデータ分析環境のバイナリパッケージをインストールする
  5. MapR社が提供するMapRディストリビューションを用いて、Sparkを含むデータ分析環境のバイナリパッケージをインストールする

1. の方法では、Scalaのビルドツールであるsbtが必要です。2. の方法で導入されるのはSparkのみなので、別途HadoopやHDFSのインストール、設定が必要です(逆に言えば、HDFSが不要であれば、プロジェクトのサイトからバイナリパッケージをダウンロードし、適当なディレクトリに展開するだけでインストールは完了です)。4. および5. の方法では、各ディストリビュータが提供するドキュメントを参照し、導入作業を行います。多くの場合、Spark以外にもさまざまな要素をインストールする必要があります。

現在開発中の、「体験!Apache Spark」(UBS66L)では、3. のspark-ec2スクリプトを用いた方法を採用しています。実際に教室から、Amazon EC2上に仮想マシンを展開し、実習環境をご自身で構築いただけます。構築、といってもコマンドを実行して10分ほど待つだけの、とてもお手軽な仕組みなのですが。

 イメージ図

 図6: spark-ec2スクリプトを実行した様子

なお、Sparkを複数台のサーバからなるクラスタ構成で利用したい場合は、クラスタを管理するクラスタマネージャを導入する必要があります。Sparkでは、以下の3つのクラスタマネージャを利用できます。

  1. Spark自身が提供するクラスタマネージャ機能(Standalone mode)
  2. Hadoop YARN
  3. Apache Mesos

YARNとMesosは、方向性としては同様で、クラスタのリソースをHadoopやSpark、その他さまざまなアプリケーションでシェアするためのリソース管理を行うためのものです。ビッグデータ分析基盤を整備し、HadoopやSparkやApache Stormなどを使い分ける、というような場合にはYARNやMesosを利用したほうがよいでしょうが、「体験!Apache Spark」ではStandalone modeを採用しています。

<spark-ec2スクリプトとは>

Sparkのソースまたはバイナリパッケージを展開したspark-1.X.X-bin-hadoopX/ec2ディレクトリにspark-ec2スクリプトがあります。このシェルスクリプトから、spark_ec2.pyスクリプトが呼び出されます。

spark-ec2スクリプトは、名前の通りSparkをAmazon EC2上に構築するためのスクリプトです。コマンドラインでパラメータを指定してスクリプトを実行するだけで、仮想マシンのデプロイからSpark環境の構築までを自動的に行います。大規模なクラスタも、コマンド1行で構築可能です。

■spark-ec2スクリプトのオプション
spark-ec2スクリプトのオプションのうち、重要だと思われるものを大まかに訳しました。

 

 -k [キーペア名] : 暗号接続のためのキーペア名 (事前作成) を指定
 -i [キーペアファイル名] : キーペア (事前作成) のファイル名を指定
 -s [数値] : スレーブサーバの台数
 -t [インスタンス種別] : 使用するインスタンスの種別 (EC2サイトを参照)
 -m [インスタンス種別] : マスタサーバのみインスタンス種別を変えたい場合
 -r [リージョン] : デプロイするリージョンを選択 (デフォルトはus-east)
 -z [ゾーン] : デプロイするアベイラビリティゾーンを選択 (デフォルトは各リージョンごとに異なる)
 -v [バージョン] : 使用するSparkのバージョンを指定 (デフォルトは最新版)
 --hadoop-major-version=[バージョン] : Hadoopのバージョンを指定 (デフォルトは1)
 --ebs-vol-size=[サイズ (GB単位)] : ディスクを追加する (/volにマウント)

 

■spark-ec2スクリプトの使い方
また、スクリプトの使い方について、よくあるパターンをいくつか紹介します。

 

 # Sparkクラスタをデプロイする
   (スレーブ2台、m3.largeインスタンス、Hadoop2を使用、クラスタ名はSpark01)
 ./spark-ec2 -k [キーペア名] -i [ファイル名] -s 2 -t m3.large
 --hadoop-major-version=2 launch Spark01

 # Spark01クラスタにログインする (デフォルトユーザはroot)
 ./spark-ec2 -k [キーペア名] -i [ファイル名] login Spark01

 # Spark01クラスタを一時停止する (データ消失に注意)
 ./spark-ec2 -k [キーペア名] -i [ファイル名] stop Spark01

 # Spark01クラスタを再開する
 ./spark-ec2 -k [キーペア名] -i [ファイル名] start Spark01

 # Spark01クラスタを削除する
 ./spark-ec2 -k [キーペア名] -i [ファイル名]
 --delete-groups destroy Spark01

 

なお、spark-ec2スクリプトでデプロイされる仮想マシンでは、標準でephemeral(一時的)なHDFSを作成します。そのため、stopサブコマンドを実行すると、HDFS上のデータは削除されます。次回起動時(startコマンド実行時)には、再度HDFSのフォーマットが行われます。利用しない時間帯にクラスタの電源を落とすことで、使用量の抑制ができますが、データの消失には注意してください。なお、データを保持し続けるには、persistent(恒久的)なHDFSを利用する必要があります。spark-ec2スクリプトでデプロイするクラスタでは、両方を利用できますので、ドキュメントを参照して、適切な場所にデータを保存してください。

<Sparkにおけるジョブの実行>

ここまで、Sparkクラスタを構築する方法を見てきましたが、次にSparkクラスタ上でバッチジョブを実行する方法を紹介します。詳しくは、「体験!Apache Spark」をご受講いただければと思いますが、以下にSparkに付属するサンプルのPythonスクリプトをEC2上のSparkクラスタで実行した様子を示します。

 

 # クラスタ全体でCPUを4コア使用して計算する。末尾の10はPythonスクリプトのオプション
 spark/bin/spark-submit --total-executor-cores 4 spark/examples/src/main/python/pi.py 10

 

イメージ図

 図7: EC2クラスタでサンプルのPythonスクリプトを実行した様子

以上のように、Sparkにおいてバッチジョブを実行(投入)するには、spark-submitコマンドを使用します。EC2クラスタの場合は、上述のコマンドを実行すると、マスタサーバ(コマンドを実行した仮想マシン)からワーカーノードにデータとジョブが転送され、実行されます。その他のオプションなど詳細は、Sparkのドキュメントを参照してください(非常に難解です)。

<まとまらないですが、まとめ>

ということで、長々と新しいビッグデータ技術として注目されるApache Sparkについてご紹介しました。実際のところ、ここまでの内容は単にクラスタを起動しただけで、まだ何の処理も行っていません。Sparkにおけるインタラクティブ/バッチ処理や関連プロジェクトとの連携については、「体験!Apache Spark」コースやその他Web上のリソースで学習してください。

Hadoopがビッグデータ処理のスタンダードになって久しいですが、一方で課題も見えてきました。Sparkは、その課題を突破する可能性を秘めていると思っています。まだ、書籍として情報がまとまったものがないなど、発展途上な部分はありますが、今後に期待が持てる技術だと考えています。ぜひ皆さんも、新しい技術に触れてエンジニア魂を「スパーク」させませんか?

 

なお、お約束である文献紹介については、上述したようにSparkに関する書籍がほぼない(オライリー本さえも!)ので、ここでは参考となるリンクをいくつかご紹介します。

 

 ご参考までに。。

☆コラムでご紹介した「Apache Spark」の概要を、豊富な実習で体験できるコースです。

→ 体験!Apache Spark  

☆そのほか、新しいビッグデータ技術として注目のコースをはじめ、データ活用のための技術や、 データ分析する方法論など、当社がご提供するビッグデータ関連コースもご参考にしてください!

 ビッグデータ関連研修コースのご紹介

講習会で皆様とお会いできることを楽しみにしております。

月別アーカイブ