1. 设计思路

  在MapReduce过程中自带有排序,可以使用这个默认的排序达到我们的目的。 MapReduce 是按照key值进行排序的,我们在Map过程中将读入的数据转化成IntWritable类型,然后作为Map的key值输出。 Reduce 阶段拿到的就是按照key值排序好的<key,value list>,将key值输出,并根据value list 中元素的个数决定key的输出次数。

2. 实现

  2.1 程序代码

  

package sort;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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; public class SimpleSort {
public static class Map extends
Mapper<LongWritable, Text, IntWritable, IntWritable> {
private IntWritable data; protected void map(LongWritable key, Text value, Context context)
throws java.io.IOException, InterruptedException {
data = new IntWritable();
String line = value.toString();
data.set(Integer.parseInt(line));
context.write(data, new IntWritable(1));
};
} public static class Reduce extends
Reducer<IntWritable, IntWritable, IntWritable, IntWritable> { private static IntWritable num = new IntWritable(1);
protected void reduce(IntWritable key,
java.lang.Iterable<IntWritable> values, Context output)
throws java.io.IOException, InterruptedException {
for ( IntWritable val : values){
output.write(num, key);
num = new IntWritable(num.get() + 1);
}
};
} public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = new Job(conf,"simple sort"); job.setJarByClass(SimpleSort.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/user/hadoop_admin/sortin"));
FileOutputFormat.setOutputPath(job, new Path("/user/hadoop_admin/sortout")); System.exit((job.waitForCompletion(true) ? 0 : 1));
} }

  2.2 测试结果

  测试用例

  file1


  file2

  


  运行信息

// :: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
// :: WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
****hdfs://master:9000/user/hadoop_admin/sortin
// :: INFO input.FileInputFormat: Total input paths to process :
// :: WARN snappy.LoadSnappy: Snappy native library not loaded
// :: INFO mapred.JobClient: Running job: job_local_0001
// :: INFO mapred.Task: Using ResourceCalculatorPlugin : null
// :: INFO mapred.MapTask: io.sort.mb =
// :: INFO mapred.MapTask: data buffer = /
// :: INFO mapred.MapTask: record buffer = /
// :: INFO mapred.MapTask: Starting flush of map output
// :: INFO mapred.MapTask: Finished spill
// :: INFO mapred.Task: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
// :: INFO mapred.JobClient: map % reduce %
// :: INFO mapred.LocalJobRunner:
// :: INFO mapred.Task: Task 'attempt_local_0001_m_000000_0' done.
// :: INFO mapred.Task: Using ResourceCalculatorPlugin : null
// :: INFO mapred.MapTask: io.sort.mb =
// :: INFO mapred.MapTask: data buffer = /
// :: INFO mapred.MapTask: record buffer = /
// :: INFO mapred.MapTask: Starting flush of map output
// :: INFO mapred.MapTask: Finished spill
// :: INFO mapred.Task: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
// :: INFO mapred.JobClient: map % reduce %
// :: INFO mapred.LocalJobRunner:
// :: INFO mapred.Task: Task 'attempt_local_0001_m_000001_0' done.
// :: INFO mapred.Task: Using ResourceCalculatorPlugin : null
// :: INFO mapred.LocalJobRunner:
// :: INFO mapred.Merger: Merging sorted segments
// :: INFO mapred.Merger: Down to the last merge-pass, with segments left of total size: bytes
// :: INFO mapred.LocalJobRunner:
// :: INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
// :: INFO mapred.LocalJobRunner:
// :: INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
// :: INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to /user/hadoop_admin/sortout
// :: INFO mapred.LocalJobRunner: reduce > reduce
// :: INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
// :: INFO mapred.JobClient: map % reduce %
// :: INFO mapred.JobClient: Job complete: job_local_0001
// :: INFO mapred.JobClient: Counters:
// :: INFO mapred.JobClient: File Output Format Counters
// :: INFO mapred.JobClient: Bytes Written=
// :: INFO mapred.JobClient: FileSystemCounters
// :: INFO mapred.JobClient: FILE_BYTES_READ=
// :: INFO mapred.JobClient: HDFS_BYTES_READ=
// :: INFO mapred.JobClient: FILE_BYTES_WRITTEN=
// :: INFO mapred.JobClient: HDFS_BYTES_WRITTEN=
// :: INFO mapred.JobClient: File Input Format Counters
// :: INFO mapred.JobClient: Bytes Read=
// :: INFO mapred.JobClient: Map-Reduce Framework
// :: INFO mapred.JobClient: Reduce input groups=
// :: INFO mapred.JobClient: Map output materialized bytes=
// :: INFO mapred.JobClient: Combine output records=
// :: INFO mapred.JobClient: Map input records=
// :: INFO mapred.JobClient: Reduce shuffle bytes=
// :: INFO mapred.JobClient: Reduce output records=
// :: INFO mapred.JobClient: Spilled Records=
// :: INFO mapred.JobClient: Map output bytes=
// :: INFO mapred.JobClient: Total committed heap usage (bytes)=
// :: INFO mapred.JobClient: Combine input records=
// :: INFO mapred.JobClient: Map output records=
// :: INFO mapred.JobClient: SPLIT_RAW_BYTES=
// :: INFO mapred.JobClient: Reduce input records=

  结果

  


