Hadoop源碼分析之產生InputSplit文件過程

来源:http://www.cnblogs.com/liangjf/archive/2017/10/15/7670651.html
-Advertisement-
Play Games

用戶提交 MapReduce 作業後,JobClient 會調用 InputFormat 的 getSplit方法 生成 InputSplit 的信息。 一個 MapReduce 任務可以有多個 Split,其用於分割用戶的數據源,根據用戶設定的切割大小把數據源切割成 InputSplit元數據和 ...


    用戶提交 MapReduce 作業後,JobClient 會調用 InputFormat 的 getSplit方法 生成 InputSplit 的信息。     一個 MapReduce 任務可以有多個 Split,其用於分割用戶的數據源,根據用戶設定的切割大小把數據源切割成 InputSplit元數據和 InputSplit原始數據。 元數據的作用:被JobTracker使用,生成Task的本地行的數據結構。 原始數據的作用:被Map Task初始化時使用,用來獲取要處理的數據。 以下開始對  class JobSplit 類進行分析: 一開始就載入meta的頭信息,主要用於構成Task列表的HEAD信息
static {
    try {
      META_SPLIT_FILE_HEADER = "META-SPL".getBytes("UTF-8");
    } catch (UnsupportedEncodingException u) {
      throw new RuntimeException(u);
    }
  }
  2、New一個用於保存InputSplit元信息的數據結構
public static final TaskSplitMetaInfo EMPTY_TASK_SPLIT = new TaskSplitMetaInfo();
  JobSplit 封裝了讀寫InputSplit相關的基礎類。 1、SplitMetaInfo  首先,對於一個Job任務來說,會有一個 job.split 文件保存所有被Split後的InputSplit 的 SplitMetaInfo 屬性: 
private long startOffset:該InputSplit在job.split文件中的偏移量
private long inputDataLength:該 InputSplit 的長度
private String[] locations:該 InputSplit 所在的host 列表
從這三個屬性可以使TaskTracker知道從哪裡讀取對應的元數據並得到真正的原始數據來處理。        在 SplitMetaInfo 類中,兩個比較重要的函數是 readFields(反序列化) 和 write(序列化) 。如下:
public void readFields(DataInput in) throws IOException {
      int len = WritableUtils.readVInt(in);
      locations = new String[len];
      for (int i = 0; i < locations.length; i++) {
        locations[i] = Text.readString(in);
      }
      startOffset = WritableUtils.readVLong(in);
      inputDataLength = WritableUtils.readVLong(in);
    }  
public void write(DataOutput out) throws IOException {
      WritableUtils.writeVInt(out, locations.length);
      for (int i = 0; i < locations.length; i++) {
        Text.writeString(out, locations[i]);
      }
      WritableUtils.writeVLong(out, startOffset);
      WritableUtils.writeVLong(out, inputDataLength);
    }
    在分析這兩個函數之前,先簡單複習序列化和反序列化的定義:   把對象轉換為位元組序列的過程稱為對象的序列化;   把位元組序列恢復為對象的過程稱為對象的反序列化。     對象的序列化主要有兩種用途:1)把對象的位元組序列永久地存儲在硬碟上,一般是文件。2)在網路上傳送對象的位元組序列。   接著通過查看源碼,很容易會發現 public static class SplitMetaInfo implements Writable  繼承了 Writable 介面,並且進入Writable 類查看得知,只要重寫 Writable  就能我們自己自定義 Split 出 InputSplit的格式。
