MapReduce应用案例--简单排序
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应用案例--简单排序的更多相关文章
- MapReduce应用案例--简单的数据去重
1. 设计思路 去重,重点就是无论某个数据在文件中出现多少次,最后只是输出一次就可以. 根据这一点,我们联想到在reduce阶段数据输入形式是 <key, value list>,只要是k ...
- 批处理引擎MapReduce应用案例
批处理引擎MapReduce应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MapReduce能够解决的问题有一个共同特点:任务可以被分解为多个子问题,且这些子问题相对独立 ...
- Java数据结构和算法之数组与简单排序
一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信 ...
- 简单排序算法 C++类实现
简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...
- iOS简单排序--字母排序、NSDictionary排序
// 数组用系统方法compare做字母的简单排序 NSArray *oldArray = @[@"bac",@"bzd",@"azc",@ ...
- 简单排序算法设计(Java)
总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...
- Java数据结构和算法 - 简单排序
Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...
- 《Algorithms算法》笔记:元素排序(1)——简单排序
<Algorithms算法>元素排序(1)——简单排序 Algorithms算法元素排序1简单排序 排序问题 1 回调函数 2Java中回调函数的路线图 3 全序 4 Comparable ...
- MapReduce 使用案例
MapReduce 使用案例 MapReduce在面试过程中出现的频率还是挺高的,尤其是数据挖掘等岗位.通常面试官会出一个大数据题目,需要被试者根据题目设计基于MapReduce的算法来解答.我在一个 ...
随机推荐
- eclipse maven tomcat7 热部署
.配置tomcat a.配置jdk b.CATALINA_HOME=c:\tomcat CATALINA_BASE=c:\tomcat .tomcat配置密码 C:\Program Files\oth ...
- 检查Android系统版本
<script type="text/javascript"> $(function(){ var userAgent = navigator.userAgent; v ...
- python基础——类和实例
python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...
- Mysql之复制服务
Replication[复制]使得数据可以从一个Master服务器上复制到一个或多个Slave上,默认是异步复制,不需要与Master建立永久连接:基于配置,可以作用于所有库,指定的库或库中的某些表. ...
- android setCompoundDrawables 不显示问题
在 vh.tvAddr.setCompoundDrawables(getResources().getDrawable(R.drawable.ic_real_state_loc), null, nul ...
- Swift - 2.3的代码到3.0的转变
分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift ...
- highcharts的简单使用
在使用过的图表js插件中,个人认为还是highcharts最好,无论从兼容性,渲染速度,甚至是文档详细上来说,都一直觉得highcharts更胜一筹.现在花点时间做一下简单的总结,比如从一个矩形图开始 ...
- windows重新获取IP
win+r------->cmd------>ipconfig /release (释放ip) ipconfig /renew 重新获取ip
- 与你相遇好幸运,The Moe Node.js Code Style Guide
The Moe Node.js Code Style Guide By 一个最萌的开发者 @2016.9.21 >>代码是人来阅读的,格式规范的代码是对编程人员最好的礼物 :) > ...
- C#关键字params
using System; using System.Threading; namespace Test { /// <summary> /// params用法: 1.用来修饰方法的参数 ...