MapReduce原理:

MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是"任务的分解与结果的汇总"。

在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker;另一个是TaskTracker,JobTracker是用于调度工作的,TaskTracker是用于执行工作的。一个Hadoop集群中只有一台JobTracker。

在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。

需要注意的是,用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。

在Hadoop中,每个MapReduce任务都被初始化为一个Job,每个Job又可以分为两种阶段:map阶段和reduce阶段。这两个阶段分别用两个函数表示,即map函数和reduce函数。map函数接收一个形式的输入,然后同样产生一个形式的中间输出,Hadoop函数接收一个如形式的输入,然后对这个value集合进行处理,每个reduce产生0或1个输出,reduce的输出也是形式的。

下面以一个最简单的例子说明:

单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到。单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数,如下图所示。

package

org.apache.hadoop.examples;

import

java.io.IOException;

import

java.util.StringTokenizer;

import

org.apache.hadoop.conf.Configuration;

import

org.apache.hadoop.fs.Path;

import

org.apache.hadoop.io.IntWritable;

import

org.apache.hadoop.io.Text;

import

org.apache.hadoop.mapreduce.Job;

import

org.apache.hadoop.mapreduce.Mapper;

import

org.apache.hadoop.mapreduce.Reducer;

import

org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import

org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import

org.apache.hadoop.util.GenericOptionsParser;

public class WordCount

{

public static class

TokenizerMapper

extends

Mapper{

private final

static IntWritable one = new IntWritable(1);

private Text word

= new Text();

public void

map(Object key, Text value, Context context)

throws

IOException, InterruptedException {

StringTokenizer

itr = new StringTokenizer(value.toString());

while

(itr.hasMoreTokens()) {

word.set(itr.nextToken());

context.write(word, one);

}

}

}

public static class

IntSumReducer

extends Reducer

{

private

IntWritable result = new IntWritable();

public void

reduce(Text key, Iterable values,Context context)

throws

IOException, InterruptedException {

int sum =

0;

for (IntWritable

val : values) {

sum +=

val.get();

}

result.set(sum);

context.write(key,

result);

}

}

public static void

main(String[] args) throws Exception {

Configuration conf =

new Configuration();

String[] otherArgs =

new GenericOptionsParser(conf,

args).getRemainingArgs();

if (otherArgs.length

!= 2) {

System.err.println("Usage: wordcount ");

System.exit(2);

}

Job job = new

Job(conf, "word count");

job.setJarByClass(WordCount.class);

job.setMapperClass(TokenizerMapper.class);

job.setCombinerClass(IntSumReducer.class);

job.setReducerClass(IntSumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

FileInputFormat.addInputPath(job, new

Path(otherArgs[0]));

FileOutputFormat.setOutputPath(job, new

Path(otherArgs[1]));

System.exit(job.waitForCompletion(true) ? 0 :

1);

}

}

Map过程需要继承org.apache.hadoop.mapreduce包中Mapper类,并重写其map方法。通过在map方法中添加两句把key值和value值输出到控制台的代码,可以发现map方法中value值存储的是文本文件中的一行(以回车符为行结束标记),而key值为该行的首字母相对于文本文件的首地址的偏移量。然后StringTokenizer类将每一行拆分成为一个个的单词,并将作为map方法的结果输出,其余的工作都交有MapReduce框架处理。

Reduce过程需要继承org.apache.hadoop.mapreduce包中Reducer类,并重写其reduce方法。Map过程输出中key为单个单词,而values是对应单词的计数值所组成的列表,Map的输出就是Reduce的输入,所以reduce方法只要遍历values并求和,即可得到某个单词的总次数。

在MapReduce中,由Job对象负责管理和运行一个计算任务,并通过Job的一些方法对任务的参数进行相关的设置。此处设置了使用TokenizerMapper完成Map过程中的处理和使用IntSumReducer完成Combine和Reduce过程中的处理。还设置了Map过程和Reduce过程的输出类型:key的类型为Text,value的类型为IntWritable。任务的输出和输入路径则由命令行参数指定,并由FileInputFormat和FileOutputFormat分别设定。完成相应任务的参数设定后,即可调用job.waitForCompletion()方法执行任务。

Hadoop提供了如下内容的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。

BooleanWritable:标准布尔型数值

ByteWritable:单字节数值

DoubleWritable:双字节数

FloatWritable:浮点数

IntWritable:整型数

LongWritable:长整型数

Text:使用UTF8格式存储的文本

NullWritable:当中的key或value为空时使用

java mapreduce_通过简单的Word Count讲解MapReduce原理以及Java实现相关推荐

