• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            hadoop二次排序 (Map/Reduce中分區和分組的問題)

            Posted on 2013-03-25 19:38 鑫龍 閱讀(2277) 評論(0)  編輯 收藏 引用 所屬分類: Hadoop

            1.二次排序概念:

            首先按照第一字段排序,然后再對第一字段相同的行按照第二字段排序,注意不能破壞第一次排序的結果 。

            如: 輸入文件:

            20 21 
            50 51 
            50 52 
            50 53 
            50 54 
            60 51 
            60 53 
            60 52 
            60 56 
            60 57 
            70 58 
            60 61 
            70 54 
            70 55 
            70 56 
            70 57 
            70 58 
            1 2 
            3 4 
            5 6 
            7 82 
            203 21 
            50 512 
            50 522 
            50 53 
            530 54 
            40 511 
            20 53 
            20 522 
            60 56 
            60 57 
            740 58 
            63 61 
            730 54 
            71 55 
            71 56 
            73 57 
            74 58 
            12 211 
            31 42 
            50 62 
            7 8

            輸出(需要分割線):

            ------------------------------------------------ 
            1       2 
            ------------------------------------------------ 
            3       4 
            ------------------------------------------------ 
            5       6 
            ------------------------------------------------ 
            7       8 
            7       82 
            ------------------------------------------------ 
            12      211 
            ------------------------------------------------ 
            20      21 
            20      53 
            20      522 
            ------------------------------------------------ 
            31      42 
            ------------------------------------------------ 
            40      511 
            ------------------------------------------------ 
            50      51 
            50      52 
            50      53 
            50      53 
            50      54 
            50      62 
            50      512 
            50      522 
            ------------------------------------------------ 
            60      51 
            60      52 
            60      53 
            60      56 
            60      56 
            60      57 
            60      57 
            60      61 
            ------------------------------------------------ 
            63      61 
            ------------------------------------------------ 
            70      54 
            70      55 
            70      56 
            70      57 
            70      58 
            70      58 
            ------------------------------------------------ 
            71      55 
            71      56 
            ------------------------------------------------ 
            73      57 
            ------------------------------------------------ 
            74      58 
            ------------------------------------------------ 
            203     21 
            ------------------------------------------------ 
            530     54 
            ------------------------------------------------ 
            730     54 
            ------------------------------------------------ 
            740     58

            2.工作原理

            使用如下map和reduce:(特別注意輸入輸出類型, 其中IntPair為自定義類型)

            public static class Map extends Mapper<LongWritable, Text, IntPair, IntWritable> 
            public static class Reduce extends Reducer<IntPair, NullWritable, IntWritable, IntWritable>

                 在map階段,使用job.setInputFormatClass(TextInputFormat)做為輸入格式。注意輸出應該符合自定義Map中定義的輸出<IntPair, IntWritable>。最終是生成一個List<IntPair, IntWritable>。在map階段的最后,會先調用job.setPartitionerClass對這個List進行分區,每個分區映射到一個reducer。每個分區內又調用job.setSortComparatorClass設置的key比較函數類排序??梢钥吹?,這本身就是一個二次排序。如果沒有通過job.setSortComparatorClass設置key比較函數類,則使用key的實現的compareTo方法。在隨后的例子中,第一個例子中,使用了IntPair實現的compareTo方法,而在下一個例子中,專門定義了key比較函數類。

                 在reduce階段,reducer接收到所有映射到這個reducer的map輸出后,也是會調用job.setSortComparatorClass設置的key比較函數類對所有數據對排序。然后開始構造一個key對應的value迭代器。這時就要用到分組,使用jobjob.setGroupingComparatorClass設置的分組函數類。只要這個比較器比較的兩個key相同,他們就屬于同一個組,它們的value放在一個value迭代器,而這個迭代器的key使用屬于同一個組的所有key的第一個key。最后就是進入Reducer的reduce方法,reduce方法的輸入是所有的(key和它的value迭代器)。同樣注意輸入與輸出的類型必須與自定義的Reducer中聲明的一致。

            3,具體步驟

            (1)自定義key

            在mr中,所有的key是需要被比較和排序的,并且是二次,先根據partitione,再根據大小。而本例中也是要比較兩次。先按照第一字段排序,然后再對第一字段相同的按照第二字段排序。根據這一點,我們可以構造一個復合類IntPair,他有兩個字段,先利用分區對第一字段排序,再利用分區內的比較對第二字段排序。 
            所有自定義的key應該實現接口WritableComparable,因為是可序列的并且可比較的。并重載方法:

            //反序列化,從流中的二進制轉換成IntPair  
            public void readFields(DataInput in) throws IOException          
            //序列化,將IntPair轉化成使用流傳送的二進制  
            public void write(DataOutput out)  
            //key的比較  
            public int compareTo(IntPair o)          
            //另外新定義的類應該重寫的兩個方法  
            //The hashCode() method is used by the HashPartitioner (the default partitioner in MapReduce)  
            public int hashCode()   
            public boolean equals(Object right)
            (2)由于key是自定義的,所以還需要自定義一下類: 
            (2.1)分區函數類。這是key的第一次比較。 
            public static class FirstPartitioner extends Partitioner<IntPair,IntWritable>

            在job中使用setPartitionerClasss設置Partitioner。 
            (2.2)key比較函數類。這是key的第二次比較。這是一個比較器,需要繼承WritableComparator(也就是實現RawComprator接口)。

               (這個就是前面說的第二種方法,但是在第三部分的代碼中并沒有實現此函數,而是直接使用compareTo方法進行比較,所以也就不許下面一行的設置) 
            在job中使用setSortComparatorClass設置key比較函數類。

            public static class KeyComparator extends WritableComparator
            2.3)分組函數類。在reduce階段,構造一個key對應的value迭代器的時候,只要first相同就屬于同一個組,放在一個value迭代器。這是一個比較器,需要繼承WritableComparator。 
            public static class GroupingComparator extends WritableComparator
            分組函數類也必須有一個構造函數,并且重載 public int compare(WritableComparable w1, WritableComparable w2) 
            分組函數類的另一種方法是實現接口RawComparator。 
            在job中使用setGroupingComparatorClass設置分組函數類。 
            另外注意的是,如果reduce的輸入與輸出不是同一種類型,則不要定義Combiner也使用reduce,因為Combiner的輸出是reduce的輸入。除非重新定義一個Combiner。 


            轉自:http://www.cnblogs.com/dandingyy/archive/2013/03/08/2950703.html

            国产精品狼人久久久久影院| 久久亚洲国产成人精品无码区| 99久久精品免费| 丁香五月网久久综合| 久久久噜噜噜久久中文字幕色伊伊| 久久av高潮av无码av喷吹| 狠狠色丁香久久婷婷综| 久久精品国产亚洲AV香蕉| 久久精品人人做人人爽电影蜜月| 99久久无色码中文字幕人妻| 亚洲人成网站999久久久综合 | 精品久久8x国产免费观看| 亚洲精品蜜桃久久久久久| 国内精品九九久久精品| 亚洲AV无码一区东京热久久| 亚洲国产精品无码成人片久久| 亚洲AV无码久久精品蜜桃| 午夜精品久久久久久99热| 精品久久久久香蕉网| 中文字幕亚洲综合久久| 久久强奷乱码老熟女| 久久婷婷五月综合国产尤物app| 精品一二三区久久aaa片| 婷婷五月深深久久精品| 国产99久久精品一区二区| 亚洲国产精品人久久| 亚洲人成电影网站久久| 久久天堂AV综合合色蜜桃网 | 国产一区二区精品久久凹凸| 一本综合久久国产二区| 久久夜色精品国产噜噜麻豆| 久久免费线看线看| 久久久久久国产精品美女| 久久亚洲欧美日本精品| 亚洲国产日韩欧美综合久久| 久久99精品久久只有精品| 久久中文字幕视频、最近更新| 久久国产色AV免费观看| 精品久久久久久无码人妻蜜桃| 中文字幕无码免费久久| 99久久精品费精品国产|