1. 程式人生 > >Hadoop 7days -hadoop序列化機制及 使用maven開發 MR統計上下行流量的例子開發

Hadoop 7days -hadoop序列化機制及 使用maven開發 MR統計上下行流量的例子開發

MR執行流程:
(1).客戶端提交一個mr的jar包給JobClient(提交方式:hadoop jar ...)
(2).JobClient通過RPC和ResourceManager進行通訊,返回一個存放jar包的地址(HDFS)和jobId
(3).client將jar包寫入到HDFS當中(path = hdfs上的地址 + jobId)
(4).開始提交任務(任務的描述資訊,不是jar, 包括jobid,jar存放的位置,配置資訊等等)
(5).ResourceManager進行初始化任務
(6).讀取HDFS上的要處理的檔案,開始計算輸入分片,每一個分片對應一個MapperTask
(7).NodeManager通過心跳機制領取任務(任務的描述資訊)
(8).下載所需的jar,配置檔案等
(9).NodeManager啟動一個java child子程序,用來執行具體的任務(MapperTask或ReducerTask)
(10).將結果寫入到HDFS當中

Hadoop中的資料使用RPC協議在網路中傳播時,需要實現序列化。而Hadoop並沒有使用JDK預設的序列化機制(JDK原生的序列化機制效率較低),而是使用了自己的序列化機制。因此我們在傳遞引數時,有時候需要手動實現序列化。這是一個要注意的地方。

在Linux下使用maven進行開發:

maven的jar包會下載大使用者主目錄的.m2的檔案下。

maven工程的pom.xml檔案對maven進行一些配置

<!--可以使maven從網路上下載所需的包-->

<dependency>

      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.4.3</version>
</dependency>

一些common包:

 <dependency>
            <groupID>org.apache.hadoop</groupID>
            <artifactID>hadoop-commen</artifactID>
            <version>2.2.0</version>

        </dependency>

還需要引入hdfs的依賴包

  <dependency>

    <groupID>ort.apache.hadoop</groupID>

    <artifactID><hadoop-hdfs</artifactID>

    <version>2.2.0</version>

</dependency>

需要引入MapReduce依賴:
         <dependency>
            <groupID>org.apache.hadoop</groupID>
            <artifactID>hadoop-mapreduce-client-core</artifactID>
            <version>2.2.0</version>

         </dependency>

對於main方法,裡面要設定job,mapper和reducer的部分資訊:


mapper和reducer我們以內部類的形式完成。

mapper:


reducer:


需要注意的是資料的形式,因為value並不是一個值,因此我們將它封裝到bean中,而bean有些需要注意的地方:


主要就是序列化和反序列化的部分。因為hadoop不使用jdk的預設序列化機制(效率太低),因此我們自己要實現序列化。DataBean應該事先writable介面,並實現readFiles和write方法,並且寫出和讀入的順序必須一一對應。