public interface Writable {
  /**
   * Serialize the fields of this object to <code>out</code>.
   *
   * @param out <code>DataOuput</code> to serialize this object into.
   * @throws IOException
   */
  void write(DataOutput out) throws IOException;
  /**
   * Deserialize the fields of this object from <code>in</code>.  
   *
   * <p>For efficiency, implementations should attempt to re-use storage in the
   * existing object where possible.</p>
   *
   * @param in <code>DataInput</code> to deseriablize this object from.
   * @throws IOException
   */
  void readFields(DataInput in) throws IOException;
  下麵再來看看 WritableUtils (可寫的工具類)這個類。 由圖可以知道,這個類主要是一些IO輸入輸出處理的函數,有興趣的童鞋請自行查看,在此略過了。總的來說,這兩個函數主要是用於把數據序列化存儲為文件永久保存在硬碟和讀入數據時先把文件里的位元組格式的數據先轉換成對象格式。   2、TaskSplitMetaInfo     用於保存InputSplit元數據的數據結構。     其包括三個屬性:
private TaskSplitIndex splitIndex:Split元信息在 jib.split 文件中的位置
private long inputDataLength:InputSplit的數據長度
private String[] locations:InputSplit所在的host列表
    這三個信息是在作業初始化時,JobTracker從文件 job. splitmetainfo 文件獲得的。其中,host列表信息是任務調度判斷任務是否在本地的最重要因素。為什麼需要這個?一切是為了提高效率,節省集群的資源開銷。因為在集群中,為了容災容錯,數據一般是有多份備份的,每次TaskTracker要獲取數據處理時,為了提高工作效率,都是儘可能的從本地獲取數據,如果本地沒有想要的數據備份時才會從本地機架的不同節點獲取,再或者從不同機架的節點獲取數據。   3、TaskSplitIndex     用於在JobTracker向TaskTracker分配新任務時, 指定新任務待處理數據位置信息在文件 jib.split中的索引。     其包括兩個屬性:
private String splitLocation:job.split文件的位置
private long startOffset:InputSplit在 job.split 文件中的位置
public void readFields(DataInput in) throws IOException {
      splitLocation = Text.readString(in);
      startOffset = WritableUtils.readVLong(in);
}
public void write(DataOutput out) throws IOException {
      Text.writeString(out, splitLocation);
      WritableUtils.writeVLong(out, startOffset);
}
  最後,JobSplit 包含的三個與Split相關的基礎類,規定瞭如何Split出元數據和原始數據,並且構造了一個Task Split的存儲列表供TaskTracker查詢,因此知道從哪裡得到數據來處理。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近排自己學習了一款軟體finereport開發報表模塊,自己總結瞭如何瞭解需求,分析需求,再進行實踐應用開發,最後進行測試數據的準確性,部署報表到項目對應的模塊中顯示。 一、需求(根據需求文檔分析) 1.條件塊: 2.數據塊(一部分): 3.數據取值: 數據源全部來自EAS。通過“物料收發事物彙總” ...
  • 存儲在資料庫中的所有數據值均正確的狀態。如果資料庫中存儲有不正確的數據值,則該資料庫稱為已喪失數據完整性。 詳細釋義 詳細釋義 資料庫中的數據是從外界輸入的,而數據的輸入由於種種原因,會發生輸入無效或 錯誤信息。保證輸入的數據符合規定,成為了 資料庫系統,尤其是多用戶的 關係資料庫系統首要關註的問題 ...
  • java.sql.SQLSyntaxErrorException: ORA-00904: "column": 標識符無效 首先查看無效的列是不是orcale關鍵字 , 如果不是 , 查看與column欄位相關的所有內容 , 引用是否正確 儘量不要用select 中的欄位別名當做 where 或者 o ...
  • 獨立索引: 獨立索引是指索引列不能是表達式的一部分,也不能是函數的參數 例1: SELECT actor_id FROM actor WHERE actor_id+1=5 --這種寫法,就算在actor_id上建立了索引,也不起效 例2: SELECT .... WHERE TO_DAYS(CURR ...
  • mysql允許在相同列上創建多個索引,無論是有意還是無意,mysql需要單獨維護重覆的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響性能。 重覆索引是指的在相同的列上按照相同的順序創建的相同類型的索引,應該避免這樣創建重覆索引,發現以後也應該立即刪除。但,在相同的列上創建不同類型的索 ...
  • 聚類 在瞭解譜聚類之前,首先需要知道聚類,聚類通俗的講就是將一大堆沒有標簽的數據根據相似度分為很多簇(就是一坨坨的),將相似的聚成一坨,不相似的再聚成其他很多坨。一般的聚類演算法存在的問題是k值的選擇(就是簇的數量事先不知道),相似性的度量(如何判斷兩個樣本點是否相似),如何不陷入局部最優等問題,流行 ...
  • 序列:是oracle提供的,用於產生唯一數值的對象,主要配合表的單一主鍵使用。 創建序列: create sequence seq_NAME//命名 start with 1//初始值 increment by 1//遞增值 minvalue 1//最小值,可預設,採用系統預設值 maxvalue ...
  • 索引(Index):幫助Mysql高效獲取數據的一種數據結構。用於提高查找效率,可以比作字典。可以簡單理解為排好序的快速查找的數據結構。 索引的作用:便於查詢和排序(所以添加索引會影響where 語句與 order by 排序語句)。 在數據之外,資料庫還維護著滿足特定查找演算法的數據結構,這些數據結... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...