一、数据处理类

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. PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建

    最近一段时间会学习一下PHP全栈开发,将会写一系列的文章来总结学习的过程,以自勉. 第一篇记录一下LAMP环境的安装 0. 安装Apache Web服务器 安装之前先更新一下系统 sudo apt-g ...

  2. django如何给上传的图片重命名(给上传文件重命名)

    1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: # -*- coding: UTF-8 -* ...

  3. supervisor配置详解

    原文:http://lixcto.blog.51cto.com/4834175/1539136 有阵子没写博客了,这段时间一直在研究python django框架和前端相关的东西.楼主学通信的,对we ...

  4. 你所不知道的JSON

    译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? JSON已经逐渐替代XML被全世界的开发者广泛使用.本文深入讲解JavaScript中使用JSON. ...

  5. GUI 即人机交互图形化用户界面设计

    GUI 即人机交互图形化用户界面设计.纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了 ...

  6. centos配置ssh免密码登录后,仍提示输入密码

    配置SSH无密码登录需要3步: 1.生成公钥和私钥 2.导入公钥到认证文件,更改权限 3.测试 1.生成公钥和私钥 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 默 ...

  7. VB.NET多线程入门

    近期项目中遇到了一个处理速度慢阻塞用户界面操作的问题,因此想用多线程来解决. 在处理数据的循环中,新建线程,在新建的线程中处理数据.多线程同一时候处理数据,以此来达到加速的目的,使用户界面操作变得流畅 ...

  8. &lt; APT 攻击&gt;看起来是 .PPT 附件,竟是 .SCR !!

    趋势科技以前在2013年下半年度目标攻击综合报告里指出,发现了好几起APT攻击-高级持续性渗透攻击 (Advanced Persistent Threat, APT) /目标攻击相关的攻击活动. 趋势 ...

  9. Spring_day01--注入对象类型属性(重点)_P名称空间注入_注入复杂类型属性_IOC和DI区别_Spring整合web项目原理

    注入对象类型属性(重点) Action要new一个service对象,Service中又要new一个Dao对象,现在把new的过程交给spring来操作 1 创建service类和dao类 (1)在s ...

  10. 【RF库测试】对出错的处理

    1.出错后继续执行:Run Keyword And Continue On Failure 2.获取关键字执行结果后继续执行:Run Keyword And Ignore Error 有时候,我们需要 ...