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方法,並且寫出和讀入的順序必須一一對應。