新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Hadoop、環境構築:eclipse + github

[Hadoop] 学習記録:MapReduce

内容:5章 MapReduceフレームワーク

MapReduceの処理
  • 処理の流れ
    • MapReduceはMap、Shuffle&Sort、Reduceと段階を経る
    • 入力されたジョブを分割しながら処理を進める
    • Map処理n個のタスク、Reduce処理m個のタスクをそれぞれのフェーズで並列に処理可能
    • Reduce処理は、全てのMap処理の出力を受け取るまで始まらない
    • 最終的な出力結果は、HDFSに出力される
  • Map処理
    • Map処理の入力データを「スプリット」と呼ぶ
      • Job-Clientがスプリットの単位を決定
      • 入力データはHDFSのファイルとして置かれていることが前提
      • HDFSのファイルはブロックに分割、よってスプリットの大きさ=ブロックの大きさ
    • Map処理後の中間出力にはローカルディスクを使用
      • 出力はキーごとにソートされる
  • Shuffle&Sort処理
    • Mapの出力がReduceに送り込まれるまでの一連の流れ
    • MapperとReducer間のやり取りはHTTPで行われる
    • Reduce処理はMap処理の結果を全て受け取る
      • ReducerにMapからの全入力が届いたら、Reduceタスクで処理が可能になるように入力を1つにまとめあげる
      • 複数のMapからソートされた断片を受け取りマージソートで集約
  • Reduce処理
    • 1) 同じキーで集められた中間データ(Valueの集合)に対してユーザが定義したReduce処理を実行
    • 2) Reduce処理の結果として、新たにKeyとValueのペアを生成し、出力
    • Reduce処理の入力をパーティションと呼ぶ
MapReduceアーキテクチャ
  • ノード構成
    • 処理単位:ジョブとタスク
    • マスターノードをJobTracker、スレーブノードをTaskTrackerと呼ぶ
      • 通常、HDFSのスレーブノードであるDataNodeはTaskTrackerと同じマシン上に置かれる
      • そのため、TaskTrackerはまずローカルのDataNode上のデータに対してジョブを実行
    • MapReduceにジョブを投入するクライアントはJobClientと呼ばれる
    • JobTrackerを中心とした集中管理構成なので、単一障害点になりうる
  • JobTrackerの役割
    • 分散制御するためのマスターとして動作するJavaのプロセス
    • ジョブの管理
      • Mapタスクの割当制御
      • Map処理結果把握
      • ジョブ進捗通知
    • リソース管理
      • 処理の割り当て
      • 処理の投機的実行
      • 処理の再割り当て
      • ブラックリスト化(処理に失敗する頻度の高いTaskTrackerを使わないようにする)
      • TaskTracker死活監視
      • TaskTracker追加・切り離し
    • ジョブ実行履歴の管理
  • TaskTrackerの役割
    • Map処理およびReduce処理を実行するためのワーカとして動作するスレーブノード
      • 実際にワーカプロセスとして処理を行うChildプロセスを生成
      • Childプロセスに対して処理で必要なデータを渡す
    • Childプロセスの生成と処理実行
    • Childプロセスの状況確認
    • 処理停止の通知
    • ハートビート通信
    • Map処理数とReduce処理数の把握
  • JobClientの役割
    • 入力データの分割方針の決定
    • ジョブの依頼
    • アプリケーションの配布
    • 進捗状況の受信
    • ジョブの管理
MapReduceHDFSの関係
  • データローカリティ
    • MapReduceでは、処理プログラムをデータのあるところに移動させる
    • ノード間でのデータ転送量を抑え、大量のデータを扱う場合にも無駄なオーバヘッドを出さない
    • JobClient
      • ジョブを実行するにあたり、HDFS上のデータの所在をNameNodeに問い合わせる
      • 入力データの所在に関するファイル(job.split)とMapReduceジョブのJARファイル(job.jar)をJobTrackerの指定したディレクトリに配置
    • JobTracker
      • job.splitの情報をもとにMapタスクの実行をTaskTrackerに依頼
      • 優先順位は1) 同居しているDataNodeで処理対象データを保持 2) 同一ラック内のDataNodeで〜 3) それ以外、の順
    • TaskTracker
      • ChildプロセスがDataNodeからデータを取得し、処理を行う
MapReduceフレームワークの設定
  • 設定ファイル
ファイル名 目的
mapred-site.xml MapReduceフレームワークに関する設定
hadoop-env.sh Javaに関する設定
hadoop-metrics.properties Gangliaなどで利用するメトリクスを設定
hadoop-policy.xml Hadoop全般に関するACLのポリシーを設定(MapReduce関係のポリシーも)

[環境設定] eclipse + gitの環境構築

内容

  • eclipse4.3からEGit(eclipseからGitを使うためのプラグイン)がデフォでインストール済み(以降は4.4 Lunaでの動作確認)
  • .gitconfigの設定
    • 「ウィンドウ」>「設定」>「チーム」>「Git」>「構成」
    • 最低限user.nameとuser.emailは設定
  • Githubにあるリポジトリの複製
    • 「パースペティブを開く」>「Git」
    • あらかじめGithubリポジトリページでHTTPS clone URLをコピー(Copy to Clipboardをクリック)しておく
    • 「Gitリポジトリの複製」するとURLなど必要な情報が入力済みなので「次へ」
    • ブランチを選択(master)>「次へ」
    • 「完了」でOK
    • リポジトリ内にプロジェクトがある場合はフォルダを右クリックして「プロジェクトのインポート」
  • コミット/プッシュ
    • 適当なファイルを更新
    • リポジトリ・ルートを右クリックして「コミット」
    • コミットメッセージとコミットするファイルを指定して「コミットおよびプッシュ」