現在位置: ホーム / ゲストブログ / [新連載] 旬のオープンソースソフトウェア~超高速インメモリ処理のSparkって何?どうやって使うの?前編~

[新連載] 旬のオープンソースソフトウェア~超高速インメモリ処理のSparkって何?どうやって使うの?前編~

今回から、ゲストブログ連載第2弾として、日本ヒューレット・パッカードが公式に認定するオープンソース・Linuxテクノロジーエバンジェリストで、Hadoopの技術者認定資格を保有する古賀政純さんが、旬のオープンソースソフトウェアについて連載でお届けします。 連載第1回は、ビッグデータ向けソフトウェアのSpark(スパーク)について前編・後編でご紹介します。2015年、オープンソースのビッグデータ処理基盤ソフトウェアとして急速に注目を浴びているのがSparkです。ビッグデータのオープンソースソフトウェアといえばHadoop(ハドゥープ)が有名ですが、なぜ今、Sparkなのでしょうか? 前編は、Hadoopとの位置づけを明確にしながら、その理由を探ります。(2015年09月02日)

 

■脳の働きをコンピューターで模倣する

筆者は、学生時代に「ニューラルネットワーク」と呼ばれる脳の神経の情報伝達を模倣したコンピュータープログラムを作成し、シミュレーションを行っていました。ニューラルネットワークは、簡単に言うと、脳の神経細胞を模倣したモデルで、コンピュータープログラムで作成できます。このニューラルネットワークを使うことで、物事の学習、過去の情報からの推定、分類など、人間が脳で行う機能の一部をコンピューターで実現することができます。

しかし、このニューラルネットワークを使った学習は、比較的、高性能なコンピューターハードウェアの高い計算能力が求められる上、計算結果を人間に分かりやすく可視化するためのツール類なども自前で用意しなければならないことや、入力するデータの種類や課題によっては、計算結果を得るまでに膨大な時間がかかるなど、実用化に高いハードルがありました。筆者が学生時代だった1990年代のコンピューターは、メモリ容量も小さく、CPUも非力なコンピューターでしたので、非常に小さなデータで学習・推定を行うだけでも、結果を得るまでにかなりの時間がかかるという状況でした。

また、複数のコンピューターを使った並列プログラミングとしては、MPI(Message Passing Interface)や、マルチコアCPUによる複数スレッド処理を可能とするOpenMPなどが当時からありましたが、これらを使って、ニューラルネットワークのプログラムを実用的なレベルで並列化・高速化して実行するには、かなりのプログラミングスキルを要するものでした。

ニューラルネットワーク

図1. ニューラルネットワーク

 

筆者が学生時代から利用しているニューラルネットワークの書籍

図2. 筆者が学生時代から利用しているニューラルネットワークの書籍

階層型ニューラルネットワーク―非線形問題解析への応用― (共立出版)
著者:市川 紘
発行年月:1993年06月 
 

その後、コンピューターの計算処理能力が劇的に向上し、近年ブームになっている人工知能などの知識工学の分野の発展・応用に伴い、ニューラルネットワークが再び大きな注目を浴びるようになりました。現在、ニューラルネットワークは、巷で話題となっている機械学習(広義に人工知能の一種として解釈して差し支えありません)や深層学習と呼ばれる、コンピューターを使った学習のエンジンとして利用されています。

2015年現在、機械学習は、様々な分野に浸透しており、文書間の類似度の推定、リアルタイムな故障予測、創薬のモデリングなどにも使われています。

機械学習の事例は、インターネット上で数多く公開されていますが、創薬のモデリングについては、日本ヒューレット・パッカードの大規模メモリ搭載サーバーを使ったベンチマーク結果の報告書が公開されています。この報告書では、テラバイト級の大容量メモリを搭載したサーバー上で稼働させる機械学習のアルゴリズムの種類や、高速処理のためのマルチプロセッシングを実現するPython言語のプログラムのソースコードなども掲載していますので、一読することをお勧めします。

HP ProLiant DL980 G7を用いた大規模新薬モデリング 報告書:http://h50146.www5.hp.com/products/servers/proliant/whitepaper/pdfs/kyotouni.pdf

創薬モデリングと機械学習

図3.創薬モデリングと機械学習
 

データ分析の人材が不足している

近年、欧米のサービスプロバイダーにおけるR&D部門などでは、機械学習、深層学習の利用が進み、2015年現在もビッグデータを中心としたデータ分析の人材が求められています。

