前几天给大家写了个hadoop文件系统的操作类,今天来实际应用一下:从本地文件系统读入一个文件,运算后将结果再写回本地。
闲话少说,直接上代码:
Configuration conf = new Configuration();
//从本地上传文件到HDFS,可以是文件也可以是目录
file.PutFile(conf, args[1], dstFile);
System.out.println("up ok");
Job job = new Job(conf, "mywordcount");
job.setJarByClass(mywordcount.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(wordcountMapper.class);
job.setReducerClass(wordcountReduce.class);
job.setCombinerClass(wordcountReduce.class);
//注意这里的输入输出都应该是在HDFS下的文件或目录 FileInputFormat.setInputPaths(job, new Path(dstFile));
FileOutputFormat.setOutputPath(job, new Path(srcFile));
//开始运行
job.waitForCompletion(true);
//从HDFS取回文件保存至本地
file.GetFile(conf, srcFile, args[2]);
System.out.println("down ok");
//删除临时文件或目录
file.DelFile(conf, dstFile, true);
file.DelFile(conf, srcFile, true);
System.out.println("del ok");
}
}
最后需要注意的是,在使用命令时文件或目录路径要使用绝对路径,防止出错。