大数据学习之手写MR框架(WordCount程序开发)08

简介:这里先手写一个MR程序,大致实现一个单词计数程序。帮助后面学习MapReduce组件。

1:先自定义一个Mapper接口

package it.dawn.HDFSPra.HandWritingMR;
/**
 * @author Dawn
 * @date 2019年4月30日23:28:00
 * @version 1.0
 *
 * 思路?
 * 接口设计
 */
public interface Mapper {
	//通用方法
	public void map(String line,Context context);
}

2:定义一个Context类:

该类主要实现数据的传输,和数据的封装(这里用的一个HashMap进行封装的)

package it.dawn.HDFSPra.HandWritingMR;
/**
 * @author Dawn
 * @date 2019年4月30日23:18:13
 * @version 1.0
 *
 * 思路?
 * 数据传输的类
 * 封装数据
 * 集合
 * <单词,1>
 */

import java.util.HashMap;

public class Context {
	//数据封装
	private HashMap<Object, Object> contextMap=new HashMap<>();

	//写数据
	public void write(Object key,Object value) {
		//放数据到map中
		contextMap.put(key, value);
	}

	//定义根据key拿到值方法
	public Object get(Object key) {
		return contextMap.get(key);
	}

	//拿到map当中的数据内容
	public HashMap<Object, Object> getContextMap(){
		return contextMap;
	}
}

3:实现Mapper类(其实这里就是简化的Map和Reduce阶段)

package it.dawn.HDFSPra.HandWritingMR;
/**
 * @author Dawn
 * @date 2019年4月30日23:22:35
 * @version 1.0
 *
 * 思路:
 * 	添加一个map方法  单词切分 相同key的value ++
 */
public class WordCountMapper implements Mapper{

	@Override
	public void map(String line, Context context) {
		//1.拿到这行数据 切分
		String[] words=line.split(" ");

		//2.拿到单词 相同的key value++  hello 1 itstar 1
		for(String word:words) {
			Object value=context.get(word);
			//相对于插入数据到HashMap中
			if(null==value) {
				context.write(word, 1);
			}else {
				//HashMap不为空
				int v=(int) value;
				context.write(word, v+1);
			}
		}
	}

}

4:写一个总程序将这几个串起来(相当于是一个MR中的那个Driver程序,指定Map和Reduce的类。总程序入口)

package it.dawn.HDFSPra.HandWritingMR;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

/**
 * @author Dawn
 * @date 2019年4月30日23:07:18
 * @version 1.0
 *
 * 需求:文件(hello itstar hello hunter hello hunter henshuai ) 统计每个单词出现的次数?
 * 	   数据存储在hdfs、统计出来的结果存储到hdfs
 *
 * 2004google:dfs/bigtable/mapreduce
 *
 * 大数据解决的问题?
 * 	1.海量数据的存储
 * 		hdfs
 *  2.海量数据的计算
 *  	mapreduce
 *
 * 思路?
 * 	 hello 1
 *   itstar 1
 *   hello 1
 *   ...
 *
 * 基于用户体验:
 * 	用户输入数据(hdfs)
 *  用户处理的方式
 *  用户指定结果数据存储位置
 *
 */
public class HdfsWordCount {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, InterruptedException, URISyntaxException {
		//反射
		Properties pro=new Properties();
		//加载配置文件
		pro.load(HdfsWordCount.class.getClassLoader().getResourceAsStream("job.properties"));

		Path inpath=new Path(pro.getProperty("IN_PATH"));
		Path outpath=new Path(pro.getProperty("OUT_PATH"));

		Class<?> mapper_class=Class.forName(pro.getProperty("MAPPER_CLASS"));
		//实例化
		Mapper mapper=(Mapper) mapper_class.newInstance();

		Context context=new Context();

		//1.构建hdfs客户端对象
		Configuration conf=new Configuration();
		FileSystem fs=FileSystem.get(new URI("hdfs://bigdata11:9000"), conf, "root");

		//2.读取用户输入的文件
		//读取到的是改文件下的所有的txt文件
		RemoteIterator<LocatedFileStatus> iter=fs.listFiles(inpath, false);

		while(iter.hasNext()) {
			LocatedFileStatus file=iter.next();
			//打开路径 获取输入流
			FSDataInputStream in=fs.open(file.getPath());
			BufferedReader br=new BufferedReader(new InputStreamReader(in, "utf-8"));

			String line = null;

			while((line=br.readLine()) != null) {
				//调用map方法执行业务逻辑
				mapper.map(line, context);
			}

			br.close();
			in.close();
		}

		//如果用户输入的结果路径不存在 则创建一个
		Path out = new Path("/wc/out/");
		if(!fs.exists(out))
			fs.mkdirs(out);

		//将缓存的结果放入hdfs中存储
		HashMap<Object, Object> contextMap=context.getContextMap();
		FSDataOutputStream out1=fs.create(outpath);

		//遍历HashMap
		Set<Entry<Object, Object>> entrySet = contextMap.entrySet();
		for(Entry<Object, Object> entry:entrySet) {
			//写数据
			out1.write((entry.getKey().toString()+"\t"+entry.getValue()+"\n").getBytes());
		}

		out1.close();
		fs.close();

