HDFS 手写mapreduce单词计数框架
一、数据处理类
package com.css.hdfs; 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; /**
* 需求:文件(hello world hello teacher hello john tom ) 统计每个单词出现的次数?
* 数据存储在hdfs、统计出来的结果存储到hdfs
*
* 2004google:dfs/bigtable/mapreduce
*
* 大数据解决的问题?
* 1.海量数据的存储
* hdfs
* 2.海量数据的计算
* mapreduce
*
* 思路?
* hello 2
* world 1
* hello 1
* ...
*
* 基于用户体验:
* 用户输入数据
* 用户处理的方式
* 用户指定结果数据存储位置
*/
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();
// 构建hdfs客户端对象
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.146.132:9000/"), conf, "root");
// 读取用户输入的文件
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("数据统计结果完成......");
}
}
二、接口类
package com.css.hdfs; /**
* 思路:
* 接口设计
*/
public interface Mapper {
// 调用方法
public void map(String line, Context context);
}
三、数据传输类
package com.css.hdfs; import java.util.HashMap; /**
* 思路:
* 数据传输的类
* 封装数据
* 集合
* <单词,1>
*/
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;
}
}
四、单词计数类
package com.css.hdfs; /**
* 思路:
* 添加一个map方法 单词切分 相同key的value ++
*/
public class WordCountMapper implements Mapper{ @Override
public void map(String line, Context context) {
// 拿到这行数据 切分
String[] words = line.split(" ");
// 拿到单词 相同的key value++ hello 1 world 1
for (String word : words) {
Object value = context.get(word);
if (null == value) {
context.write(word, 1);
}else {
// 不为空
int v = (int)value;
context.write(word, v+1);
}
}
}
}
五、配置文件job.properties
IN_PATH=/wc/in
OUT_PATH=/wc/out/rs.txt
MAPPER_CLASS=com.css.hdfs.WordCountMapper
HDFS 手写mapreduce单词计数框架的更多相关文章
- Hadoop分布环境搭建步骤,及自带MapReduce单词计数程序实现
Hadoop分布环境搭建步骤: 1.软硬件环境 CentOS 7.2 64 位 JDK- 1.8 Hadoo p- 2.7.4 2.安装SSH sudo yum install openssh-cli ...
- 全命令行手写MapReduce并且打包运行
主要要讲的有3个 java中的package是干啥的? 工作了好几年的都一定真正理解java里面的package关键字,这里在写MapReduce需要进行打包的时候突然发现命令行下打包运行居然不会了, ...
- 纯手写SpringMVC到SpringBoot框架项目实战
引言 Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 通过这种方式,springboot ...
- 手写mini版MVC框架
目录 1, Springmvc基本原理流程 2,注解开发 编写测试代码: 目录结构: 3,编写自定义DispatcherServlet中的初始化流程: 3.1 加载配置文件 3.2 扫描相关的类,扫描 ...
- 手写简易版RPC框架基于Socket
什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...
- swift项目第三天:手写代码搭建主框架
一:先配置环境:自定义Log输出(DEBUG 和 release模式),并屏蔽后台多余的打印信息 1:屏蔽后台多余的打印信息:如果写了OS_ACTIVITY_MODE = disable 还是不行.把 ...
- 手写ORM持久层框架(转)
工程结构: 本文测试的数据库为: 其中student的表结构为: 表数据: 配置文件 DB2.properties driver=com.mysql.jdbc.Driver url=jdbc\:mys ...
- 手写MyBatis ORM框架实践
一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...
- 手写一个简单到SpirngMVC框架
spring对于java程序员来说,无疑就是吃饭到筷子.在每次编程工作到时候,我们几乎都离不开它,相信无论过去,还是现在或是未来到一段时间,它仍会扮演着重要到角色.自己对spring有一定的自我见解, ...
随机推荐
- win7下如何显示缅文和使用缅文输入法?
windows 7 操作系统默认不支持缅文,所以缅文在win7上不能显示,当然也没有提供缅文输入法. 一.显示缅文 windows系统下显示缅文字母只需要安装缅文字体就可以了.目前常见的缅文字体就是Z ...
- 简单实现Spring中BeanFactory原理
上一篇文章介绍了Java反射机制在Spring IOC中的应用,知道了BeanFactory底层的实现原理. 原理搞懂了,对Spring IOC理解起来也很容易. 先来看看Java代码获取Spring ...
- Java运行结果测试
- myeclipse工程重名后怎么更改deploy location?
http://zhidao.baidu.com/link?url=I9E16OYfxovPHqBrRWhYCI9TYNG_X-Whg_X7QrJiOBXBGEwi-6WYsC-Zi4Jcg9zd3ye ...
- 在后台运行Python脚本服务
在服务器,程序都是后台运行的,当写的python脚本时,需要: 你要是想python robot.py & 是不行的,一旦用户登出,脚本就自动退出了.用at, cron也可以实现不过我发现 ...
- C语言错误: CRT detected that the application wrote to memory after end of heap buffer
CRT detected that the application wrote to memory after end of heap buffer 多是中间对其进行了一些操作,在程序结束处,释放内存 ...
- 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉 ...
- php -- each()、list()
1.each的用法 先看API:array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...
- 配置linux的环境变量
下面是配置linux的环境变量:(记得source .bash_profile). 修改/etc/profile文件 (全局所有用户) vi 此文件/etc/profile在profile文件末尾加入 ...
- 说说JSON和JSONP 也许你会豁然开朗
说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决 前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只 ...