二次排序代码

来源:互联网 发布:山寨币源码 编辑:程序博客网 时间:2024/04/30 00:48
1、输入数据:
[java] view plain copy print?
  1. [hadoop@hadoop ~]$ hdfs dfs -text /user/hadoop/secondarysort.txt  
  2. 3       5  
  3. 5       89  
  4. 7       63  
  5. 5       56  
  6. 3       9  
  7. 3       1  
  8. 7       26  
  9. 7       45  
  10. 7       4  
  11. 5       18  
  12. 5       23  
  13. 7       63  
  14. 3       24  
  15. [hadoop@hadoop ~]$  




2、代码:
[java] view plain copy print?
  1. package secondarySort;  
  2.   
  3.   
  4. import java.io.DataInput;  
  5. import java.io.DataOutput;  
  6. import java.io.IOException;  
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.fs.Path;  
  9. import org.apache.hadoop.io.IntWritable;  
  10. import org.apache.hadoop.io.LongWritable;  
  11. import org.apache.hadoop.io.Text;  
  12. import org.apache.hadoop.io.WritableComparable;  
  13. import org.apache.hadoop.io.WritableComparator;  
  14. import org.apache.hadoop.mapreduce.Job;  
  15. import org.apache.hadoop.mapreduce.Mapper;  
  16. import org.apache.hadoop.mapreduce.Partitioner;  
  17. import org.apache.hadoop.mapreduce.Reducer;  
  18. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  19. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  20. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  21. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
  22.   
  23.   
  24. public class SecondarySort_Demo {  
  25.     //自己定义的key类应该实现WritableComparable接口    
  26.     public static class IntPair implements WritableComparable<IntPair>{  
  27.           
  28.         int first;  
  29.         int second;  
  30.         public void set(int left,int right){  
  31.             first=left;  
  32.             second=right;  
  33.         }  
  34.         public int getFirst(){  
  35.             return first;  
  36.         }  
  37.         public int getSecond(){  
  38.             return second;  
  39.         }  
  40.         //序列化,将IntPair转化成使用流传送的二进制    
  41.         public void write(DataOutput out) throws IOException {  
  42.             out.writeInt(first);  
  43.             out.writeInt(second);  
  44.         }  
  45.         //反序列化,从流中的二进制转换成IntPair  
  46.         public void readFields(DataInput in) throws IOException {  
  47.             first=in.readInt();  
  48.             second=in.readInt();  
  49.         }  
  50.         //key的比较    
  51.         public int compareTo(IntPair o) {  
  52.             if(first!=o.first){  
  53.                 return first<o.first ? -1:1;  
  54.             }else if(second!=o.second){  
  55.                 return second<o.second ? -1:1;  
  56.             }else{  
  57.                 return 0;  
  58.             }  
  59.           
  60.         }  
  61.         //新定义类应该重写的两个方法    
  62.         public int hashCode(){  
  63.             return first*157+second;  
  64.         }  
  65.           
  66.         public boolean equals(Object right){  
  67.             if(right==null)  
  68.                 return false;  
  69.             if(this==right)  
  70.                 return true;  
  71.             if(right instanceof IntPair){  
  72.                 IntPair r=(IntPair) right;  
  73.                 return r.first==first&&r.second==second;  
  74.             }else {  
  75.                 return false;  
  76.             }  
  77.         }  
  78.     }  
  79.      /**  
  80.      * 分区函数类。根据first确定Partition。  
  81.      */  
  82.     public static class FirstPartitioner extends Partitioner<IntPair, IntWritable>{  
  83.         @Override  
  84.         public int getPartition(IntPair key, IntWritable value,  
  85.                 int numPartitions) {  
  86.             return Math.abs(key.getFirst()*127) % numPartitions;  
  87.         }  
  88.     }  
  89.     /**  
  90.      * 分组函数类。只要first相同就属于同一个组。  
  91.      */    
  92.     /*//第一种方法,实现接口RawComparator 
  93.     public static class GroupingCpmparator implements RawComparator<IntPair>{ 
  94.  
  95.  
  96.         public int compare(IntPair o1, IntPair o2) { 
  97.             int l=o1.getFirst(); 
  98.             int r=o2.getFirst(); 
  99.             return l == r ? 0:(l<r ? -1:1); 
  100.         } 
  101.          //一个字节一个字节的比,直到找到一个不相同的字节,然后比这个字节的大小作为两个字节流的大小比较结果。 
  102.         public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { 
  103.             return WritableComparator.compareBytes(b1, s1, Integer.SIZE/8, b2, s2, Integer.SIZE/8); 
  104.         } 
  105.     }*/  
  106.     //第二种方法,继承WritableComparator  
  107.     public static class GroupingComparator extends WritableComparator{  
  108.         protected GroupingComparator(){  
  109.             super(IntPair.class,true);  
  110.         }  
  111.           
  112.         @SuppressWarnings("rawtypes")  
  113.         //Compare two WritableComparables.   
  114.         public int compare(WritableComparable w1,WritableComparable w2){  
  115.             IntPair ip1=(IntPair) w1;  
  116.             IntPair ip2=(IntPair) w2;  
  117.             int l=ip1.getFirst();  
  118.             int r=ip2.getFirst();  
  119.             return l==r?1:(l<r?-1:1);  
  120.         }  
  121.     }  
  122.     // 自定义map   
  123.     public static class MyMap extends Mapper<LongWritable, Text, IntPair, IntWritable>{  
  124.         private final IntPair intkey=new IntPair();  
  125.         private final IntWritable intvalue=new IntWritable();  
  126.         @Override  
  127.         protected void map(LongWritable key, Text value,Context context)  
  128.                 throws IOException, InterruptedException {  
  129.             String line=value.toString();  
  130.             String[] splited=line.split("\t");  
  131.             intkey.set(Integer.parseInt(splited[0]), Integer.parseInt(splited[1]));  
  132.             intvalue.set(Integer.parseInt(splited[1]));  
  133.             context.write(intkey, intvalue);  
  134.         }  
  135.     }  
  136.     // 自定义reduce    
  137.     public static class MyReduce extends Reducer<IntPair, IntWritable, Text, IntWritable>{  
  138.         private final Text left =new Text();  
  139.     //  private static final Text SEPARATOR =new Text("========================");  
  140.         @Override  
  141.         protected void reduce(IntPair k2, Iterable<IntWritable> v2s,Context context)  
  142.                 throws IOException, InterruptedException {  
  143.     //      context.write(SEPARATOR, null);  
  144.             left.set(Integer.toString(k2.getFirst()));  
  145.             for (IntWritable val : v2s) {  
  146.                 context.write(left, val);  
  147.             }  
  148.         }  
  149.     }  
  150.       
  151.     public static void main(String[] args) throws Exception{  
  152.         Configuration conf = new Configuration();    
  153.         // 实例化一道作业    
  154.         Job job=Job.getInstance(conf, SecondarySort_Demo.class.getSimpleName());  
  155.         job.setJarByClass(SecondarySort_Demo.class);    
  156.         // Mapper类型    
  157.         job.setMapperClass(MyMap.class);    
  158.         // 不再需要Combiner类型,因为Combiner的输出类型<Text, IntWritable>对Reduce的输入类型<IntPair, IntWritable>不适用    
  159.         //job.setCombinerClass(Reduce.class);    
  160.         // Reducer类型    
  161.         job.setReducerClass(MyReduce.class);    
  162.         // 分区函数    
  163.         job.setPartitionerClass(FirstPartitioner.class);    
  164.         // 分组函数    
  165.         job.setGroupingComparatorClass(GroupingComparator.class);    
  166.             
  167.         // map 输出Key的类型    
  168.         job.setMapOutputKeyClass(IntPair.class);    
  169.         // map输出Value的类型    
  170.         job.setMapOutputValueClass(IntWritable.class);    
  171.         // rduce输出Key的类型,是Text,因为使用的OutputFormatClass是TextOutputFormat    
  172.         job.setOutputKeyClass(Text.class);    
  173.         // rduce输出Value的类型    
  174.         job.setOutputValueClass(IntWritable.class);    
  175.             
  176.         // 将输入的数据集分割成小数据块splites,同时提供一个RecordReder的实现。    
  177.         job.setInputFormatClass(TextInputFormat.class);    
  178.         // 提供一个RecordWriter的实现,负责数据输出。    
  179.         job.setOutputFormatClass(TextOutputFormat.class);    
  180.             
  181.         // 输入hdfs路径    
  182.         FileInputFormat.setInputPaths(job, args[0]);    
  183.         // 输出hdfs路径    
  184.         FileOutputFormat.setOutputPath(job, new Path(args[1]));    
  185.         // 提交job    
  186. //        System.exit(job.waitForCompletion(true) ? 0 : 1);    
  187.         job.waitForCompletion(true);   
  188.     }  
  189.       
  190. }  