しかし、日本では、依然として、機械学習などの高度な分析の知識・技能を持つ人材が不足している状況にあります。総務省が出している平成26年版情報通信白書(PDF版)の167ページの図表2に、データ分析の訓練を受けた大学卒業生の数が国別に掲載されており、日本は、11位で米国やBRICs諸国に比べ、先進国としては、非常に人数が少ないことが分かります。

総務省が公開している情報通信白書平成26年版:http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h26/pdf/26honpen.pdf

総務省_情報通信白書_平成26年版_図表2

図4. データ分析の訓練を受けた大学卒業生の数(総務省の平成26年度版情報通信白書 167ページの図表2)

日本のみならず、欧米でもデータ分析の訓練を受けた人材が不足しています。しかし、単にデータ分析を行う技能だけでなく、統計学、工学的手法、コンピュータサイエンスを駆使し、企業における膨大なデータから洞察を得て、現実的な事業戦略、経営戦略に落とし込む能力が求められています。

ちなみに、筆者が学生時代に、ニューラルネットワークのシミュレーション以外に、MATLAB(マトラボ)と呼ばれるデータ分析ツールを少しだけ使っていたのですが、MATLABは、小規模な行列計算や簡単な数値計算のパラメータ推定のツールとして使っていたため、機械学習の分析ツールとして全く使っていませんでした。今から思えば、MATLABを機械学習エンジンとして使っていれば、もっとエキサイティングな研究ができたのではないかと、今でも少し後悔しています。 

機械学習とオープンソース

データを分析する人材が世界的に不足している一方で、分析用のソフトウェアは、飛躍的に発展を続けています。Sparkの紹介の前に、Spark登場以前から存在する機械学習用のソフトウェアについても少し触れておきます。

機械学習や深層学習と呼ばれるような学習機能を実現するソフトウェアとしては、HadoopのエコシステムであるMahout(マハウト)や、Jubatus(ユバタス)、Caffe(カフェ)などが知られています。これらのソフトウェアはオープンソースで提供されており、無料で入手して利用できます。

このうち、Mahoutは、ビッグデータ基盤ソフトウェアであるHadoopを利用するエコシステムソフトウェアとして有名であり、比較的簡単に機械学習を体験することができます。しかし、Hadoopの並列処理の仕組みであるMapReduceの処理手順が多段にわたる場合に発生する遅延の問題などがMahoutの機械学習のアルゴリズムを高速に稼働させる上で障害になることが知られています。

一方、Jubatusは、データをインメモリで処理するため、非常に高速に処理することができます。今回ご紹介するSparkにも機械学習ライブラリがありますが、Jubatusは、Sparkが登場する以前の2011年から、すでにインメモリ処理による高速な機械学習エンジンとして利用されています。

これらオープンソースソフトウェアは、機械学習の繰り返し処理を行う特性上、高速のマルチコアCPUと大容量メモリを搭載したサーバーで稼働させる傾向にあります。物理サーバー1台で処理させるというよりは、むしろ、業界標準のx86サーバーを複数台並べるスケールアウト型のクラスターとして稼働させることで、計算能力の向上を図るのが一般的です。 

機械学習の活用例とオープンソース

図5. 機械学習の活用例とオープンソース


■Sparkの紹介

Hadoopを補完するSpark

一般的に、ニューラルネットワークによるシミュレーションや機械学習では、繰り返し処理が多用されます。優れた数学モデルと優れたアルゴリズムを使えば、繰り返し処理を減らすことができるのですが、コンピューターにおける学習は、プログラムにおける「繰り返し処理」がメインであり、実用的な観点では、いかに繰り返し処理を高速に処理し、ターン・アラウンド・タイムや遅延を短縮できるかがポイントになります。

Hadoopでは、大量のx86サーバーの内蔵ディスクを使って分散ファイルシステムを構成し、MapReduceと呼ばれる並列処理の仕組みを使って、スケールアウトメリットを活かして高速なバッチ集計処理や分析を行うことができます。

しかし、機械学習のような繰り返し処理を行うような場合は、Hadoopの分散ファイルシステムのディスクI/Oや、HadoopのMapReduceの仕組みが足かせになることがあります。HadoopのMapReduceでは、処理の途中において中間ファイルがディスク上に生成されることが性能向上の面での懸念点として指摘されています。このHadoopにおける諸問題を解消し、Hadoopを補完すべく登場したのが、いま巷で話題となっているApache Sparkです。

