重新認識mapreduce

来源:http://www.cnblogs.com/rilweic/archive/2016/11/18/6078583.html
-Advertisement-
Play Games

寫這篇文章,是因為最近遇到了mapreduce的二次排序問題。以前的理解不完全正確。首先看一下mapreduce的過程 相信這張圖熟悉MR的人都應該見過,再來一張圖 wordcount也不細說了,hadoop裡面的hello,world 之前我的理解是map過來的<k,v>會形成(k,<v1,v2, ...


 

寫這篇文章,是因為最近遇到了mapreduce的二次排序問題。以前的理解不完全正確。首先看一下mapreduce的過程

相信這張圖熟悉MR的人都應該見過,再來一張圖

wordcount也不細說了,hadoop裡面的hello,world

之前我的理解是map過來的<k,v>會形成(k,<v1,v2,v3...>)的格式,並且按照這種思路寫出來不少的mapreduce程式,而且沒有錯。

後來自定義Writable對象,封裝一組值作為key,也沒有什麼問題,而且一直認為key只要在compareTo中重寫 了方法就萬事大吉,而且compareTo返回0的會作為相同的key。誤區就在這裡,之前一直認為key相同的value會合併到一個"list"中-。這句話就有錯,key是key,value是value,根本不會將key對應的value合併在一起,真實情況是預設將key相同(compareTo返回0的)的合併成了一組,在組相同的裡面去foreach裡面的value,如果是自定義key的話你可以將key列印一下,或發現key並不相同。

上代碼:

public class Entry implements WritableComparable<Entry> {
    private String yearMonth;
    private int count;

    public Entry() {
    }

    @Override
    public int compareTo(Entry entry) {
        int result = this.yearMonth.compareTo(entry.getYearMonth());
        if (result == 0) {
            result = Integer.compare(count, entry.getCount());
        }
        return result;
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeUTF(yearMonth);
        dataOutput.writeInt(count);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        this.yearMonth = dataInput.readUTF();
        this.count = dataInput.readInt();
    }

    public String getYearMonth() {
        return yearMonth;
    }

    public void setYearMonth(String yearMonth) {
        this.yearMonth = yearMonth;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    

    
    @Override
    public String toString() {
        return yearMonth;
    }
}

自定義分區 EntryPartitioner.java

public class EntryPartitioner extends Partitioner<Entry, Text> {

    @Override
    public int getPartition(Entry entry, Text paramVALUE, int numberPartitions) {
        return Math.abs((entry.getYearMonth().hashCode() % numberPartitions));
    }
}

 

自定義分組 

 

public class EntryGroupingComparator extends WritableComparator {
    public EntryGroupingComparator() {
        super(Entry.class, true);
    }

    @Override
    public int compare(WritableComparable a, WritableComparable b) {
        Entry a1 = (Entry) a;
        Entry b1 = (Entry) b;
        return a1.getYearMonth().compareTo(b1.getYearMonth());
    }
}

 

mapper類

public class SecondarySortMapper extends
        Mapper<LongWritable, Text, Entry, Text> {

    private Entry entry = new Entry();
    private Text value = new Text();

    @Override
    protected void map(LongWritable key, Text lines, Context context)
            throws IOException, InterruptedException {
        String line = lines.toString();
        String[] tokens = line.split(",");
        String yearMonth = tokens[0] + "-" + tokens[1];
        int count = Integer.parseInt(tokens[2]);
        
        entry.setYearMonth(yearMonth);
        entry.setCount(count);
        value.set(tokens[2]);
        context.write(entry, value);
        
    }
}

reducer類

 

public class SecondarySortReducer extends Reducer<Entry, Text, Entry, Text> {
    @Override
    protected void reduce(Entry key, Iterable<Text> values, Context context)
            throws IOException, InterruptedException {
        System.out.println("-----------------華麗的分割線-----------------");
        StringBuilder builder = new StringBuilder();
        for (Text value : values) {
            System.out.println(key+"==>"+value);
            builder.append(value.toString());
            builder.append(",");
        }
        context.write(key, new Text(builder.toString()));
    }
}

 

 

reducer中列印出來的跟原來想的不一樣,一組的值除了自定義分組的屬性相同外,其他的屬性有不同的。看來以前是自己理解不夠深入啊,特此寫出,以示警戒

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提交AppStore時候被拒絕 拒絕原因:Your app declares support for audio in the UIBackgroundModes key in your Info.plist, but we were unable to play any audible conte ...
  • 在iOS開發過程中經常需要與伺服器進行數據通訊,JSON就是一種常用的高效簡潔的數據格式。 問題: 在項目中,一直遇到一個坑的問題,程式在獲取某些數據之後莫名崩潰。原因是:由於伺服器的資料庫中有些欄位為空,然後以JSON形式返回給客戶端時就會出現這樣的數據:repairs = "<null>" 這個 ...
  • HTML5頁面的圖片上傳功能在iOS端的實現。 首先,頁面上用的是plupload組件,在wkwebview上存在兩個坑需要修複才能正常使用。 問題:在webview上點擊選擇照片/相機拍攝,就會出現whose view is not in the window hierarchy這個錯誤。其實st ...
  • //按鈕出現時的動畫效果 + (void)buttonAnimation:(UIButton *)sender { CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; CA ...
  • Base項目是在Xcode7上創建的,升級Xcode8以後,編譯時候提示錯誤: The file “base.app” couldn’t be opened because you don’t have permission to view it. 應該是由於Build Settings->Buil ...
  • AysncTask相信大家都不陌生,它是為了簡化非同步請求、更新UI操作而誕生的。使用它不僅可以完成我們的網路耗時操作,而且還可以在完成耗時操作後直接的更新我們所需要的UI組件。這使得它在android開發中成為炙手可熱的網路請求工具類。 ...
  • 使用rpm包安裝xtrabackup 為備份操作創建MySQL賬戶。 ## xtrabackup備份創建備份用戶CREATE USER 'backuper'@'localhost' IDENTIFIED BY 'backup@123';GRANT SELECT, RELOAD, PROCESS, S ...
  • 因近期需要進行sqlserver數據到mysql之間的數據同步。偶然之間發現了這一款工具ELK 一、下載 1、Kettle可以在http://kettle.pentaho.org/網站下載 2、下載的文件是一個壓縮包隨便放在win下都可以解壓後文件如下 二、啟動註意事項 1、由於工具需要安裝java ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...