新人SEの学習記録

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

学習記録:Hadoop

[学習記録] HadoopHDFS

内容:4章 HDFSHadoop Distributed File System)

Hadoopにおけるファイルシステム
  • HDFSは巨大なデータを扱うことに特化
    • 1ファイルが数ギガ以上に及ぶようなファイルを想定
  1. 巨大なデータを汎用サーバのみで扱える
    • RAIDなどが不要
  2. 容量にスケーラビリティがある
    • ノードを追加することで領域のサイズを増やせる
  3. シーケンシャルアクセスで高いスループットが出せる
  4. ノードの一部が故障してもデータの損失を回避できる
    • データの複製を複数ノードで保持
HDFSの仕組み
  • HDFSアーキテクチャ
    • マスタースレーブ構成
    • マスター:NameNodeと呼ばれる。HDFSの全体的な管理を行う
    • スレーブ:DataNodeと呼ばれる。ユーザが投入したファイルのデータブロックを格納
    • SecondaryNameNode:NameNode上で扱うファイルシステムメタデータのメンテナンスを担う
  • DataNodeについて
    • 各DataNode上のデータの配置とHDFS
    • HDFS上のファイルとロック
      • データはブロックと呼ばれるチャンクに分割されて管理
      • HDFSに格納する一つのファイルは複数のブロックから構成
      • HDFSで扱うブロックは、DataNode上のローカルファイルシステムのファイルに対応付けられる
      • ブロックサイズが64MBでレプリケーション数が3の場合、1GBのファイルは1024MB / 64MB * 3 = 48個のブロックが存在
    • ブロックのレプリケーション
      • HDFS上のファイルへのI/Oはブロック単位で行われる
      • デフォルトは64MB(ext4は4KBであることを考えると、HDFSのブロックサイズは極めて大きい)
      • 各ブロックは複数台のDataNode上に複製を持つ(レプリケーション
      • デフォルトのレプリケーション数は3
      • 3つのレプリカをどのDataNode上に配置するかはネットワークトポロジーを考慮させることが可能
      • 同一ラック上に存在しないようにコントロール可能(ラックアウェアネス)
  • NameNodeについて
  1. メタデータの管理
  2. HDFSの使用状況の確認
    • HDFS全体の使用状況と各DataNodeにおけるHDFS用の領域の使用状況を管理
    • ブロックのレプリカ数も管理
  3. クライアントからのHDFS操作の受付
    • クライアントがHDFSのファイルへのアクセス要求をした際、最初にアクセスするのはNameNode
    • 保持しているメタデータをもとに、対象となるブロックを持つDataNodeのリストをクライアントに伝える
  4. DataNodeの死活監視
    • DataNodeは一定の間隔でNameNodeに対し自身の生存を伝えるハートビートを送信
HDFSへのファイルの読み書きの流れ
  1. NameNodeと通信
  2. どのDataNodeとやりとりすればよいか把握
  3. 実際のデータはDataNodeと直接やりとり
  • HDFSへファイル書込み
    • 書込みの最初と最後、エラー発生時にNameNodeと通信
    • 書込み対象のデータをパケット単位で管理するデータ送信キューとack待ちキューを用意
  1. NameNodeに書き込み用としてファイルのオープンを要求
    • NameNodeにファイルの作成を要求
  2. パーミションのチェックなどを行い、メタデータにファイルのエントリを挿入
  3. クライアントが書込み用のストリームを受け取る
  4. データをパケット単位でデータ送信キューに挿入
    • 別スレッドではデータ送信キューを監視
    • データ送信キューにパケットが挿入されていれば、、、
  5. NameNodeにブロックの割当てを要求
  6. パケットの書込み先のデータノードのリストを受け取る
  7. 同時に、別スレッドが管理するack待ちキューにも同じパケットを保存
  8. パケットが書き込まれたDataNodeは、パイプラインに含まれる他のDataNodeにパケットを伝搬
  9. パケットが正常に書き込まれたDataNodeはackメッセージをパイプライン上流に通知
    • クライアントにackが届いたら、対応するパケットがack待ちキューから削除される
  • HDFSからのファイル読み出し
  1. NameNodeに読み取り用としてファイルのオープンを要求
    • 要求したファイルのブロックを持つDataNodeのリストを要求
  2. NameNodeはファイルを構成するブロックのリストを生成し、それらを保持するDataNodeのリストをクライアントに返す
    • 各ブロックは複数DataNodeにあるが、DataNodeの位置がクライアントから近い順にソートされている
  3. ファイルの読み込みを開始
    • 最初のブロックを持つDataNodeにアクセスし、ブロックを読み込む
  4. ファイルの終端に達したら、次のブロックを持つDataNodeにアクセス
  5. ファイルを読み終えると、クライアントはファイルのクローズを要求
ファイルシステムメタデータ
項目
ファイル/ディレクトリ名 foo.txt
親ディレクトリ /path/to
サイズ 100GB
所有者:所有グループ hdfs:hadoop
属性 -rw-r--r--
ブロックIDとそのブロックを保持するDataNode {blk 001, {Node..A, Node..B, Node..E}},...
HDFSの設定と起動・停止
  • HDFSの設定ファイル
ファイル名 目的
core-site.xml Hadoop共通の設定を記述
hdfs-site.xml HDFSの挙動に関する設定を記述
hadoop-env.sh NameNodeやDataNodeのJavaに関するオプションなど
log4j.properties NameNodeやDataNode、HDFSクライアントのログ出力をlog4jでコントロール
hadoop-metrics.properties HDFSに関係するメトリクスを設定(Gangliaなどで使用)
hadoop-policy.xml Hadoop全般に関するACLのポリシーを設定
CLIベースのファイル操作
% hdfs dfs <操作の種類>
    • ローカルのファイルをHDFS上にコピーしたい場合は-putという操作を指定
% hdfs dfs -put /tmp/test.txt /path/to/hdfs-server/test.txt
    • ls, du, cp, rm, cat, chgrp, chmod, chown, mkdir, rmdirなども使える
    • HDFS上のファイルをローカルに取得するのは-get

今後の予定

  • 4週連続新しい言語を覚える企画は終わったので、これからはRubyHadoopを書籍で学習
  • 週1以上でCodeIQ
  • チーム開発系の本も一冊読みたい