Apache Sparkとは?

Spark は、2009年にカリフォルニア大学バークレー校のAlgorithms, Machines, and People Lab(通称AMP Lab)において、ビッグデータ分析用のアプリケーション向けに開発されました。その後、Apacheコミュニティに提供され、2010年にオープンソース化されたことから、世界中のビッグデータ利用者に知られるようになりました。

Sparkを作ったAMP Labは、2013年に米国Databricks社を設立し、Sparkの開発、技術者認定、トレーニングなどを行っています。2015年8月現在、Sparkは、Apacheのトップレベルプロジェクトに位置付けられ、コミュニティによって改良が進められています。

Sparkの特徴は、超高速なインメモリ処理だけではない

Hadoopにおいて、データは、Hadoopクラスターを構成する各ノードの内蔵ディスク上にブロックに分割されて記録・保管されるのが特徴的です。一方、機械学習や深層学習のような繰り返し処理を得意とするSparkでは、対象データをメモリ上に配置し、インメモリで分散処理を行います。

データをメモリ上に配置し、インメモリでデータを処理するため、非常に高速な分析エンジンとして利用することができます。Apache SparkプロジェクトのWebサイトでも紹介されていますが、ロジスティック回帰分析とよばれる処理では、HadoopのMapReduceに比べ、Sparkのインメモリ処理が100倍以上高速に処理できることが紹介されています。

Apache SparkプロジェクトのWebサイトのURL:https://spark.apache.org/

Sparkは、インメモリ処理により非常に高速であることがよく特徴として取り上げられますが、それだけではありません。Sparkでは、SQLクエリエンジンである「SparkSQL」や、機械学習ライブラリ「MLlib」、リアルタイムに生成されるデータをストリーミング処理する「Spark Streaming」、大量のグラフデータを処理するフレームワーク「GraphX」、そして、最新のSpark 1.4系では、統計解析に利用されるR言語からSparkを操作する「SparkR」を備えています。

Spark自体は、Scalaと呼ばれる言語で実装されており、Scalaを使ったプログラミングを行うことが可能です。Scala以外にも、PythonやJavaにも対応しています。また、Sparkは、HadoopのHDFSを利用することもできます。Spark自体は、インメモリの分散処理基盤を提供しますが、データは、HadoopのHDFS、あるいは、NFSサーバーに保管されたものを共有するといった利用があげられます。Hadoopをすでに持っているのであれば、HDFS上のデータを簡単に参照できるため、HDFS上のビッグデータをSparkによってインメモリで高速に処理することが可能です。

Sparkとエコシステム

図6. Sparkとエコシステム

Sparkの動作環境

以下では、Sparkの具体的な動作環境や必要条件などを簡単に紹介します。Sparkは、1台のサーバーだけで利用することも可能ですが、通常、スケールアウト型のシステムで構成されます。構成としては、マスターノードとワーカーノードに分かれ、マスターノードでは、Sparkアプリケーションの起動のための管理プロセスやSparkクラスターの管理を行うノードです。ワーカーノードでは、Sparkアプリケーションが稼働します。Sparkは、ワーカーノードを大量に並べ、スケールアウトのメリットが得られるアーキテクチャです。

マスターノード、ワーカーノードともに、一般的なx86サーバーが利用されますが、Sparkの得意とするインメモリによる繰り返し処理を考慮し、動作周波数が高くコア数の多いCPUと大容量メモリを搭載できるサーバーで構成すべきです。ワーカーノード間は、10ギガビット・イーサネットなどの高速なインターコネクトを利用するのがよいでしょう。

OSについては、RHEL/CentOS、Ubuntu Serverなどの代表的なLinux OSで動作が可能ですが、Red Hat系OSを採用する場合、テラバイト級の大規模メモリへの対応やファイルシステムの性能などの観点から、できるだけRHEL 7.xやCentOS 7.xなどの最新のサーバーOSを使うようにしましょう。

マスターノードと、ワーカーノードのサーバーの機種を揃える必要はありませんが、OSのバージョン、Java、Python、そして、Sparkなどのオープンソースソフトウェアのバージョンは、統一しておくのがよいでしょう。

Sparkのマスターノードとワーカーノード