3、打包执行命令:
 
[java] view plain copy print?
  1. hadoop jar secondarysort.jar /user/hadoop/secondarysort.txt /user/hadoop/output  



4、结果输出文件目录:
[java] view plain copy print?
  1. [hadoop@hadoop ~]$ hdfs dfs -ls /user/hadoop/output  
  2. Found 77 items  
  3. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/_SUCCESS  
  4. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00000  
  5. -rw-r--r--   3 hadoop supergroup         17 2015-08-30 17:22 /user/hadoop/output/part-r-00001  
  6. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00002  
  7. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00003  
  8. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00004  
  9. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00005  
  10. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00006  
  11. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00007  
  12. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00008  
  13. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00009  
  14. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00010  
  15. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00011  
  16. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00012  
  17. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00013  
  18. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00014  
  19. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00015  
  20. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00016  
  21. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00017  
  22. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00018  
  23. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00019  
  24. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00020  
  25. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00021  
  26. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00022  
  27. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00023  
  28. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00024  
  29. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00025  
  30. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00026  
  31. -rw-r--r--   3 hadoop supergroup         20 2015-08-30 17:22 /user/hadoop/output/part-r-00027  
  32. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00028  
  33. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00029  
  34. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00030  
  35. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00031  
  36. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00032  
  37. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00033  
  38. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00034  
  39. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00035  
  40. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00036  
  41. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00037  
  42. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00038  
  43. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00039  
  44. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00040  
  45. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00041  
  46. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00042  
  47. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00043  
  48. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00044  
  49. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00045  
  50. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00046  
  51. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00047  
  52. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00048  
  53. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00049  
  54. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00050  
  55. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00051  
  56. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00052  
  57. -rw-r--r--   3 hadoop supergroup         24 2015-08-30 17:22 /user/hadoop/output/part-r-00053  
  58. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00054  
  59. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00055  
  60. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00056  
  61. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00057  
  62. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00058  
  63. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00059  
  64. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00060  
  65. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00061  
  66. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00062  
  67. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00063  
  68. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00064  
  69. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00065  
  70. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00066  
  71. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00067  
  72. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00068  
  73. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00069  
  74. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00070  
  75. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00071  
  76. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00072  
  77. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00073  
  78. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00074  
  79. -rw-r--r--   3 hadoop supergroup          0 2015-08-30 17:22 /user/hadoop/output/part-r-00075  



5、排序完数据:

[java] view plain copy print?
  1. [hadoop@hadoop ~]$ hdfs dfs -text /user/hadoop/output/part-r-00001  
  2. 3       1  
  3. 3       5  
  4. 3       9  
  5. 3       24  
  6. [hadoop@hadoop ~]$ hdfs dfs -text /user/hadoop/output/part-r-00027  
  7. 5       18  
  8. 5       23  
  9. 5       56  
  10. 5       89  
  11. [hadoop@hadoop ~]$ hdfs dfs -text /user/hadoop/output/part-r-00053  
  12. 7       4  
  13. 7       26  
  14. 7       45  
  15. 7       63  
  16. 7       63  
  17. [hadoop@hadoop ~]$ 
0 0
原创粉丝点击