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. Oracle数据库对象题库

    一.    填空题 在用 create 语句创建基本表时,最初只是一个空的框架,用户可以使用insert命令把数据插入表中. 在基本表不需要时,可以使用 drop table 语句撤消.在一个基本表撤 ...

  2. Mysql复制之路由

    在主从复制读写分离的思路下,要想使所有写都到MasterServer,所有读都路由到Slave Server;就需要使用一些路由策略. 可以使用MysqlProxy[Mysql代理],据说MysqlP ...

  3. NYOJ题目114某种序列

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAscAAAHuCAIAAAD83zYaAAAgAElEQVR4nO3dP1LjygIv4LcJ5yyE2A

  4. .net学习笔记---xml序列化

    XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是 ...

  5. TCP 四次握手

    TCP协议中的三次握手和四次挥手(图解) http://blog.csdn.net/whuslei/article/details/6667471/

  6. golang 索引

    入门的基础路线 a Tour of GoEffective GoGo By Example 以上的三部分通读算是入门. 4个重要的组成部分 1. 基础知识2. 并发特性3. 异常处理4. 常用开源项目 ...

  7. Oracle Segments可以跨多个data files吗?

    首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件.日志文件和控制文件.数据库的文件为数据库信息提供真正的物理存储.每一 ...

  8. WPF 实现带标题的TextBox

    这篇博客将分享在WPF中如何创建一个带Title的TextBox.首先请看一下最终的效果, 实现思路:使用TextBlock+TextBox来实现,TextBlock用来显示Title. 实现代码, ...

  9. SPI-软件开发注意事项

    01 PD ,设置数据库前一定把模板设置号,命名规则规划清楚.

  10. 共享内存同行,王明学learn

    共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...