無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

Hadoopハンズオンセミナーに参加してきました。

黄色いゾウさんすげー!な体験です(`・ω・´)
昨日04/14に開催されました、Hadoop初心者向けハンズオンセミナーに参加してきました。

セミナーでは、前半にHadoopについての説明。後半から実際にHadoopを使ったプログラミングを行いました。
後半のプログラミングでは事前に提示されていた準備があったのですが、事前準備のメールが来ていないことに到着してから気づき、会場についてから必死で準備していたのは私です。
ええ、UbuntuJavaも準備出来ていませんでしたよと。モウシワケナイ・・・
メール来なかったのは、メールアドレス間違えてたこちらのミスでした。大変お手数をおかけしました。快く主催さんのサーバー環境貸して頂き、なんとかハンズオン中に動くものができました。感謝してもしきれません。
主催のAcroquest Techonology株式会社様。貴重な体験をさせて頂き大変勉強になりました。ありがとうございました。

セミナーではHadoopの動作の中身といった詳しいお話もあり、初めて触れたHadoopでしたが、概要は理解できました(・ω・)
Hadoopについて知ったことを書いてみたいとおもいます。

そもそも、Hadoopとはなんぞや?

Hadoopとは、ある巨大なデータを複数のマシンで分散処理しより高速に分析を行うことができるフレームワークで、Googleが提唱したMapReduceJavaで実現したものです。Apacheのトップレベルプロジェクトの一つとして位置づけられています。2007/9/04に最初の版がリリースされています。思っていたより昔ですね。
Hadoopの用途としてよく聞くのが、ログやデータの分析や大量データを扱うバッチ処理ですね。多くのユーザーを抱える企業では殆ど使われているんじゃないんでしょうか?

Hadoopはノードを追加するだけで処理をスケールアウトすることができます。性能を上げたければその辺に転がっている古いPCでも、たくさん集まれば処理性能は高くなります。セミナーで聞いたところ、4000台を使ってスケールアウトした事例もあるらしいです。Hadoop自体の限界は、現在開発版の0.23で10000台を見込んでいるらしいですね。

Hadoopの仕組みについて

Hadoopを構成する要素は、大きく分けて2つあります。

  1. HDFS
  2. MapReduce
HDFS

HDFS(Hadoop Distributed File System)とは、Hadoopが持つ独自のファイルシステムです。複数のサーバーを使って分散的にデータを管理することができます。
HDFSは、"Name Node"、"Data Node"の2つで構成されており、Data Nodeはファイル自体を管理し、Name NodeはData Nodeを管理します。*1

ある大きなデータをHadoopで処理するとき、どのように分散するんでしょうか?
説明のためName Nodeを"管理ノード"、Data Nodeを"ノード"として説明します。

まず、管理ノードがお仕事します。クライアント側で持っているデータを64MB程度のブロックに分割し各ノードに渡します。
この時、ブロックのコピーを複数のノードに割り当ててレプリケーションしたりします。
管理ノードはブロックをどのノードに渡したかを管理し、処理のマスターして機能します。各ノードに指示を発行するのはこの管理ノードの役割です。

MapReduce

もう一つのMapReduceは、"複数のマシンで並列処理を実行する仕組み"です。Hadoopの実処理部分は、このMapReduceが請け持っています。
MapReduceには、処理全体を管理する"JobTracker"(以下、マスターノード)と、処理を実行する"TaskTracker"(以下、スレーブノード)があります。
HDFSと連携してデータを各スレーブに割り当て、"各スレーブ毎に"分析処理を行います。
"各スレーブ毎に"がキモです。マスターノードが各スレーブに指示して処理を実行するわけではないんですね。
2012/04/17削除
なにか処理を実行するとき、マスタノードからスレーブノードに対して、分析開始指示を行います。
指示を受けたスレーブノードは、自身にあるHDFSのDataNodeからデータを読み出して、以下の順序でデータを処理します。

  • 1.Mapステップ

処理を実行する前処理にあたります。スレーブノードに渡されたデータをKeyとValueの形式に変えて、入力を作ります。
キモになるのが、入力はKey-Valueのセットであるということです。どの値を入力に使うかは、利用者が自分で調整しなければなりません。
入力値の整形は、開発者側が実装して行います。

  • 2.Shuffleステップ

Mapステップで整形した入力値を、Keyでグルーピングし、実処理(Reduceステップ)を行うワーカーに渡します。
データをグルーピングすることによって、高速に処理する準備をするらしい。

  • 3.Reduceステップ

Shuffleステップで渡されたグルーピング済みのデータを処理します。どのような処理をするかは、開発者が実装して行います。

上記処理を実行した後は、全スレーブノードの処理結果をマスターノードに渡してまとめ、最終的な処理結果をクライアントに返します。
これがMapReduceの動きの概要になります。

並列処理をする黄色いゾウにも弱点があった。

そんなHadoopですが、パフォーマンスを発揮できないケースが存在します。

  • 小さなファイルがいっぱい存在する

Hadoopは内部で64MBごとにデータを配置していく方法をとっています。そのため小さなファイルが多量に存在する場合、そのファイルをまとめてブロック化しなければなりません。Name Nodeの管理が複雑になってしまうことが想像されます。

  • 短時間で終わる処理

Hadoopは前処理に時間がかかります。詳しいことは調べきれてませんが、各ノードの整合性や、データの破損状況をチェックしたりしているらしく、どうしても時間がかかります。
短時間で終わる処理(数分)程度だと、前処理時間 > 処理時間となるため、Hadoop使わずに処理した方が早くなります。
Hadoopがその力を発揮できるのは、膨大なデータがあり、処理時間が数時間以上かかる場合に限られます。

Hadoopはどう使うの?

長くなりそう+日を跨ぎそうなので、また後日纏めてエントリ上げます。更新するまで暫くお待ち下さいな。

おまけ

自宅に帰って調べてみたら、NTTデータさんの詳しい資料がありました。
http://www.meti.go.jp/policy/mono_info_service/joho/downloadfiles/2010software_research/clou_dist_software.pdf
Hadoopのチューニングをコード付きで提示されており、これだけでも十分勉強できそうです。
気になる方はぜひ一読をおすすめします。

*1:"Secoundary Name Node"と呼ばれるName Nodeのコピーを持つことができ、冗長化のために使われることもある