设为首页 收藏本站
查看: 669|回复: 0

[经验分享] hadoop helloworld with Java

[复制链接]

尚未签到

发表于 2016-12-4 10:57:35 | 显示全部楼层 |阅读模式
  环境:ubuntu、hadoop-2.6.0、jdk-1.6

Demo说明:此demo改编自hadoop权威指南一书;
1、存在一个气温记录的txt文件,记录每一年每一个月的气温值(此处数据伪造,记录的为1990 - 1991年数据),如下:
DSC0000.jpg

途中+号表示正数温度,-号表示零下。
demo意图是期望通过hadoop计算出每一年的最高气温,结果期望如下:
DSC0001.jpg

开始构建hadoop应用,首先此处用到的核心类是Mapper、Reducer、Combiner(这并不是一个具体的类,此对象也是Reducer的一个子类,用于实现hadoop中的合并函数)这三个类,Mapper类是用于从每一行中获取出year(年份)和tempper(气温值),将输出参数的year和tempper作为Combiner的输入参数,Combiner计算出此数据块的最大值(因为在分布式计算中,同一个年份的数据可能被分割在不同的数据块中,所以,合并函数显得非常重要),将合并函数计算的year和tempper传入Reducer,reducer输出结果到HDFS;(hadooper的mapper函数的输入是基于标准流,对文件逐行读取,逐行提交给mapper)

架构如下:
NewMaxTemperMapper         >> Mapper的子类;
NewMaxTemperReducer        >> Reducer的子类:
NewMaxTempperCombiner    >> Reducer的子类:
NewDomainWithCombiner      >> Reducer的子类:




NewMaxTemperMapper.java




import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class NewMaxTemperMapper extends Mapper {
private static final int MISSING = 9999;
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException {
System.out.println("start to work in map method ...");
String line = value.toString();
String year = line.substring(1, 5);
int airTempper;
if (line.charAt(6) == '+') {
airTempper = Integer.parseInt(line.substring(7, 10));
} else {
airTempper = Integer.parseInt(line.substring(6, 10));
}
if (airTempper != MISSING) {
context.write(new Text(year), new IntWritable(airTempper));
}
}
}
  



NewMaxTemperReducer.java

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class NewMaxTemperReducer extends Reducer {

@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
System.out.println("start to work in reducer method ...");
int maxValue = Integer.MIN_VALUE;
for (IntWritable intWrit : values) {
maxValue = Math.max(maxValue, intWrit.get());
}
context.write(key, new IntWritable(maxValue));
}

}

  


NewMaxTempperCombiner.java



import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class NewMaxTempperCombiner extends Reducer  {
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
System.out.println("NewMaxTempperCombiner - reduce() - do combiner...");
int maxValue = Integer.MIN_VALUE;
for (IntWritable intWrit : values) {
maxValue = Math.max(maxValue, intWrit.get());
}
context.write(new Text(key), new IntWritable(maxValue));
}
}
  

NewDomain.java



import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class NewDomain {
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
if (args == null || args.length != 2) {
System.err.println("input is not legal.");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(NewDomain.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(NewMaxTemperMapper.class);
job.setReducerClass(NewMaxTemperReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true)?0:1);
}
}

  

OK 将项目导出成一个可运行jar

将此jar放到单机模式或者伪分布式模式下,通过hadoop/bin下面的hadoop执行

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-309487-1-1.html 上篇帖子: 【转】Hadoop学习路线图 下篇帖子: 运行hadoop jar
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表