図7. Sparkのマスターノードとワーカーノード

少しだけSparkの内部を知る ~ DriverとExecutor ~

Sparkでは、アプリケーションの実行の仕組みを担うDriverプログラムとExecutorを理解する必要があります。SparkにおけるDriverプログラムは、アプリケーションのmain関数を実行するプロセスであり、Sparkコンテキストと呼ばれるオブジェクトを生成するJavaプログラムです。

一方、Executorは、ワーカーノードで稼働し、お互いに通信しながら、タスクを実行や、メモリまたはストレージ上にあるデータを保持します。Driverプログラムは、どのExecutorでいつタスクを実行するかを決定する役目を担っています。Sparkでは、クラスター全体のリソースを管理するクラスターマネージャーが存在します。クラスターマネージャーには、以下の3タイプが存在します。

  • Standalone:Sparkだけで稼働するシンプルなクラスターマネージャー
  • Apache Mesos:HadoopのMapReduceを稼働させることができるクラスターマネージャー
  • Hadoop YARN:Hadoop 2.0で利用されているリソースマネージャー

 

このクラスターマネージャーは、Driverプログラムが持つSparkコンテキストやワーカーノードとやりとりを行い、Spark上で実行するアプリケーションにExecutorを割り当てる役目を担っています。

Sparkは、HadoopにおけるYARNやApache Mesosといったこれらのリソースマネージャーで動作することが可能です。なお、このDriverとExecutorに割り当てるメモリ容量などがアプリケーションの実行可否や性能に影響しますので、注意が必要です。

SparkのDriverプログラムとExecutor

図8. SparkのDriverプログラムとExecutor

 


 

今回は、Sparkの概要を簡単に紹介しました。第2回の後編では、Sparkのインストール手順、基本的な使用法、Scalaシェルの使い方、そして、複数ノードから構成されるSparkクラスターの構築、シミュレーションの実行手順も具体的に紹介します。お楽しみに。

各種お問い合わせ

サイオスOSSよろず相談室(1)

問い合わせボタン

最新の情報
[第17回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ ハードウェアに搭載されている電源管理・電力管理機能とLinuxの関係 ~ 2017年07月19日
[第16回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ CPUの仮想化支援機能 ~ 2017年07月05日
[第15回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 Linuxサーバーのためのハードウェア設定 ~ Hyper-Threading ~ 2017年06月21日
わかっておきたいセキュリティ: 第5回 VirusTotal at Home/Work「Malice」 2017年05月10日
わかっておきたいセキュリティ: 第4回 IRMA (Incident Response Malware Analysis) 2017年03月29日
わかっておきたいセキュリティ: 第3回 マルウェア解析サンドボックス「Cuckoo」との連携 その2 2017年02月22日
[第14回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その4 2017年02月08日
[第13回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その3 2017年02月01日
[第12回] Linux/OSS エバンジェリスト古賀政純の 『オープンソース・Linux超入門』 システム要件において検討すべき点 その2 2017年01月25日
[第11回] Linux/OSS エバンジェリスト古賀政純の『オープンソース・Linux超入門』 システム要件において検討すべき点 その1 2017年01月18日
Python人材育成の支援を目的としたPythonエンジニア育成推進協会の活動とは? 2016年12月21日
わかっておきたいセキュリティ: 第2回 マルウェア解析サンドボックス「Cuckoo」との連携 2016年12月14日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第3回 オープンソースライセンスの使い方をわかっておきたい 2016年12月08日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第2回 色々なオープンソースライセンスをわかっておきたい 2016年11月30日
可知豊の『 わかっておきたい、オープンソースライセンス』: 第1回 著作権とライセンスをわかっておきたい 2016年11月17日
わかっておきたいセキュリティ: 第1回 マルウェア解析サンドボックス「Cuckoo」 2016年11月02日
[第10回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ RHELを知る ~ 2016年10月26日
[第9回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』 Linuxサーバーシステム導入前の検討~ Ubuntu Serverを知る ~ 2016年10月19日
[第8回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』  Linuxサーバーシステム導入前の検討~ SUSEを知る ~ 2016年10月12日
[第7回] Linux/OSS エヴァンジェリスト古賀政純の 『オープンソース・Linux超入門』~「初心者でもわかる、Linuxサーバーシステム活用者が知っておくべきポイント」(後編) 2016年08月09日
最新の情報 - もっと...