hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

MapReduceの中間データを保持する(2)

昨年の夏、ブログ、MapReduceの中間データを保持する、を書いてからその後全く確認をしていなかったところ、何とCDH4.1.1で動かないことが判明!(当時はCDH4のリリース前だったので、CDH3で検証していた)
結果として原因は些細なことでしたが、かなり試行錯誤してしまい、MLなどで情報収集しても解決せずでした。同様の問題に悩んでいる方もいらっしゃるようです。訂正かつ補足します。
2. 条件に基づいてファイルを残す

keep.task.files.pattern

このパラメータに残す条件を指定しますが、前回からの変更箇所は以下の2点です。
1) .*_m_0000.* が正規表現でうまく一致しない。.*(全てと一致)にする
2) ToolRunnerで -D で値を指定する際、シングルクォートにする(ダブルクォートではうまくいかない!!!)
TaskTracker.javaより抜粋:下記の Pattern.matches()で一致するかどうかを判定している。
[java]
public synchronized void setJobConf(JobConf lconf){
this.localJobConf = lconf;
keepFailedTaskFiles = localJobConf.getKeepFailedTaskFiles();
taskTimeout = localJobConf.getLong("mapred.task.timeout",
10 * 60 * 1000);
if (task.isMapTask()) {
debugCommand = localJobConf.getMapDebugScript();
} else {
debugCommand = localJobConf.getReduceDebugScript();
}
String keepPattern = localJobConf.getKeepTaskFilesPattern();
if (keepPattern != null) {
alwaysKeepTaskFiles =
Pattern.matches(keepPattern, task.getTaskID().toString());
} else {
alwaysKeepTaskFiles = false;
}
}
[/java]
2番目のダブルクォートは、デバッガで値を見たところ “.*” というように、「”」文字が評価対象になっていました。この2カ所の変更で中間データを残すことができます。
eclipse_mr1
以下実行例
例:
[shell]
hadoop jar wc.jar WordCountDriver -D keep.task.files.pattern=’.*’ shakespeare output
13/06/10 23:29:58 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/06/10 23:29:58 INFO input.FileInputFormat: Total input paths to process : 5
13/06/10 23:29:58 WARN snappy.LoadSnappy: Snappy native library is available
13/06/10 23:29:58 INFO snappy.LoadSnappy: Snappy native library loaded
13/06/10 23:29:58 INFO lzo.GPLNativeCodeLoader: Loaded native gpl library
13/06/10 23:29:58 INFO lzo.LzoCodec: Successfully loaded & initialized native-lzo library [hadoop-lzo rev 477079631bb6c2b47f15140548e2c0f4efa6996f]
13/06/10 23:29:58 INFO mapred.JobClient: Running job: job_201306102232_0010
13/06/10 23:29:59 INFO mapred.JobClient: map 0% reduce 0%
13/06/10 23:30:29 INFO mapred.JobClient: map 40% reduce 0%
13/06/10 23:30:41 INFO mapred.JobClient: map 60% reduce 0%
13/06/10 23:30:44 INFO mapred.JobClient: map 80% reduce 0%
(略)
[root@localhost hadoop-hdfs]# find . |grep out|grep file
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000003_0/output/file.out.index
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000003_0/output/file.out
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000000_0/output/file.out.index
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000000_0/output/file.out
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000001_0/output/file.out.index
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000001_0/output/file.out
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000002_0/output/file.out.index
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000002_0/output/file.out
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000004_0/output/file.out.index
./cache/mapred/mapred/local/taskTracker/training/jobcache/job_201306102232_0010/attempt_201306102232_0010_m_000004_0/output/file.out
[/shell]
file.outが中間データのファイルです。

コメント