「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 のディストリビューション
- MapReduce は 1.0 系と 2.0 系が存在する
- ジョブ管理方法が大きく異なる
- 1.0 系では JobTracker, TaskTracker からなるフレームワーク
- 2.0 系では、YARN(Yet Another Resource Negotiator, 第22章にて解説)が採用されている
- ジョブ管理方法が大きく異なる
- Hadoop の動作モード
インストールから動作確認
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 が管理していないデータとなってしまう
hdfs コマンドで mkdir をしても、実際にそこにフォルダは作られない
- 実際に HDFS でファイルを作成しているため、各 DataNode にブロックが分散されているイメージとなる
hdfs dfs -ls
やhdfs dfs -stat
コマンドで確認できる