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

[经验分享] Hadoop应用系列2--MapReduce原理浅析(上)

[复制链接]

尚未签到

发表于 2016-12-12 11:16:47 | 显示全部楼层 |阅读模式
我们以《Hadoop权威指南》这本书上的例子,来分析一下,MapReduce是如何工作的。
我们引用它分析气温的例子。这个例子还是非常经典的,我个人认为小缺点就是,没有对传统的程序是如何工作的进行对比,如果加入此项,它将是一个完美的东西,现在就让我们,来完美它。
手写我们写一段Java程序,实现相同的功能<分析1901年和1902年最高气温>,当然程序略加改动就可以分析最低气温,在改动一下,就可以高和低同时出现,废话了,呵呵。
这里需要使用气温的数据, 我会提供下载链接。
我们提出一行数据,看看,年份在哪里
0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999

package org.pcwl;
/**
* @author QQ:81739279 e-mail: project_maker@sina.com
* 需要的基本知识 java.lang.String API
* 本段程序的目的是找到我们要使用的数据在什么地方
* 注意: NCDC的气温数据精确到小数点后1为
*/
public class MaxTemperatureReady {
/** 在1901年数据中,复制出来第一行,用于寻找年份、气温 */
private static final String data = "0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999";
public static void main(String[] args) {
// 显示年份 运行结果 15 ,我们需要4为,至19
System.out.println(data.indexOf("1901"));
// 气温,是一个数字,有正数和负数, 在字符串中,找看看,+/-在哪里 , 以确定截取区域
// 在这里我没发现 有 +64333+025450FM-12+000599999V020........N9-00781+
// 结论, N0000001N9至+这个位置之间是气温, 找他的位置
// 运行结果 77 加上这10位,结果为87 , 如果低87为是+不需要 下一个符号+ 之前是5为
System.out.println(data.indexOf("N0000001N9"));
// 找一条看看
String fmt = "%s年%d度";
// 注意:不含92 也就是 这里能娶到-0078 零下7.8的意思, 如果零下78.1冻死人诶~~~
System.out.println(String.format(fmt, data.substring(15,19), Integer.parseInt(data.substring(87, 92)) ));
// 好了, 数据如何提取我们已经知道了.
}
}

开始编写程序来分析最高气温吧.
package org.pcwl;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
*
* @author E-mail:project_maker@sina.com
* 计算最高气温, 本程序分2个部分, 一个部分读取数据,一个部分对数据进行计算,输出结果
*/
public class JavaMaxTemperature {
/** 用于存储读取到的年份和气温数据
*  一年中有很多天<valueList<Integer>>,
*  年份是固定的几个<key>
*/
private static Map<String, List<Integer>> temperatureMap= new HashMap<String, List<Integer>>();
private static File outDirectory = null;
private static DataOutputStream dos = null;
/**
* @throws IOException
*/
public static void main(String[] args) throws IOException {
if(args.length != 2){
System.out.println("请输入数据来源和数据目标");
}
/* 创建目标文件*/
outDirectory = new File(args[1]);
File outFile = new File(outDirectory, "part-0000");
dos = new DataOutputStream(new FileOutputStream(outFile));
/* 读取指定文件夹下的文件 */
File inDirectory = new File(args[0]);
for(File inFile : inDirectory.listFiles()){
readData(inFile);
}
/* 关闭输出流 */
dos.close();
}
/**
* 读取数据, 把年份作为map的Key, List<Integer>存放每一天的气温数据
* @param file
* @throws IOException
*/
static void readData(File file) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while(null != (line=br.readLine())){
String year = line.substring(15, 19);
int temperature;
if(line.charAt(87) == '+'){
temperature = Integer.parseInt(line.substring(88, 92));
}else{
temperature = Integer.parseInt(line.substring(87, 92));
}
/* 运行程序发现1901结果为9999, 黄金都能融化,显然999是个错误的数据,排除 */
if(temperature != 9999 ){
addYearAndTemperature(year, temperature);
}
}
out();
}
/**
* 添加年份和气温数据到map中
* @param year
* @param temperature
*/
static void addYearAndTemperature(String year, int temperature){
List<Integer> list;
if(temperatureMap.containsKey(year)){
list = temperatureMap.get(year);
}else{
list = new ArrayList<Integer>();
}
list.add(temperature);
temperatureMap.put(year, list);
}
/**
* 计算最高气温并且输出
* @throws IOException
*/
static void out() throws IOException{
int max = Integer.MIN_VALUE;
String year = null;
for(Iterator<String> it = temperatureMap.keySet().iterator(); it.hasNext();){
year= it.next();
List<Integer> temperatures = temperatureMap.get(year);
for(Integer i : temperatures){
max = Math.max(max, i);
}
}
dos.writeUTF(year +"\t" + max+"\n");
temperatureMap.clear();
}
}


src为代码,data为数据
宝宝醒了, 等会再来写 MapReduce,请期待.....

运维网声明 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.yunweiku.com/thread-313242-1-1.html 上篇帖子: Hadoop Map/Reduce执行全流程关键代码 下篇帖子: hadoop 1.0.4 fsimage 文件格式分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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