  1. 通过简单的Word Count讲解MapReduce原理以及Java实现

    MapReduce原理: MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果 ...

  2. java声明变量简单程序_零基础学编程之java变量

    01使用变量的意义 变量相当于自然语言中的代词,代词具有代替.指示作用,比如每个人的姓名,代表的就是真实的一个个体.如果没有名字,我们在交流的时候,讨论某一个人就需要说:身高1米75,单眼皮,双下巴的 ...

  3. java 实现气泡 源码分析_冒泡排序算法原理及JAVA实现代码

    冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底. 算法本质:(最大值是关键点,肯定放到最后了,如此循环)每次都从第一位向后滚动比较,使最大值沉底, ...

  4. java开发一个简单的通讯录

    java开发一个简单的通讯录 ArrayList的综合应用 import java.util.*; public class ContactNote{static Scanner sc=new Sca ...

  5. java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫

    Java实现一个简单的爬虫程序. package SearchCrawler;import java.util.*;import java.net.*;import java.io.*;import ...

  6. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  7. Java设计模式之简单工厂模式实验(软件工程综合实践课程第二周)

    实验目的 1 .理解软件设计的相关理论 : 2 .理解面向对象设计原则: 实验内容 1 .简单工厂模式实验: (1) 参考讲义上的代码,利用简单工厂模式完成计算器应用程序: (2) 画出计算器程序简单 ...

  8. RSA加密算法原理及其Java实现

    RSA加密算法原理及其Java实现 RSA加密算法的基本原理 主要步骤 解密过程证明 java实现 简单介绍了RSA加密算法的原理及其Java实现:原文过长时,进行了分段加密. RSA加密算法的基本原 ...

  9. java多个mapreduce_一个简单的MapReduce示例(多个MapReduce任务处理)

    一.需求 有一个列表,只有两列:id.pro,记录了id与pro的对应关系,但是在同一个id下,pro有可能是重复的. 现在需要写一个程序,统计一下每个id下有多少个不重复的pro. 为了写一个完整的 ...

最新文章

  1. vue-router使用next()跳转到指定路径时会无限循环
  2. lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!
  3. 对数据库进行先查询后插入的解决方案
  4. nodejs生成UID(唯一标识符)——node-uuid模块
  5. 项目方说性能达到百万TPS,如何测试它的可信度?
  6. 关于分布式系统的数据一致性问题(二)
  7. 话里话外:明白比智慧更重要
  8. web项目接入指纹识别+识别过程信息推送
  9. 【全套资料.zip下载】数电课设-色子骰子模拟电路Multisim仿真设计【Multisim仿真+报告+讲解视频.zip下载】
  10. win10计算机到桌面显示器,win10电脑外接显示器设置
  11. mac系统下修改usr/bin文件夹权限问题
  12. 计算机视觉最新研究方向,计算机视觉的主要研究的内容是什么?,计算机视觉研究方向...
  13. 巾帼绽芬芳 一起向未来(中篇)
  14. NoC(Network on Chip)基础 (4):Non-Blocking(Circuit Switch)Network——Crossbar 和 Clos
  15. 在谷歌上安装倍速播放的插件video-speed-controller
  16. ScrollView的滑动监听(以HorizontalScrollView为例)
  17. python求平均数保留两位小数_python求平均数、方差、中位数的例子
  18. Android连接多个usb,Android实现USB连接
  19. windows无法格式化u盘怎么办_U盘格式化失败怎么办 U盘格式化失败原因【详解】...
  20. 手把手玩转KVM虚拟化--KVM网络管理

热门文章

  1. 逆向project实战--Afkayas.1
  2. Okhttp 向服务器发送请求(请求头,表单,post json数据)...
  3. Save our Scrum作者访谈
  4. Python处理JSON
  5. oracle数据库关联查询
  6. 2019-2-15 日记
  7. 操作系统(4)存储器管理
  8. clipboard.js在弹出框中无法复制的问题
  9. Linux 驱动面试题总结【转】
  10. C#数字日期转成中文日期