使用Hadoop计算气象数据文档格式.docx
《使用Hadoop计算气象数据文档格式.docx》由会员分享,可在线阅读,更多相关《使用Hadoop计算气象数据文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
if(airTemperature!
=MISSING&
&
quality.matches("
[01459]"
)){
context.write(newText(year),newIntWritable(airTemperature));
}
MinTemperatureReducer.java
importorg.apache.hadoop.mapreduce.Reducer;
publicclassMinTemperatureReducerextends
Reducer<
Text,IntWritable,Text,IntWritable>
protectedvoidreduce(Textkey,Iterable<
IntWritable>
values,
Contextcontext)throwsIOException,InterruptedException{
intminValue=Integer.MAX_VALUE;
for(IntWritablevalue:
values){
minValue=Math.min(value.get(),minValue);
context.write(key,newIntWritable(minValue));
MinTemperature.java
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
publicclassMinTemperature{
publicstaticvoidmain(String[]args)throwsException{
if(args.length!
=2){
System.err.println("
Usage:
MinTemperature<
inputpath>
<
outputpath>
"
);
System.exit(-1);
Jobjob=newJob();
job.setJarByClass(MinTemperature.class);
FileInputFormat.addInputPath(job,newPath(args[0]));
FileOutputFormat.setOutputPath(job,newPath(args[1]));
job.setMapperClass(MinTemperatureMapper.class);
job.setReducerClass(MinTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true)?
0:
1);
编译:
生成jar包
运行mr任务
查看结果;
2在linux或win下安装eclipse,并且连接到Hadoop集群(关键步骤是编译插件),运行习题1的map-reduce程序作为测试,抓图整个过程
由于我的hadoop集群是安装在虚拟机上的,windows本地无相应的hadoop程序运行,因此在配置的需要将windows的用户名修改为相应的安装hadoop应用的用户名,我这里为bigdata1x,修改完成后重启windows系统,即可进行eclipse下的hadoop插件安装(如果不修改用户名与hadoop集群的用户名一致,后续连接到hadoop集群调试时会出错)
修改eclipse的hadoop的配置信息
并修改hadoop.tmp.dir参数
配置好后点击
切换到Map/Reduce视图,可看到DFS上的目录结构如下:
以上data目录即为作业中题目1对应的数据
创建相应的Map/Reduce工程
将题目1中的代码增加到工程中
配置相应的运行参数:
再通过hadoop运行,报如下错误:
15/04/2519:
39:
05WARNutil.NativeCodeLoader:
Unabletoloadnative-hadooplibraryforyourplatform...usingbuiltin-javaclasseswhereapplicable
05ERRORsecurity.UserGroupInformation:
PriviledgedActionExceptionas:
bigdata1xcause:
java.io.IOException:
Failedtosetpermissionsofpath:
\tmp\hadoop-bigdata1x\mapred\staging\bigdata1x1095384666\.stagingto0700
Exceptioninthread"
main"
java.io.IOException:
atorg.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:
691)
atorg.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:
664)
atorg.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:
514)
atorg.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:
349)
atorg.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:
193)
atorg.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:
126)
atorg.apache.hadoop.mapred.JobClient$2.run(JobClient.java:
942)
936)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjavax.security.auth.Subject.doAs(Subject.java:
415)
atorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:
1190)
atorg.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:
atorg.apache.hadoop.mapreduce.Job.submit(Job.java:
550)
atorg.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:
580)
atdataguru.lesson4.e2.MinTemperature.main(MinTemperature.java:
27)
通过网上查询,在主程序的中增加如下内容
参见:
如果配置了以上参数还报相同的错,则需要检查eclipse中hadoop.tmp.dir、mapred.local.dir配置的是否正确
以上如果不增加mapred.jar参数配置,则对应的mapreduce程序不能将所有的class都提交到hadoop集群中,会抛出mapper、reducer的ClassNotFound异常
程序正常运行日志如下:
查看运行结果:
第3-4题为2选1(请在课程资源下载第6周作业素材和视频素材),如能2题均完成为最佳。
3传递参数问题
请阅读Exercise_1.java,编译并且运行。
该程序从Test_1改编而来,其主要差别在于能够让用户在结果文件中的每一行前面添加一个用户自定义的字符串,而这个字符串将由参数传递到程序中。
例如,运行
$hadoopjarExercise_1.jarinput_pathoutput_pathhadoop
之后,第三个参数“hadoop”将会在结果文件中显示,例如附件“result_1”所显示的。
问题:
着重考虑Exercise_1.java里面”需要注意的部分“,改写Test_2程序,得到的结果必须跟附件\"
resule_2\"
一致,并且其中hadoop必须由参数传递。
改写Test_2程序的代码内容如下:
packagedataguru.lesson4.e3;
/**
*Hadoop网络课程模板程序
*编写者:
James
*/
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.conf.Configured;
importorg.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
importorg.apache.hadoop.util.Tool;
importorg.apache.hadoop.util.ToolRunner;
/**
*有Reducer版本
publicclassTest_2_mextendsConfiguredimplementsTool{
/**
*计数器用于计数各种异常数据
enumCounter{
LINESKIP,//出错的行
*MAP任务
publicstaticclassMapextendsMapper<
LongWritable,Text,Text,Text>
publicvoidmap(LongWritablekey,Textvalue,Contextcontext)
throwsIOException,InterruptedException{
Stringline=value.toString();
//读取源数据
try{
//数据处理
String[]lineSplit=line.split("
"
Stringanum=lineSplit[0];
Stringbnum=lineSplit[1];
context.write(newText(bnum),newText(anum));
//输出
}catch(java.lang.ArrayIndexOutOfBoundsExceptione){
context.getCounter(Counter.LINESKIP).increment
(1);
//出错令计数器+1
return;
}
}
*REDUCE任务
publicstaticclassReduceextendsReducer<
Text,Text,Text,Text>
privateStringname;
@Override
protectedvoidsetup(Contextcontext)throwsIOException,
InterruptedException{
this.name=context.getConfiguration().get("
name"
publicvoidreduce(Textkey,Iterable<
Text>
values,Contextcontext)
StringvalueString;
Stringout="
;
for(Textvalue:
valueString=value.toString();
out+=valueString+"
|"
if(mons.lang.StringUtils.isNotEmpty(this.name)){
out+=this.name;
context.write(key,newText(out));
publicintrun(String[]args)throwsException{
Configurationconf=getConf();
conf.set("
mapred.job.tracker"
"
192.168.2.103:
9001"
mapred.jar"
D:
\\Hadoop\\lesson4\\Test_2_m.jar"
if(args.length>
=3){
conf.set("
args[2]);
Jobjob=newJob(conf,"
Test_2"
//任务名
job.setJarByClass(Test_2_m.class);
//指定Class
FileInputFormat.addInputPath(job,newPath(args[0]));
//输入路径
FileOutputFormat.setOutputPath(job,newPath(args[1]));
//输出路径
job.setMapperClass(Map.class);
//调用上面Map类作为Map任务代码
job.setReducerClass(Reduce.class);
//调用上面Reduce类作为Reduce任务代码
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
//指定输出的KEY的格式
job.setOutputValueClass(Text.class);
//指定输出的VALUE的格式
job.waitForCompletion(true);
//输出任务完成情况
System.out.println("
任务名称:
+job.getJobName());
任务成功:
+(job.isSuccessful()?
是"
:
否"
));
输入行数:
+job.getCounters()
.findCounter("
org.apache.hadoop.mapred.Task$Counter"
"
MAP_INPUT_RECORDS"
).getValue());
输出行数:
MAP_OUTPUT_RECORDS"
跳过的行:
+job.getCounters().findCounter(Counter.LINESKIP).getValue());
returnjob.isSuccessful()?
0:
1;
*设置系统说明设置MapReduce任务
publicstaticvoidmain(String[]args)throwsException{
//判断参数个数是否正确
//如果无参数运行则显示以作程序说明
if(args.length!
System.err.println("
Test_2<
inputpath>
outputpath>
System.err.println("
Example:
hadoopjar~/Test_2.jarhdfs:
//localhost:
9000/home/james/Test_2hdfs:
9000/home/james/output"
Counter:
\t"
+"
LINESKIP"
+"
Lineswhicharetooshort"
System.exit(-1);
//记录开始时间
DateFormatformatter=newSimpleDateFormat("
yyyy-MM-ddHH:
mm:
ss"
Datestart=newDate();
//运行任务
intres=ToolRunner.run(newConfiguration(),newTest_2_m(),args);
//输出任务耗时
Dateend=newDate();
floattime=(float)((end.getTime()-start.getTime())/60000.0);
任务开始:
+formatter.f