自己的第一个MapReduce程序
数据源:来自互联网招聘hadoop岗位的薪资数据,其中几行示例数据如下:
美团 3-5年经验 15-30k 北京 【够牛就来】hadoop高级工程...
北信源 3-5年经验 15-20k 北京 Java高级工程师(有Hadoo...
蘑菇街 3-5年经验 10-24k 杭州 hadoop开发工程师
晶赞科技 1-3年经验 10-30k 上海 hadoop研发工程师
秒针系统 3-5年经验 10-20k 北京 hadoop开发工程师
搜狐 1-3年经验 18-23k 北京 大数据平台开发工程师(Hadoo...
执御 1-3年经验 8-14k 杭州 hadoop工程师
KK唱响 3-5年经验 15-30k 杭州 高级hadoop开发工程师
晶赞科技 1-3年经验 12-30k 上海 高级数据分析师(hadoop)
亿玛在线(北京)科技有限公司 3-5年经验 18-30k 北京 hadoop工程师
酷讯 1-3年经验 10-20k 北京 hadoop Engineer/...
游族网络 5-10年经验 20-35k 上海 hadoop研发工程师
易车公司 3-5年经验 15-30k 北京 hadoop工程师
爱图购 1-3年经验 8-15k 杭州 hadoop开发工程师
晶赞科技 3-5年经验 15-33k 上海 hadoop研发工程师
功能需求:基于这份数据统计Hadoop工程师各工作年限段的薪资水平,输出如下:
1-3年经验 8-30k
3-5年经验 10-33k
5-10年经验 20-35k
import java.io.IOException;
import java.util.regex.Pattern;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; /**
* 基于样本数据做Hadoop工程师薪资统计:计算各工作年限段的薪水范围
*/
public class SalaryCount extends Configured implements Tool { public static class SalaryMapper extends Mapper< LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//红色自己编写
//示例数据:美团 3-5年经验 15-30k 北京 hadoop高级工程
String line = value.toString();//读取每行数据 String[] record = line.split( "\\s+");//使用空格正则解析数据
//key=record[1]:输出3-5年经验
//value=record[2]:15-30k
//作为Mapper输出,发给 Reduce 端
if(record.length >= 3){
context.write( new Text(record[1]), new Text(record[2])
);
}
}
}
public static class SalaryReducer extends Reducer< Text, Text, Text, Text> {
public void reduce(Text Key, Iterable< Text> Values, Context context) throws IOException, InterruptedException { int low = 0;//记录最低工资
int high = 0;//记录最高工资
int count = 1;
//针对同一个工作年限(key),循环薪资集合(values),并拆分value值,统计出最低工资low和最高工资high
for (Text value : Values) {
String[] arr = value.toString().split("-");
int l = filterSalary(arr[0]);
int h = filterSalary(arr[1]);
if(count==1 || l< low){
low = l;
}
if(count==1 || h>high){
high = h;
}
count++;
}
context.write(Key, new Text(low + "-" +high + "k"));
}
}
//正则表达式提取工资值
public static int filterSalary(String salary) {
String sal = Pattern.compile("[^0-9]").matcher(salary).replaceAll("");
return Integer.parseInt(sal);
} @Override
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();//读取配置文件 Path out = new Path(args[1]);
FileSystem hdfs = out.getFileSystem(conf);
if (hdfs.isDirectory(out)) {//删除已经存在的输出目录
hdfs.delete(out, true);
} Job job = new Job(conf, "SalaryCount" );//新建一个任务
job.setJarByClass(SalaryCount.class);// 主类 FileInputFormat.addInputPath(job, new Path(args[0]));// 文件输入路径
FileOutputFormat.setOutputPath(job, new Path(args[1]));// 文件输出路径 job.setMapperClass(SalaryMapper.class);// Mapper
job.setReducerClass(SalaryReducer.class);// Reducer job.setOutputKeyClass(Text.class);//输出结果key类型
job.setOutputValueClass(Text.class);//输出结果的value类型 job.waitForCompletion(true);//等待完成退出作业 return 0;
} /**
* @param args 输入文件、输出路径,可在Eclipse中Run Configurations中配Arguments,如:
* hdfs://single.hadoop.dajiangtai.com:9000/junior/salary.txt
* hdfs://single.hadoop.dajiangtai.com:9000/junior/salary-out/
*/
public static void main(String[] args) throws Exception {
try {
int res = ToolRunner.run(new Configuration(), new SalaryCount(), args);
System.exit(res);
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结,通过左右对比可看出,70%的代码几乎一样,重要的是修改map、reduce部分,以及run方法中的部分设置。好了,在你搭建好的Eclipse开发环境中跑一下这个程序看看结果吧。
自己的第一个MapReduce程序的更多相关文章
- 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)
上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...
- 编写自已的第一个MapReduce程序
从进入系统学习到现在,貌似我们还没有真正开始动手写程序,估计有些立志成为Hadoop攻城狮的小伙伴们已经有些急了.环境已经搭好,小讲也有些按捺不住了.今天,小讲就和大家一起来动手编写我们的第一个Map ...
- 编写第一个MapReduce程序—— 统计气温
摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...
- 从零开始学习Hadoop--第2章 第一个MapReduce程序
1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...
- 第一个MapReduce程序——WordCount
通常我们在学习一门语言的时候,写的第一个程序就是Hello World.而在学习Hadoop时,我们要写的第一个程序就是词频统计WordCount程序. 一.MapReduce简介 1.1 MapRe ...
- Hadoop学习之第一个MapReduce程序
期望 通过这个mapreduce程序了解mapreduce程序执行的流程,着重从程序解执行的打印信息中提炼出有用信息. 执行前 程序代码 程序代码基本上是<hadoop权威指南>上原封不动 ...
- 运行第一个MapReduce程序,WordCount
1.安装Eclipse 安装后如果无法启动重新配置Java路径(如果之前配置了Java) 2.下载安装eclipse的hadoop插件 注意版本对应,放到/uer/lib/eclipse/plugin ...
- 第一个MapReduce程序
计算文件中每个单词的频数 wordcount 程序调用 wordmap 和 wordreduce 程序. import org.apache.hadoop.conf.Configuration; im ...
- Hadoop 6、第一个mapreduce程序 WordCount
1.程序代码 Map: import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.h ...
随机推荐
- Servlet 表单数据
很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. GET 方法 GET 方法向页 ...
- odata配置控制器方法路由1
查看edmx:http://localhost:12769/odata/$metadata 1.配置 ODataConventionModelBuilder builder = new ODataCo ...
- python使用电子邮件模块smtplib的方法(发送图片 附件)实用可行
Smptp类定义:smtplib.SMTP(host[,port[,local_hostname[,,timeout]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可 ...
- socket listen/accept
listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...
- 【BZOJ2384】[Ceoi2011]Match KMP
[BZOJ2384][Ceoi2011]Match Description 作为新一轮广告大战的一部分,格丁尼亚的一家大公司准备在城市的某处设置公司的标志(logo).公司经理决定用一些整栋的建筑来构 ...
- eclipse远程debug Java程序
使用Eclipse JPDA远程调试Java程序 本文将介绍使用Eclipse JPDA,在Eclipse的开发环境下对远程运行的Java程序进行调试操作. 请按以下步骤进行(本人已经在Eclipse ...
- Anker—工作学习笔记
1.前言 最近在项目中用nginx做反向代理,需要动态生成nginx的配置.大概流程是用户在页面上新增域名.http或https协议以及端口信息,后台会根据域名自动生成一个nginx的server配置 ...
- 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)(转)
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方. .NET框架提供了两种串行化的方式: ...
- 学习 Tornado
异步编程 预习 lambda Lambda functions can be used wherever function objects are required. They are syntact ...
- php-fpm 启动 关闭 进程逃逸 pid
正常关闭失败 [root@d personas]# /etc/init.d/php-fpm stopGracefully shutting down php-fpm /etc/init.d/php-f ...