Hadoop で mapreduce の最終出力を読み取って分析しようとしています。以下は、私の「ジョブ」ファイルのコードの一部です。FileSystem (Hadoop API) を使用して出力ファイルを読み取りたいのですが、太字で強調表示されたコード (二重の星の間) をどこに配置するかについて質問があります。system.exit の下に置くと、コードがスキップされる恐れがあります。
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (otherArgs.length != 3) {
System.err.println("Usage: format is <in> <out> <keyword>");
System.exit(2);
}
**Path distCache = new Path("/");
String fileSys = conf.get("fs.default.name");
HashMap<String, Integer> jobCountMap = new HashMap<String, Integer>();**
conf.set("jobTest", otherArgs[2]);
Job job = new Job(conf, "job count");
job.setJarByClass(JobResults.class);
job.setMapperClass(JobMapper.class);
job.setCombinerClass(JobReducer.class);
job.setReducerClass(JobReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
distCache = new Path(args[2]);
// FileSystem fs = distCache.getFileSystem(conf); // for Amazon AWS
if (fileSys.split(":")[0].trim().equalsIgnoreCase("s3n")) distCache = new Path("s3n:/" + distCache);
FileSystem fs = FileSystem.get(conf); // for local cluster
Path pathPattern = new Path(distCache, "part-r-[0-9]*");
FileStatus[] list = fs.globStatus(pathPattern);
for (FileStatus status : list)
{
// DistributedCache.addCacheFile(status.getPath().toUri(), conf);
try {
BufferedReader brr = new BufferedReader(new FileReader(status.getPath().toString()));
String line;
while ((line = brr.readLine()) != null)
{
String[] resultsCount = line.split("\\|");
jobCountMap.put(resultsCount[0], Integer.parseInt(resultsCount[1].trim()));
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
System.out.println("the size of Hashmap is: " + jobCountMap.size());
System.exit(job.waitForCompletion(true) ? 0 : 1);
}