「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 コマンドの引数に与えるか(バッチモード)、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)や演算子を適用できる
- FOREACH <入力リレーション> GENERATE <処理対象のfield>
- データ集約
- GROUP <入力リレーション> BY
- グループ化した値はオブジェクトとして取得できるため、HiveQL のように集約関数を都度かませる必要がない
- ソート
- ORDER <入力リレーション> BY
- flattern
Hive(6.5章)
HiveQL と呼ばれる DSL を提供するフロントエンド。詳細は13章。
特徴
- データ処理に特化した言語
- SQL とある程度の互換性をもつ
- 学習コストが低い
Chapter 7 "Hadoop クラスタ環境の構築"
クラスタ環境の構築
HDFS
- core-site.xml
- fs.defaultFS プロパティに NameNode のサーバ名を指定
- hdfs-site.xml
- データを保存するディレクトリの指定
- NameNode, DataNode それぞれで見るプロパティが違うため、同じファイルにしてよい
- レプリケーション数の設定
- データを保存するディレクトリの指定
- hosts.include, hosts.exclude
MapReduce
- mapred-site.xml
- mapred.job.tracker プロパティに JobTracker のサーバ名とポート番号を指定
- mapred.system.dir プロパティに MapReduce 用のシステムディレクトリを指定
- map, reduce のタスク数もこのファイルで指定する
- 例)8コアのマシンであれば、DataNode, TaskTracker に1コアずつ、残りを Map, Reduce タスクに割り振る
- hosts.include, hosts.exclude
結局何で作るか
Docker?
- 履歴管理できるので、慣れれば楽に環境構築できそう
- 今回は時間がなかったので断念
Vagrant?
- ローカルマシンに複数仮想マシンだとメモリ足らない(Docker も一緒ですが)
- 設定ファイルは共通でよいので、1つ image を作ってしまえば、使い回せる。共通の image を作成し、複数インスタンス立ち上げられる
- image の作成
$ vagrant package default -out centos_with_cdh42.box
$ vagrant box add centos65_with_cdh42 ut