第4回まではHadoopの活用事例や、どのような用途に向いているのかということを中心に解説してきました。さて、最終回となる第5回は、Hadoopをこれから活用し始めようとしているエンジニアが理解しておくべきことや、情報収集のポイントなどについて解説します。
Hadoopの構成要素を理解する
Hadoopの導入を検討する際には、まずは構成要素を理解しておきましょう。Hadoopは大きく2つの要素から成り立っています。1つは分散ファイルシステムの「Hadoop Distributed File System(HDFS)」、もう1つは分散処理フレームワーク「Hadoop MapReduce(MapReduceフレームワーク)」です。どちらも大量のサーバから構成されるクラスタシステムとして動作します。現在はWebから得られる情報や書籍が充実しているのでここでは詳しい説明はしませんが、こういったソースから情報収集する際に注目しておくべきポイントとしては、HDFSとMapReduceフレームワークの場合には、たとえば次のようなものがあります。
- HDFS
- アーキテクチャ
- スケーラビリティ
- ファイルの管理方法
- 扱うファイルのサイズ
- アクセスパターンの向き不向き
- 信頼性確保の仕組み
- 障害発生時の挙動
- その他制約事項
- MapReduceフレームワーク
- アーキテクチャ
- スケーラビリティ
- HDFSとの関係
- 処理方式(バッチやオンライン)の向き不向き
- 分散処理モデル(map関数/reduce関数の処理特性、処理するデータの特性)
- 処理フロー
- 障害発生時の挙動
- その他制約事項
こういったポイントに注目して情報収集すれば、Hadoopの構成要素について、より深い理解が得られます。
利用するHadoop、OS、Javaの種類について理解する
続いてはHadoopをインストールする前に留意しておくべき、Hadoopのバージョンやディストリビューションの違い、および使用すべきOSとJavaの種類について解説します。
Hadoopはまだ発展を続けているプロジェクトです。現在もバージョンアップに伴い、大小さまざまな変更があります。最近ではバージョン0.19から推奨されるAPIが変わったり、またバージョン0.21からはプロパティの名前が変更されたりしました。
バージョンの違いだけではなく、ディストリビューションによっても違いがあります。実は、HadoopにはApache Software Foundationがメンテナンスしている、いわゆる「コミュニティ版」と、コミュニティ版をベースにベンダがカスタマイズしたディストリビューションがあります。これにはたとえば、Cloudera社が整備・配布している「CDH」などがあります。このようなカスタマイズされたディストリビューションではHadoopをより使いやすくするための工夫がされています。
たとえば、CDHでは各種Linuxディストリビューション用にインストールパッケージを用意したり、Hadoopとの組み合わせを検証済みのPig、Hiveなど周辺ソフトウェアを同梱したりといったものがあります。このほかにも、開発効率や安定性を目指してCDHではHadoopの特定のバージョンをベースとしつつも、上位のバージョンの有用な機能、APIやバグフィックスをバックポートしています。
HadoopをインストールするOSにはどんな制約があるのでしょうか。Hadoopはどのディストリビューションでも基本的にはLinuxを対象としています。さらにHadoopのディストリビューションによってはサポートしているLinuxのディストリビューションに制限がある場合があります。カーネルについては32-bit版、64-bit版どちらでも動作するのが普通ですが、利用可能なメモリ量などを鑑みると64-bit版のカーネルを利用するのが良いでしょう。WindowsでもCygwin上でHadoopを動かすことは可能ですが、本格的に活用する場合にはやはりLinuxにインストールすべきです。
この他にHadoopをインストールするうえで留意しておくべきことは、Javaの種類やバージョンです。コミュニティ版やCDHを利用する場合にはOracle Javaの最新版を利用することが多いです。残念ながら現在コミュニティ版やCDHではOpenJDKはサポートされていません。Oracle Javaでも、バージョン1.6.0_18は動作が不安定になるといったバグが報告されているので、利用するJavaのバージョンについては事前に確認したほうが良いでしょう。
こうしたバージョン、ディストリビューションの違いや対象のOS、サポートしているJavaの種類などは各Hadoopディストリビューションのページや、Hadoopをダウンロードした際に同梱されているインストールマニュアルやリリースノート、ChangeLogなどで確認することができます。Hadoopを利用する際には、このようなバージョンや制約事項を把握しておくことが大切です。
MapReduceアプリケーションの開発方法を理解する
HadoopではMapReduceフレームワークやHDFSを操作するためのAPIが提供されていますが、ここでは主にMapReduceアプリケーションを開発する際に理解しておくべきことを解説します。
MapReduceアプリケーションを開発するためには、通常はHadoopが提供するJavaのAPIを利用します。この場合は、MapReduceアプリケーションを開発するために最低限実装すべきクラスやメソッドを理解することに加え、APIの使い方などコーディングの基本を理解する必要があります。これらは、Webの情報や書籍で学習するのもよいですし、実際に動くプログラムのソースコードから学習するのもおすすめです。
Hadoopをインストールすると、コミュニティ版でもCDHでもサンプルプログラムとそのソースコードが付属します(※1)。サンプルプログラムには分散grepや分散ワードカウントなど、比較的簡単なものが含まれており、ソースコードも簡素です。実際に動かしながらソースコードを眺めることで、MapReduceアプリケーションの開発方法の理解に役立てることができます。
Javaが利用できなくても、Hadoopが提供する「Hadoop Streaming」という仕組みを利用すれば、たとえばPythonやRuby、シェルスクリプトなど、任意のプログラミング言語でMapReduceアプリケーションを開発することができます。Hadoop Streamingの利点は任意のプログラミング言語で開発できることだけではありません。Javaで開発するとなると、「MapReduceジョブを制御するクラスやMapperクラス、Reducerクラスを実装し、各種設定をコーディングしてコンパイル……」というように、簡単な処理を行うMapReduceアプリケーションでも、本質となるロジックとは異なる部分のコーディングを行う必要があったり、踏まなければいけない手順が多かったり少し身構えてしまいます。しかし、Hadoop Streamingを使えばシェルスクリプト任意のプログラミング言語でmap関数に相当するロジックとreduce関数に相当するロジックを定義するだけで、簡単にMapReduceアプリケーションが開発できるのです。思いついたロジックを気軽に試してみたいという場合にも最適です。
MapReduceフレームワークを直接操作する以外にも、PigやHiveといったMapReduceアプリケーションをより簡単に開発するための周辺ツールを利用する方法もあります。たとえばHiveなどはHiveQLというSQLに似た言語を使ってMapReduceフレームワークを利用することができるので、SQLに慣れたユーザーならばとっつきやすいかもしれません。ツールの特性と処理したい内容への適性を見極め、こういったツールを検討するのもよいでしょう。
困ったときは
MapReduceアプリケーションの開発・テスト時や、システムの運用時には、突如トラブルに見舞われることもあるかもしれません。そんなときはどうすればよいでしょうか?まずはログや画面の表示からエラーメッセージを控えておきましょう。それをもとに、まずは設定の誤りを疑ったりアプリケーションのロジックを見直したりしてみてください。それでもやはりトラブルが解決しない場合は、Hadoop自体に潜むバグかもしれません。バグかどうかは、各ディストリビューションの課題管理システムで調べることができます。たとえばコミュニティ版やCDHではJIRA[2]でバグを管理しています。JIRAで調査する際には、調査対象のコンポーネント(HDFSやMapReduceなど)を選択し、エラーメッセージの一部を検索ボックスに入力して検索するのが簡単です。
このように、まずは自分の力で解決する努力をするべきですが、JIRAからも類似のバグが発見できない場合には、Apache Software Foundationがホストしているメーリングリストを活用したり、Hadoopユーザー会に参加してメーリングリストやGoogleグループでのディスカッションに参加したりという方法もあります。Hadoopユーザー会は国内のHadoopユーザの集まりなので日本語で意見交換ができるため、初めてHadoopに触れる方にも敷居が低いのではないでしょうか。
さらにHadoopユーザー会には第一線でHadoopを活用しているエンジニアも参加しており、有益な意見が聞ける場でもあります。トラブル解決以外にも、情報交換の場として積極的に活用するのが良いでしょう。
まとめ
今回はHadoopの導入を検討しているエンジニア向けに、導入前に知るべきことやアプリケーション開発前に知るべきこと、および情報の探し方などを解説しました。今回解説したことはHadoopを活用するスタートラインに立つために必要なことです。
さらにHadoopを活用するためには、アプリケーションエンジニアについては使用するデータのアクセスパターンやサイズなどを考慮したデータ配置の最適化スキルや、Hadoopに限らない分散処理特有の課題である「処理量の偏り」を最適化するスキルなどが求められますし、基盤系エンジニアにはミドルウェアのチューニングスキルや運用・監視設計スキル、可用性設計スキルなどが求められます。このようにエンジニアが身に着けなければならないスキルは多いですが、試行錯誤や情報交換を通じて研鑽し、Hadoopを使いこなしましょう。そしてHadoopを活用して眠っている大量のデータから有益な情報の発見や分析を行い、皆さんのアイデアを活かした新たなビジネスを開拓していきましょう。