		System.out.println("数据统计结果完成....");
	}

}

  

配置文件(job.properties)如下:

IN_PATH=/dawn
OUT_PATH=/wc/out/rs.txt
MAPPER_CLASS=it.dawn.HDFSPra.HandWritingMR.WordCountMapper

  

原文地址:https://www.cnblogs.com/hidamowang/p/10798796.html

时间: 2024-10-08 03:59:46

大数据学习之手写MR框架(WordCount程序开发)08的相关文章

零基础大数据学习框架

大数据开发最核心的课程就是Hadoop框架,几乎可以说Hadoop就是大数据开发.这个框架就类似于Java应用开发的SSH/SSM框架,都是Apache基金会或者其他Java开源社区团体的能人牛人开发的贡献给大家使用的一种开源Java框架.科多大数据大数据来带你看看. Java语言是王道就是这个道理,Java的核心代码是开源的,是经过全球能人牛人共同学习共同研发共同检验的,所以说Java是最经得住检验的语言,而且任何人都可以学习Java核心技术并且使用核心技术开发出像android一样的系统和H

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集

引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单机的搭建,是因为作为个人学习的话,单机已足以,好吧,说实话是自己的电脑不行,使用虚拟机实在太卡了... 整个的集群搭建是在公司的测试服务搭建的,在搭建的时候遇到各种各样的坑,当然也收获颇多.在成功搭建大数据集群之后,零零散散的做了写笔记,然后重新将这些笔记整理了下来.于是就有了本篇博文. 其实我在搭

大数据学习路径

大数据学习路径我vx ①⑤零零③④③⑥⑨③① 备注 A 更多大数据第一阶段linux+搜索+hadoop体系 Linux基础→shell编程→高并发架构→lucene,solr搜索→hadoop体系→HDFS→mapreduce→hbase→zookeeper→hive→flume→sqoop→项目实战一 第二阶段机器学习 R语言→mahout→项目实战二 第三阶段storm流式计算 kafka→storm→redis→项目实战三 第四阶段spark内存计算 scala编程→spark core

大数据学习路线整理

一.大数据技术基础 1.linux操作基础 linux系统简介与安装    linux常用命令–文件操作    linux常用命令–用户管理与权限    linux常用命令–系统管理    linux常用命令–免密登陆配置与网络管理    linux上常用软件安装    linux本地yum源配置及yum软件安装    linux防火墙配置    linux高级文本处理命令cut.sed.awk    linux定时任务crontab 2.shell编程 shell编程–基本语法    shel

学大数据需要什么编程基础?大数据学习步骤是什么?

学大数据需要什么编程基础?大数据学习步骤是什么? 大数据是什么? 有很多朋友问过我,大数据到底是什么?一句话来- 学大数据需要什么编程基础?大数据学习步骤是什么?大数据是什么? 有很多朋友问过我,大数据到底是什么?一句话来概括 针对非软件行业的朋友 根据你平时在超市,加油站,饭店等地方的一些消费行为,通过大数据这个技术,我们可以知道你现在的年龄范围,是否婚配,是否有孩子,孩子大致是几岁,是否有固定住宅,车大致是什么价位的等信息. 针对软件行业的朋友 平时我们写的程序都是在一台机器上运行,处理能力

好程序员大数据学习路线分享MAPREDUCE

好程序员大数据学习路线分享MAPREDUCE,需求:统计大量的文本文件中的单词出现的次数 1)整个运算需要分阶段 阶段一:并行局部运算 阶段二 :汇总处理,不同的阶段需要开发不同的程序 2)阶段之间的调用 3)业务程序(task程序)如何并发到集群并启动程序 4)如何监控task程序的运行状态,如何处理异常 ::这些问题是开发分布式程序都会面临的问题,完全可以封装成框架::MR 的结构 一个完整的MapReduce运行时有三类实例进程: 1)MRAppMaster : 负责整个程序的过程调度和状

揭秘java大数据学习路线图

很多的同学在学习JavaEE的路上都过得的是坎坷,可以说是夜以继日的敲代码在学习,却发现自己是事倍功半,有的时候遇到一个bug真的很难受,无限互联java大数据培训专家为大家整理了一篇很值得大家去借鉴的学习路线图文章,希望大家在学习的路上一能帆风顺! 一.Java的核心 这就是学习Java的基础,掌握程度的深与浅甚至直接影响后面的整个学习进程. Java的核心主要包括了几个部分: 一. java大数据学习路线图 1.初级的有语法基础.面向对象思想. 学习任何一门语言语法都是必须的,因为Java的

史上最全“大数据”学习资源整理

史上最全"大数据"学习资源整理 当前,整个互联网正在从IT时代向DT时代演进,大数据技术也正在助力企业和公众敲开DT世界大门.当今"大数据"一词的重点其实已经不仅在于数据规模的定义,它更代表着信息技术发展进入了一个新的时代,代表着爆炸性的数据信息给传统的计算技术和信息技术带来的技术挑战和困难,代表着大数据处理所需的新的技术和方法,也代表着大数据分析和应用所带来的新发明.新服务和新的发展机遇. 为了帮助大家更好深入了解大数据,云栖社区组织翻译了GitHub Aweso