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有一定的自我见解, ...
随机推荐
- [linux]signal函数不起作用
#include "apue.h" #include <sys/wait.h> static void sig_int(int); /* our signal-catc ...
- 解决VisualStudio2013无法查看数组内容的问题
症状: 在使用VS2013调试的时候,数组只能查看第一个元素的值.如图 解决方案: 调试>窗口>内存 输入数组的内存地址,右击内存窗口>带符号显示(也可以选择16进制显示,看你自己的 ...
- jquery 获取绑定事件
在1.8.0版本之前,我们要想获取某个DOM绑定的事件处理程序可以这样: 1 $.data(domObj,'events');//或者$('selector').data('events') 而从1. ...
- Tomcat性能优化(二) 启动参数设置
一.tomcat绿色版设置方法 进入tomcat/bin目录下,找到catalina.bat文件在文件首行中插入下面这段配置即可. set JAVA_OPTS=-server -Djava.awt.h ...
- 安全 流程服务器开新机器 内外网 iptables 安全组 用户安全root用户的使用.
安全 流程服务器开新机器 内外网 iptables 安全组 用户安全root用户的使用.
- windbg的使用
1. set 1.1. 设置Symbol file path file->symbol file path, 如: D:\***\TestProject\pdb 1.2 设置source ...
- Asp.Net MVC 把PartialView、View转换成字符串
在开发中有时要在后台获得某个View 或者 PartialView 生成的字符串,只要你熟悉Asp.Net MVC 生命周期就能理解和敲出下面的代码.没什么高深的,直接上代码: 1,输出View H ...
- xdebug常用配置
;指定xdebug文件 zend_extension = "F:\tools\develop_tools\php\php_xdebug-2.2.2-5.4-vc9.dll" ;xd ...
- jboss6.4 域模式自动部署
1.通过jenkins传递部署包到服务器,调用自动部署shell完成jboss6.4的域模式部署: 2.自动部署shell如下: 完成部署包重命名(从jenkins过来的包可能没有改名:). 调用jb ...
- LED音乐频谱之概述
点击打开链接 转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/37929733 这个LED音乐频谱是我在学51单片机的 ...