MapReduce应用案例--简单排序的更多相关文章

  1. MapReduce应用案例--简单的数据去重

    1. 设计思路 去重,重点就是无论某个数据在文件中出现多少次,最后只是输出一次就可以. 根据这一点,我们联想到在reduce阶段数据输入形式是 <key, value list>,只要是k ...

  2. 批处理引擎MapReduce应用案例

    批处理引擎MapReduce应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce能够解决的问题有一个共同特点:任务可以被分解为多个子问题,且这些子问题相对独立 ...

  3. Java数据结构和算法之数组与简单排序

    一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信 ...

  4. 简单排序算法 C++类实现

    简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...

  5. iOS简单排序--字母排序、NSDictionary排序

    // 数组用系统方法compare做字母的简单排序 NSArray *oldArray = @[@"bac",@"bzd",@"azc",@ ...

  6. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...

  7. Java数据结构和算法 - 简单排序

    Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...

  8. 《Algorithms算法》笔记:元素排序(1)——简单排序

    <Algorithms算法>元素排序(1)——简单排序 Algorithms算法元素排序1简单排序 排序问题 1 回调函数 2Java中回调函数的路线图 3 全序 4 Comparable ...

  9. MapReduce 使用案例

    MapReduce 使用案例 MapReduce在面试过程中出现的频率还是挺高的,尤其是数据挖掘等岗位.通常面试官会出一个大数据题目,需要被试者根据题目设计基于MapReduce的算法来解答.我在一个 ...

随机推荐

  1. xmpp笔记2(客户端到服务器的例子)--xml

    xmpp( 客户端到服务器的例子 ) 1 步:客户端初始流给服务器: <stream:stream xmlns='jabber:client' xmlns:stream='http://ethe ...

  2. 对于类的双重调用的demo

    代码如下: package cao.com.duixiang; public class TestCCircle { public static void main(String[] args) { ...

  3. NYOJ题目813对决

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAALRCAIAAAAiJ3lxAAAgAElEQVR4nO3dPW7jSgMu6LsJ516IYy

  4. NMON中的各项参数指标

    一.NMON中的各项参数指标: SYS_SUMM:显示当前服务器的总体性能情况 Total System I/OStatistics:Avg tps during an interval:显示采集间隔 ...

  5. mysql 关于列的语句

    查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除 ...

  6. sql server 时间小汇

    SQL server DATE函数 (1)getdate   返回当前系统的日期和时间,精确到3毫秒 要求:获得系统的当前时间 语句:SELECT getdate() 执行结果: 注:getutcda ...

  7. 当ListView有Header时,onItemClick里的position不正确

    原文:http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview ...

  8. EasyUi – 2.布局Layout + 3.登录界面

    1.页面布局 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.a ...

  9. react.js 多个组件集成示例

    这个看得有点懵, 可能要结合其它实例看. html <!DOCTYPE html> <html> <head> <script src="http: ...

  10. Oracle ASM

    一 Oracle ASM簡介 Oracle 10g推出的管理磁盤的新方式,用於取代LVM技術.主要用于RAC環境 二 Oracle ASM的配置安裝 1.安裝asm包 RedHat Linux5.x ...