一、数据处理类

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单词计数框架的更多相关文章

  1. Hadoop分布环境搭建步骤,及自带MapReduce单词计数程序实现

    Hadoop分布环境搭建步骤: 1.软硬件环境 CentOS 7.2 64 位 JDK- 1.8 Hadoo p- 2.7.4 2.安装SSH sudo yum install openssh-cli ...

  2. 全命令行手写MapReduce并且打包运行

    主要要讲的有3个 java中的package是干啥的? 工作了好几年的都一定真正理解java里面的package关键字,这里在写MapReduce需要进行打包的时候突然发现命令行下打包运行居然不会了, ...

  3. 纯手写SpringMVC到SpringBoot框架项目实战

    引言 Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 通过这种方式,springboot ...

  4. 手写mini版MVC框架

    目录 1, Springmvc基本原理流程 2,注解开发 编写测试代码: 目录结构: 3,编写自定义DispatcherServlet中的初始化流程: 3.1 加载配置文件 3.2 扫描相关的类,扫描 ...

  5. 手写简易版RPC框架基于Socket

    什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...

  6. swift项目第三天:手写代码搭建主框架

    一:先配置环境:自定义Log输出(DEBUG 和 release模式),并屏蔽后台多余的打印信息 1:屏蔽后台多余的打印信息:如果写了OS_ACTIVITY_MODE = disable 还是不行.把 ...

  7. 手写ORM持久层框架(转)

    工程结构: 本文测试的数据库为: 其中student的表结构为: 表数据: 配置文件 DB2.properties driver=com.mysql.jdbc.Driver url=jdbc\:mys ...

  8. 手写MyBatis ORM框架实践

    一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...

  9. 手写一个简单到SpirngMVC框架

    spring对于java程序员来说,无疑就是吃饭到筷子.在每次编程工作到时候,我们几乎都离不开它,相信无论过去,还是现在或是未来到一段时间,它仍会扮演着重要到角色.自己对spring有一定的自我见解, ...

随机推荐

  1. 一定要使用-server参数来调试并发程序

    在阅读JCIP的时候想手工测试一下,结果发现总是没有出现书中描述的并发问题 后来我琢磨,以前记得书上说过,在debugging的环境下,JVM是低并发的,一定要在server的环境下测试,让JVM在高 ...

  2. CodeForces 2A Winner

    Winner Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  3. dp之完全背包poj2063

    题意:求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币. 注意:每一年收到的利息都可以作为下一年的本金......其实从测试数据来看,是很好看出来的...... 思路 ...

  4. char函数绕过魔术引号注入

    我目前学习到的绕过魔术引号的几种方法(如果知道还有别的请万望告之): 1.倘若服务端是GBK可以尝试宽字节注入 2.使用char函数绕过魔术引号进行注入 3.同char函数类似的函数,例如bin(转换 ...

  5. 非常多学ThinkPHP的新手会遇到的问题

    在模板传递变量的时候,非常多视频教程都使用$v.channel的方式.例如以下: <a href="{:U('Chat/set',array('id'=>$v.channel)) ...

  6. 使用padding和float处理带有间隙的多块布局

    . 每个间隙都是20px <div class="action-content pd10" style=""> <div class=&quo ...

  7. spingboot集成jpa(一)

    springboot + jpa 练习 spingboot集成jpa(一):最基本的环境搭建 spingboot集成jpa(二):使用单元测试 1. pom.xml中添加依赖 <!-- jdbc ...

  8. shiro配置unauthorizedUrl,无权限抛出无权限异常,但是不跳转

    在使用shiro配置无授权信息的url的时候,发现这样的一个scenario,配置好unauthorizedUrl后仍然无法跳转,然后就在网上开始找,找了原因以及解决方案 原因,先post一个源码: ...

  9. C++ map修改指定key的value

    对于修改C++指定key的value,网上查了很多,都说直接insert就会覆盖原来的值,是否是这样的呢?  C++ Code  12345678910111213141516171819202122 ...

  10. Codeforces Round #296 (Div. 2) B. Error Correct System

    B. Error Correct System time limit per test 2 seconds memory limit per test 256 megabytes input stan ...