/home/by-natures/dev*

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

「Hadoop 徹底入門 第2版」第1部まとめ(開発手段・クラスタ構成)

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

今回は第1部、6章〜7章、Hadoop を動かす様々な方法とクラスタ構成の話です。

[toc]

Chapter 6 "Hadoop アプリケーションを動かす"

それぞれの文法などはともかく、特徴や動かし方の概要を学ぶ章です。

MapReduce アプリケーション(Java)(6.2章)

特徴

HadoopStreaming(6.3章)

詳細は11章。

特徴
  • 標準入出力経由で処理データが受け渡される ** 標準入出力が扱える言語であれば何でも良い
  • キーバリュー間はタブ、キーバリューのペア間は改行区切り
  • Mapper の出力はそのまま Reducer に渡されるため、Shuffle & Sort の処理は行われない(リスト6.2)
results = {}

def  wc_reduce(line):
    key, value = re.split(r'/t', line.strip())    # /t? \t ではなくて?
    if not key in results:
        results[key] = 0
    results[key] = results[key] + int(value)

Pig(6.4章)

Pig Latin と呼ばれる DSL を提供するフロントエンド。詳細は12章。

特徴
  • データ処理に特化した言語
    • Pig Latin で記述した処理が MapReduce ジョブに変換されるため、MapReduce の詳細や MapReduce ジョブがどのように制御されているかが隠蔽される
  • 少ないコードで記述出来る
  • 多段処理に有利
    • あるデータ処理の出力を、別のデータ処理の入力として扱うといった多段処理が楽に行える
サンプル

下記内容をファイルにし、pig コマンドの引数に与えるか(バッチモード)、pig コマンドを実行した後のシェルにて一行ずつ実行することができる(インタラクティブモード)

records = LOAD 'input' AS (line:chararray);
words = FOREACH records GENERATE flatten(TOKENIZE(line)) as word;
word_group = GROUP words by word;
word_count = FOREACH word_group GENERATE group AS word, COUNT(words) as count;
word_count = ORDER word_count by word;
STORE word_count INTO 'sample_pig_batch/output';
  • データ入出力
    • LOAD, STORE
  • データ加工
    • FOREACH <入力リレーション> GENERATE <処理対象のfield>
      • 入力リレーションの特定の field を指定したり、UDF(=User Defined Function)や演算子を適用できる
  • データ集約
    • GROUP <入力リレーション> BY
    • グループ化した値はオブジェクトとして取得できるため、HiveQL のように集約関数を都度かませる必要がない
  • ソート
    • ORDER <入力リレーション> BY
  • flattern

Hive(6.5章)

HiveQL と呼ばれる DSL を提供するフロントエンド。詳細は13章。

特徴
  • データ処理に特化した言語
    • HiveQL で記述した処理が MapReduce ジョブに変換されるため、MapReduce の詳細や MapReduce ジョブがどのように制御されているかが隠蔽される
  • SQL とある程度の互換性をもつ
    • 学習コストが低い

Chapter 7 "Hadoop クラスタ環境の構築"

クラスタ環境の構築

  • 名前解決ができるよう、/etc/hosts に IPアドレスFQDN を設定
    • 当然だが、DNS で名前解決ができれば不要
  • iptables 等、FW で接続設定
HDFS
  • core-site.xml
    • fs.defaultFS プロパティに NameNode のサーバ名を指定
  • hdfs-site.xml
    • データを保存するディレクトリの指定
      • NameNode, DataNode それぞれで見るプロパティが違うため、同じファイルにしてよい
    • レプリケーション数の設定
  • hosts.include, hosts.exclude
    • NameNode への接続を許可するサーバの FQDN を hosts.include に指定
    • 各ファイルへのパスは hdfs-site.xml で指定
MapReduce
  • mapred-site.xml
    • mapred.job.tracker プロパティに JobTracker のサーバ名とポート番号を指定
    • mapred.system.dir プロパティに MapReduce 用のシステムディレクトリを指定
    • map, reduce のタスク数もこのファイルで指定する
      • 例)8コアのマシンであれば、DataNode, TaskTracker に1コアずつ、残りを Map, Reduce タスクに割り振る
  • hosts.include, hosts.exclude
    • JobTracker への接続を許可するサーバの FQDN を hosts.include に指定
    • 各ファイルへのパスは mapred-site.xml で指定

結局何で作るか

Docker?
  • 履歴管理できるので、慣れれば楽に環境構築できそう
  • 今回は時間がなかったので断念
Vagrant
  • ローカルマシンに複数仮想マシンだとメモリ足らない(Docker も一緒ですが)
  • 設定ファイルは共通でよいので、1つ image を作ってしまえば、使い回せる。共通の image を作成し、複数インスタンス立ち上げられる
  • image の作成
$ vagrant package default -out centos_with_cdh42.box
$ vagrant box add centos65_with_cdh42 ut
AWS