<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Hadoop MapReduce 初學者教程 > 原文: [https://howtodoinjava.com/hadoop/hadoop-mapreduce-tutorial-for-beginners/](https://howtodoinjava.com/hadoop/hadoop-mapreduce-tutorial-for-beginners/) [**Hadoop**](//howtodoinjava.com/big-data/hadoop/hadoop-big-data-tutorial/) **MapReduce** 是一種軟件框架,可輕松以可靠,容錯的方式,編寫可在商用硬件的大型集群(數千個節點)上并行處理大量數據(多 TB 數據集)的應用。 與 [**HDFS**](//howtodoinjava.com/big-data/hadoop/hdfs-hadoop-distributed-file-system-architecture-tutorial/) 相似,Hadoop MapReduce 甚至可以在商用硬件中執行,并且假定節點可以隨時發生故障并且仍在處理作業。 通過將一個任務劃分為多個獨立的子任務,MapReduce 可以并行處理大量數據。 與 HDFS 相似,MapReduce 也具有主從結構。 MapReduce 作業通常將輸入數據集分成獨立的塊,這些塊由**映射**任務以完全并行的方式處理。 框架對映射的輸出進行排序,然后將其輸入到**簡化**任務中。 通常,作業的輸入和輸出都存儲在文件系統中。 輸入和輸出,甚至是 MapReduce 作業中的中間輸出,都是`<key, value>`對的形式。 鍵和值必須是可序列化的,并且不使用 Java 序列化程序包,而是具有一個接口,該接口必須實現并且可以有效地序列化,因為數據處理必須從一個節點移動到另一個節點。 ## MapReduce 應用中的步驟 在大數據中,您希望將大數據集分解為許多較小的部分,并使用相同的算法并行處理它們。 使用 HDFS,文件已經被分割成一口大小的片段。 MapReduce 可幫助您處理所有這些數據。 MapReduce 作業很復雜,涉及多個步驟。 某些步驟是由 Hadoop 以默認行為執行的,可以在需要時將其覆蓋。 以下是在 MapReduce 中依次執行的必需步驟: 1. #### 映射器 在 MapReduce 中,映射器代碼應具有邏輯,該邏輯可以獨立于其他塊數據。 映射器邏輯應利用算法中所有可能的并行步驟。 在特定的`InputFormat`類型和必須在其上運行映射器進程的文件的驅動中設置對映射器的輸入。 映射器的輸出將是一個映射`<key, value>`,在映射器輸出中設置的鍵和值不會保存在 HDFS 中,而是會在 OS 空間路徑中創建一個中間文件,并且該文件會被讀取,隨機播放和排序。 2. #### 隨機排序(合并) 隨機排序和排序是映射器和歸約器之間 MapReduce 中的中間步驟,由 Hadoop 處理,可以根據需要覆蓋。 隨機播放過程通過對映射器輸出的鍵值進行分組來聚合所有映射器輸出,并且該值將附加在值列表中。 因此,隨機播放輸出格式將為映射`<key, List<list of values>>`。 3. #### 歸約器 歸約器是聚合器過程,將經過隨機排序和排序后的數據發送到具有`<key, List<list of values>>`的歸約器,然后歸約器將在值列表上進行處理。 每個鍵可以發送到不同的歸約器。 歸約器可以設置該值,并將其合并到 MapReduce 作業的最終輸出中,并且該值將作為最終輸出保存在 HDFS 中。 ![MapReduce Process](https://img.kancloud.cn/f2/5e/f25eabdd0ccbdfd7af7e8c3284fe1496_600x331.png) MapReduce 流程 讓我們來看看序列圖的所有動作信息。 這將有助于更好地可視化整個過程。 ![MapReduce Sequence Diagram](https://img.kancloud.cn/15/a7/15a7f622d7b253d69957f9955f99f3e0_700x441.png) MapReduce 序列圖 讓我們來看一個上述步驟的示例。 考慮一下,我們將一個文件分為兩個節點,文件內容為: 1. **`file1`內容**:“`hello world hello moon`” 2. **`file2`內容**:“`goodbye world goodnight moon`” 現在,在每個步驟之后,MapReduce 的結果如下: ![MapReduce Steps Output](https://img.kancloud.cn/f2/12/f212e59323687f1fb76f4a3b0245e996_603x425.png) MapReduce 步驟輸出 沒有歸約器的應用稱為“只有映射的作業”,當不需要合并映射任務的結果集時,它會很有用。 ## 用 Java 編寫 MapReduce 應用 要對 HDFS 中存儲的大數據使用 MapReduce,必須提供以下輸入: * 指定輸入/輸出位置 * 通過實現適當的接口和/或抽象類來提供映射并簡化功能 映射和歸約函數必須與`Serializable`鍵和值一起使用,因為它們將在不同的節點之間移動。 對于序列化,Hadoop 使用以下兩個接口: 1. #### `Writable`接口(用于值) `Writable`接口用于序列化和反序列化的值。 一些實現`Writable`接口的類是`ArrayWritable`,`BooleanWritable`和`ByteWritable`等。我們可以創建自己的自定義`Writable`類,該類可在 MapReduce 中使用。 為了創建自定義類,我們必須實現`Writable`類并實現以下兩種方法: **`void write (DataOutput out):`**:序列化對象。 **`void readFields (DataInput in)`**:這將讀取輸入流并將其轉換為對象。 2. #### `WritableComparable`接口(用于鍵) `WritableComparable`用于鍵,鍵是從`Writable`接口繼承的,并實現可比較的接口以提供值對象的比較。 其中的一些實現是`BooleanWritable`,`BytesWritable`和`ByteWritable`等。為了創建自定義`WritableComparable`類,我們必須實現`WritableComparable`類并實現以下三種方法: **`void write (DataPutput out)`**:序列化對象 **`void readFields (DataInput in)`**:讀取輸入流并將其轉換為對象 **`Int compareTo (Object obj)`**:比較排序鍵所需的值 將以上輸入合并到 MapReduce 作業中后,可以將其提交到`JobTracker`。 ## `JobTracker`和`TaskTracker`流程 為了執行上面討論的所有事情,MapReduce 具有以下兩個守護進程: 1. #### `JobTracker`(主進程) `JobTracker`的主要功能是資源管理,跟蹤資源可用性和任務處理周期。 `JobTracker`識別`TaskTracker`來執行某些任務,并監視任務的進度和狀態。 `JobTracker`是 MapReduce 流程的單點故障。 2. #### `TaskTracker`(從屬進程) `TaskTracker`是從屬守護程序進程,它執行`JobTracker`分配的任務。 `TaskTracker`定期將心跳消息發送到`JobTracker`,以通知有關可用插槽的信息,并將有關任務的狀態發送給`JobTracker`,并檢查是否必須執行任何任務。 ## 擇時執行 MapReduce 作業分為多個映射器和歸約器流程以及一些中間任務,因此一個作業可以產生數百或數千個任務,并且某些任務或節點可能需要很長時間才能完成任務。 Hadoop 監視和檢測任務何時運行得比預期的慢,并且如果該節點的執行歷史較慢,則它將在另一個節點中啟動相同的任務作為備份,這稱為推測性執行任務。 Hadoop 不會嘗試修復或診斷節點或進程,因為該進程不會出錯,但是速度很慢,并且由于硬件降級,軟件配置錯誤,網絡擁塞等原因會導致速度變慢。 一旦標記了執行緩慢的任務,`JobTracker`就會在另一個節點上啟動該任務,并獲取該任務的結果,該結果首先完成并殺死其他任務并記錄情況。 如果某個節點始終落后,則`JobTracker`對該節點的優先級會降低。 可以啟用或禁用推測性執行,并且默認情況下將其啟用,因為它是一個有用的過程。 推測執行必須監視每個任務,在某些情況下會影響性能和資源。 不建議在執行某些任務的情況下執行推測執行,在這些任務中,特別是歸約任務由于特定歸約器上的數據偏斜而可能獲得數百萬個值,這比其他任務需要更長的時間,而啟動另一個任務也無濟于事。 ## MapReduce 的局限性? 1. 您無法控制映射或縮小的運行順序。 2. 為了獲得最大的并行度,您需要映射和歸約不依賴于同一 MapReduce 作業中生成的數據(即兩者都應該是無狀態的)。 3. 在所有映射都完成之前,不會進行歸約操作。 4. 一般的假設,歸約的輸出小于映射的輸入。 5. 由于帶有索引的數據庫將始終比未索引數據上的 MapReduce 作業快,因此性能可能下降。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看