Kawaii Lab

プログラミングとかサービス開発とか

Hadoopを完全に理解する

Hadoop とは

分散システムを構築するためのフレームワークです。 Hadoopは主に以下の三つのコンポーネントから構成されます。

HDFS

大容量のデータを分散システム上で保存するためのファイルシステムです。 データを一定のブロックに分散して、複数の記憶装置に保存し読み書きを行います。 データはデータノードに保存され、場所がネームノードによって管理されます。 データの所持と操作は区別されないためネットワーク間のデータ通信が行われず利用者が意識しなくてもよくなっています。 また、操作ログがジャーナルノードに書き込まれると他のネームノードに反映されるなど冗長性も担保することができるようになっています。

また、データはReplicationによって全く同じデータが複数のノードに書き込まれます。 全てのノードに書き込みが終了した時点で完了と見なされます。

MapReduce

分散システム上でデータを処理するためのプログラミングモデルです。 HDFSに格納されたデータにアクセスするために使用されます。 Mapは入力値を<Key, Value>として出力し、同じKeyでグルーピングします。 グルーピングされた値はReduceによってKeyごとにまとめられた<Key, Value>として出力されます。 大雑把にいうと集計です。

YARN

分散処理システム上のリソースを管理します。 クライアントがクラスタと呼ばれるノードの集合体に処理を指示します。 指示はクラスタのマスターノードを通じて、配下のワーカーノードに伝達されていく仕組みです。 各ワーカーノードではコンテナが立ち上がり、その中でタスクが実行されますがワーカーノードの一つではアプリケーションマスタと呼ばれるタスクが立ち上がっており、各タスクはアプリケーションマスタによって実行管理がされています。

占有するリソースはスケジューラによって管理され、キュー配置ポリシーによってジョブにキューが割り当てられていきます。 また、リソースが足りない場合はプリエンプションによって、他コンテナをkillし解放する場合もあります。 以上のように、ルールを設定することで適切なリソース管理を行うことができます。

Hadoop エコシステムとは

Hadoop をより使いやすくするためのアプリケーション群を指します。 様々な企業(e.g.:FaceBook,Spotify)によって開発されています。

Hive

データを一般的なRDBのように扱うことができるインターフェースです。 データをテーブルとして管理することができるので、HiveQL(SQL Likeな言語)を使って抽出することができます。 注意点としては、HiveQLはインターフェースであり、裏ではMapReduceの処理が走っているため実行速度が遅いです。

主にメタストア機能やサーバー機能目的で使用されます。

HBase

こちらもデータをRDBのように扱うことができるインターフェースです。 HIveと異なる点は、データの一部だけを取得、挿入、更新ができるランダムアクセス性を持っていることです。 データ構造は以下に分別されます。

これだけ見るとNoSQLと似たように思えますが、分散処理を実現するためにKeyに対して複数のValueを関連づけることができます。

HiveServer2

JDBCもしくは、ODBCを使ってHiveに対してクエリを実行できるようになるサービスです。

Kafka

受けとったデータを一時的に保持する分散メッセージングキューのシステムです。 不可が直接コンポーネントにかからなくなることで、データのロスト防止や可動性を担保します。 また、データのやりとりに必ずKafkaを利用することで通信経路が簡略化されます。

Flume

ストリーミングデーターフローを用いたログデータの転送システムです。 Agentと呼ばれるコンポーネント群が、外部コンポーネントから送られてきたログデータをHDFSに送信します。 Agentの中では,Sorce,Channel,Sinkが動いており、外部コンポーネントからデータを受け取ったSorceは一つ以上のChannelにデータを保存します。 SinkはデータをChannelから取得、HDFSもしくは、次のAgentに転送します。 自動的にトランザクションも貼られており次のコンポーネントに転送されるまで削除されることはありません。

ZooKeeper

冗長サービスを実現するシステムです。 マスターノードが複数のノードを管理し、いずれかのノードが停止した場合には他のノードに問い合わせを流すことができます。 また高可用性の実現のために、同期、設定管理、グルーピング、名前管理を行います。 利用者にとっては一つのファイルシステムとして扱うことができるので、理解しやすいという点もあります。