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

2
3
1
89
34
21
67
35

  file2

  

38
29
1
23
49
16

  运行信息

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

  结果

  

1    1
2    1
3    2
4    3
5    16
6    21
7    23
8    29
9    34
10    35
11    38
12    49
13    67
14    89
时间: 2024-10-08 20:14:52

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

排序算法之简单排序(冒泡、选择、插入)

1.基本概念 内部排序和外部排序 根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类: 内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程: 外部排序:指的是排序中要对外存储器进行访问的排序过程. 内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序.交换排序.选择排序.归并排序:根据排序过程的时间复杂度来分,可以分为简单排序.先进排序.冒泡排序.简单选择排序.直接插入排序就是简单排序算法. 评价排序算法优劣的标准主要是两条:一是算法的运

大数据技术之_05_Hadoop学习_04_MapReduce_Hadoop企业优化(重中之重)+HDFS小文件优化方法+MapReduce扩展案例+倒排索引案例(多job串联)+TopN案例+找博客共同粉丝案例+常见错误及解决方案

第6章 Hadoop企业优化(重中之重)6.1 MapReduce 跑的慢的原因6.2 MapReduce优化方法6.2.1 数据输入6.2.2 Map阶段6.2.3 Reduce阶段6.2.4 I/O传输6.2.5 数据倾斜问题6.2.6 常用的调优参数6.3 HDFS小文件优化方法6.3.1 HDFS小文件弊端6.3.2 HDFS小文件解决方案第7章 MapReduce扩展案例7.1 倒排索引案例(多job串联)7.2 TopN案例7.3 找博客共同粉丝案例第8章 常见错误及解决方案 第6章

简单排序

冒泡排序 选择排序 插入排序 时间复杂度 O(n^2) 冒泡排序è基本不用  过于简单比较次数(见下) 与 交换次数(平均为比较次数的一半) 均正比于N^2 选择排序è快于冒泡 交换时间级别大于比较时间级别选择该排序 比较次数(见下) 正比于N^2 交换次数N 插入排序 VS表插入排序 效率比较 插入排序>(略快于)选择排序>冒泡排序 插入排序 表插入排序 原理 简单排序之一 利用有序链表插入效率的比较为O(N)的特点 比较次数MAX (N^2-N)/2 N 比较次数AVG (N^2-N)/4

JavaScript 实现页面元素(ul-li)的简单排序

JavaScript 实现页面元素(ul-li)的简单排序 html页面: <input type="button" value="show" onclick="show()" /> <ul id="ul1"> <li>4</li> <li>3</li> <li>2</li> <li>1</li> </

排序算法之简单排序算法

一.前言 其实排序对于前端工程师来说没有后端那么重要,不过理解排序的原理还是比较有用的.例如有些应用数据比较少量的就不需要用后台来排序,如果用php后端脚本等排序会增加后台的开销.放在前端岂不是更好,当然我们有一个前端的排序神器sort.当然也做了很多得优化,不过用sort排序还需要注意一点,sort默认不传参数时候的排序是按照字母顺序对数组中的元素进行排序,其实就是按照字符编码的顺序进行排序.        今天主要复习一下简单得排序,分别为冒泡排序.插入排序.选择排序,冒泡目前是我认为最简单

Session小案例-----简单购物车的使用

Session小案例-----简单购物车的使用 同上篇一样,这里的处理请求和页面显示同样用的都是servlet. 功能实现如下: 1,显示网站的所有商品 2,用户点击购买后,能够记住用户选择的商品 3,实现了多个会话共享一个session 4, 实现了浏览器禁用cookie后数据共享问题的处理 首页: package cn.itcast.shopping; import java.io.IOException; import java.io.PrintWriter; import java.io

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

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

UVA - 10905 - Children&#39;s Game (简单排序)

UVA - 10905 Children's Game Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description 4thIIUCInter-University Programming Contest, 2005 A Children's Game Input: standard input Output: standard output Problems

简单排序poj2388

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h> using namespace std;int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int main(){ int n; int a[10001]; while(scanf("%d",&n)!=