執行我的首個mapreduce程式

2021-07-02 06:03:39 字數 1698 閱讀 6572

之前整了套hadoop的實驗集群,部署過程在這篇博文裡做了記錄:不過那時候還只是4個節點,只開啟了hdfs,後來一直沒有時間搞。最近專案組刀片機又空出來了幾台,正好被我拿來擴充我的小集群,將節點數量擴充到了9臺,有了餘量多部署乙個secondary-namenode,datanode數量也增加到了7臺,另外忙裡偷閒學習了怎麼配置yarn跑mapreduce。

順便一說,yarn是hadoop2.0之後才有的,手頭有本書是hadoop1.x的,網上的資料不少也是hadoop1.x的,都沒有yarn的相關資料。

首先在namenode(也就是我這裡的hadoop0)上試了一下執行start-yarn.sh,之後執行jps就可以看到resourcemanager程序了,也可以通過web訪問hadoop0:8088檢視集群的狀態。

這時訪問web發現節點數為0,但是可以執行hadoop自帶的example。比如我在hdfs上建立了/input資料夾,裡面放了一些檔案

hadoop jar /opt/hadoop/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.6.0-sources.jar org.apache.hadoop.examples.wordcount /input  /output
可以統計hdfs中/input資料夾下的檔案的檔案中的每個單詞出現的次數,並將結果輸出到hdfs上的/output資料夾裡(如果/output已經存在的話就會失敗,所以每次跑的時候要換個輸出路徑或者把原來的結果刪掉)

因為這時候mapred-site.xml中的mapreduce.framework.name屬性的值預設為local,也就是在namenode單機執行的。

修改hadoop資料夾中etc/hadoop/mapred-site.xml為:

mapreduce.framework.name

yarn

修改yarn-site.xml,加上這個配置:

yarn.resourcemanager.hostname

hadoop0

也就是設定一下resourcesmanager的位址,重啟yarn,就可以在yarn的web上看到目前有若干節點,以及他們各自的狀態了。

再次執行hadoop的exapmle,mapreduce可以執行了,但是卻報了個錯誤:

container launch failed for container_1430820352489_0001_01_000007 : org.apache.hadoop.yarn.exceptions.invalidauxserviceexception: the auxservice:mapreduce_shuffle does not exist
網上查詢資料發現,這是hadoop的乙個bug,auxservice本來應該是有預設值的,但是不手動設定的話還是會報錯。再次修改hadoop資料夾中的etc/hadoop/yarn-site.xml,加上這個引數:

yarn.nodemanager.aux-services

mapreduce_shuffle

重啟yarn後提交任務,ok,終於順利跑完了。只是速度比單機的時候慢了很多。畢竟hadoop是為了處理大檔案設計的,啟動mapreduce有其本身的固定消耗,所以處理小檔案反而不如單機跑快。

MapReduce的執行原理

每個map上建立乙個split資料,預設和block大小相同,每乙個split都會由乙個map task進行處理,從block中讀取出每一行的資料會變成乙個個的鍵值對。接下來,讀取出來的資料都會進入記憶體緩衝區,在進入緩衝區之前,每一條資料都會被打上標籤,這個過程叫做分割槽,由分割槽器來完成,預設的...

MapReduce的執行流程

mapreduce 執行流程 shuffle在maptask和reducetask之間 1 資料的底層儲存 檔案在hdfs中以block的方式存放時,假如分為3塊,為了計算邏輯切片的大小,用fileinputformat類獲得get split方法進行切片,理論上乙個切片 乙個塊區,最後乙個邏輯切片...

MapReduce執行流程

mapreduce的大體流程是這樣的,如圖所示 由可以看到mapreduce執行下來主要包含這樣幾個步驟 1.首先對輸入資料來源進行切片 2.master排程worker執行map任務 3.worker讀取輸入源片段 4.worker執行map任務,將任務輸出儲存在本地 5.master排程work...