/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

「Hadoop 徹底入門 第2版」第1部まとめ(基礎知識・インストール手順)

Hadoop 徹底入門 第2版」を有志で読み進めているので、そのメモを貼ります。

今回は第1部、1章〜3章、Hadoop の基礎知識からインストール手順までをご紹介します。

また、概要をこちらのスライドにまとめてありますので、合わせてご覧ください。(社内勉強会用資料を公開用に切り取ったものです)

[toc]

Chapter 1 "Hadoop の基礎知識"

Hadoop とは

一言で言うと…

「大量のデータを処理するための並列分散処理ソフトウェア」

分散ファイルシステムHDFS)と、並列分散処理を実現するフレームワークMapReduce)の2つから成る

既存のバッチ処理の置き換えのみならず、「今までできなかったことや諦めていたことが出来るようになる」

誕生の経緯

Google 社の論文 “The Google File Ssytem”(2003), “MapReduce: Simplified Data Processing on Large Clusters”(2004) をもとに OSS として実装を始めたのが Hadoop プロジェクトの始まり

Hadoop の適用領域

  • 数百GB 〜 数TBなどの大量データのバッチ処理に適している
  • 拡張性に優れる(スケールアウトでの処理性能向上)
  • 柔軟なデータ構造に対応

サーバ構成

  • HDFS: NameNode(マスタ:1台)、DataNode(スレーブ:複数台)
    • 図1.10, 図1.11(P.22)
  • MapReduce: JobTracker(マスタ:1台)、TaskTracker(スレーブ:複数台)
    • 図1.13, 図1.14(P.24, P.26)、"MapReduce 処理の流れ"
  • マスタサーバは高性能・高信頼のマシンを利用する
  • スレーブサーバは RAID なしの SATA ディスクを利用することが多い

Chapter 2 "MapReduce アプリケーションの活用例"

活用例

ブログのアクセス集計(P.34)
  • 日で分割されたアクセスログに対し、ブログごとのユニークユーザー数が知りたい。不正アクセスは取り除く
  • 単純な MapReduce ジョブに分割するパターン
    • フィルタリングと、ユニークユーザーの洗い出し
    • ブログごとにユニークユーザー数を集計
似ている人を見つける(P.38)
  • SNS で同じ特徴を持つユーザーをグルーピングする
検索エンジンインデックスの作成(P.40)
画像データの分散処理(P.42)
  • Reduce が必要ないパターン

MapReduce で実現できる処理の特徴と活用のポイント

  • map 関数と reduce 関数を適切に使い分ける
    • map は順序制御できないため、データのクレンジング処理や、データのフィルタリングなど、前処理に向く
    • reduce はキーに対してひもづいた複数のデータが渡される。データもキーでソートされている。集約処理や、時系列データの処理に向く
  • 集約単位や分割の軸を考慮し、中間データのキーを選択する
    • Shuffle フェーズでは同じキーを持つ中間データ同士がまとめられるため、どのような軸で集約・分類を行うのかを考慮する
  • 複雑な処理は単純な MapReduce ジョブに分割する
  • map 関数だけで処理が完結するかどうか検討する

Chapter 3 "Hadoop の導入”

動作環境

  • Hadoopディストリビューション
    • Apache Hadoop
    • Cloudera's Distribution including Apache Hadoop(CDH)
      • RPM, deb などのパッケージを用いて簡単に導入できる
      • 提供されているコンポーネントの組み合わせで動作が確認されている
    • Hortonworks Data Platform(HDP)
  • MapReduce は 1.0 系と 2.0 系が存在する
    • ジョブ管理方法が大きく異なる
      • 1.0 系では JobTracker, TaskTracker からなるフレームワーク
      • 2.0 系では、YARN(Yet Another Resource Negotiator, 第22章にて解説)が採用されている
  • Hadoop の動作モード
    • ローカルモード
    • 疑似分散モード
      • 1台、HDFS 使用
      • HDFS, MapReduce の動作検証、Hadoop アプリケーションの機能検証に利用する
    • 完全分散モード
      • 複数台、HDFS 使用
      • 商用環境の構築、ノード間通信を含む HDFS, MapReduce の動作検証、パフォーマンスなどの非機能要件の検証

インストールから動作確認

  • JDK は 1.7 も対応(書籍では1.6)
  • HDFS の設定でつまづくことが多いため、先に4章を読んでおくとよい
Tips
IP アドレスからホスト名が逆引きできないとエラーとなる
[/var/log/hadoop-hdfs/hadoop-hdfs-datanode-vagrant-centos65.vagrantup.com.log]
2014-02-16 14:54:04,691 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain
java.net.UnknownHostException: vagrant-centos65.vagrantup.com: vagrant-centos65.vagrantup.com
  • 下記設定を加える(192.168.33.10 は Vagrant の初期ローカルIP):
[/etc/hosts]
(中略)
192.168.33.10 vagrant-centos65.vagrantup.com
hdfs コマンドについて
  • 書籍中では sudo コマンドが多用されており、本来のコマンドが分かりづらい。。
[誤]
[someuser@vagrant]$ sudo -u hdfs dfs fs -mkdir ...
[正]
[someuser@vagrant]$ sudo -u hdfs hdfs dfs -mkdir ...
  • hdfs ユーザでログインしていれば、以下の通り:
[hdfs@vagrant] $ hdfs dfs -mkdir ...
クラスタ不整合
  • NameNode の初期化を行う場面があるが、DataNode 起動後に行うと DataNode でエラーが発生する(クラスタ不整合)
[/var/log/hadoop-hdfs/hadoop-hdfs-datanode-vagrant-centos65.vagrantup.com.log]
2014-02-18 16:09:55,500 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-
862701839-192.168.33.10-1392739729485 (storage id DS-674077449-192.168.33.10-50010-1392578724409) service to localhost/127.0.0.1:8
020
java.io.IOException: Incompatible clusterIDs in /var/lib/hadoop-hdfs/cache/hdfs/dfs/data: namenode clusterID = CID-a578ba1f-9779-4
eff-9b51-a0cd3093acb2; datanode clusterID = CID-26399fe0-9d4c-4690-834e-427d7cd8d36d
  • NameNode のメタファイルが初期化されるため、NameNode が管理していないデータとなってしまう
    • DataNode の対象ディレクトリを削除し、DataNode を起動し直せば良い
    • 対象ディレクトリは /etc/hadoop/conf/hdfs-site.xml で確認できる
hdfs コマンドで mkdir をしても、実際にそこにフォルダは作られない
  • 実際に HDFS でファイルを作成しているため、各 DataNode にブロックが分散されているイメージとなる
  • hdfs dfs -ls や hdfs dfs -stat コマンドで確認できる