source: proiecte/HadoopJUnit/hadoop-0.20.1/docs/cn/mapred_tutorial.html @ 120

Last change on this file since 120 was 120, checked in by (none), 14 years ago

Added the mail files for the Hadoop JUNit Project

  • Property svn:executable set to *
File size: 129.7 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<meta content="Apache Forrest" name="Generator">
6<meta name="Forrest-version" content="0.8">
7<meta name="Forrest-skin-name" content="pelt">
8<title>Hadoop Map/Reduce教皋</title>
9<link type="text/css" href="skin/basic.css" rel="stylesheet">
10<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
11<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
12<link type="text/css" href="skin/profile.css" rel="stylesheet">
13<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
14<link rel="shortcut icon" href="images/favicon.ico">
15</head>
16<body onload="init()">
17<script type="text/javascript">ndeSetTextSize();</script>
18<div id="top">
19<!--+
20    |breadtrail
21    +-->
22<div class="breadtrail">
23<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/core/">Core</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
24</div>
25<!--+
26    |header
27    +-->
28<div class="header">
29<!--+
30    |start group logo
31    +-->
32<div class="grouplogo">
33<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
34</div>
35<!--+
36    |end group logo
37    +-->
38<!--+
39    |start Project Logo
40    +-->
41<div class="projectlogo">
42<a href="http://hadoop.apache.org/core/"><img class="logoImage" alt="Hadoop" src="images/core-logo.gif" title="Scalable Computing Platform"></a>
43</div>
44<!--+
45    |end Project Logo
46    +-->
47<!--+
48    |start Search
49    +-->
50<div class="searchbox">
51<form action="http://www.google.com/search" method="get" class="roundtopsmall">
52<input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
53                    <input name="Search" value="Search" type="submit">
54</form>
55</div>
56<!--+
57    |end search
58    +-->
59<!--+
60    |start Tabs
61    +-->
62<ul id="tabs">
63<li>
64<a class="unselected" href="http://hadoop.apache.org/core/">项目</a>
65</li>
66<li>
67<a class="unselected" href="http://wiki.apache.org/hadoop">绎基</a>
68</li>
69<li class="current">
70<a class="selected" href="index.html">Hadoop 0.18文档</a>
71</li>
72</ul>
73<!--+
74    |end Tabs
75    +-->
76</div>
77</div>
78<div id="main">
79<div id="publishedStrip">
80<!--+
81    |start Subtabs
82    +-->
83<div id="level2tabs"></div>
84<!--+
85    |end Endtabs
86    +-->
87<script type="text/javascript"><!--
88document.write("Last Published: " + document.lastModified);
89//  --></script>
90</div>
91<!--+
92    |breadtrail
93    +-->
94<div class="breadtrail">
95
96             &nbsp;
97           </div>
98<!--+
99    |start Menu, mainarea
100    +-->
101<!--+
102    |start Menu
103    +-->
104<div id="menu">
105<div onclick="SwitchMenu('menu_selected_1.1', 'skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">文档</div>
106<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
107<div class="menuitem">
108<a href="index.html">抂述</a>
109</div>
110<div class="menuitem">
111<a href="quickstart.html">快速入闚</a>
112</div>
113<div class="menuitem">
114<a href="cluster_setup.html">集矀搭建</a>
115</div>
116<div class="menuitem">
117<a href="hdfs_design.html">HDFS构架讟计</a>
118</div>
119<div class="menuitem">
120<a href="hdfs_user_guide.html">HDFS䜿甚指南</a>
121</div>
122<div class="menuitem">
123<a href="hdfs_permissions_guide.html">HDFS权限指南</a>
124</div>
125<div class="menuitem">
126<a href="hdfs_quota_admin_guide.html">HDFS配额管理指南</a>
127</div>
128<div class="menuitem">
129<a href="commands_manual.html">呜什手册</a>
130</div>
131<div class="menuitem">
132<a href="hdfs_shell.html">FS Shell䜿甚指南</a>
133</div>
134<div class="menuitem">
135<a href="distcp.html">DistCp䜿甚指南</a>
136</div>
137<div class="menupage">
138<div class="menupagetitle">Map-Reduce教皋</div>
139</div>
140<div class="menuitem">
141<a href="native_libraries.html">Hadoop本地库</a>
142</div>
143<div class="menuitem">
144<a href="streaming.html">Streaming</a>
145</div>
146<div class="menuitem">
147<a href="hadoop_archives.html">Hadoop Archives</a>
148</div>
149<div class="menuitem">
150<a href="hod.html">Hadoop On Demand</a>
151</div>
152<div class="menuitem">
153<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/index.html">API参考</a>
154</div>
155<div class="menuitem">
156<a href="http://hadoop.apache.org/core/docs/r0.18.2/jdiff/changes.html">API Changes</a>
157</div>
158<div class="menuitem">
159<a href="http://wiki.apache.org/hadoop/">绎基</a>
160</div>
161<div class="menuitem">
162<a href="http://wiki.apache.org/hadoop/FAQ">垞见问题</a>
163</div>
164<div class="menuitem">
165<a href="http://hadoop.apache.org/core/mailing_lists.html">邮件列衚</a>
166</div>
167<div class="menuitem">
168<a href="http://hadoop.apache.org/core/docs/r0.18.2/releasenotes.html">发行诎明</a>
169</div>
170<div class="menuitem">
171<a href="http://hadoop.apache.org/core/docs/r0.18.2/changes.html">变曎日志</a>
172</div>
173</div>
174<div id="credit"></div>
175<div id="roundbottom">
176<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
177<!--+
178  |alternative credits
179  +-->
180<div id="credit2"></div>
181</div>
182<!--+
183    |end Menu
184    +-->
185<!--+
186    |start content
187    +-->
188<div id="content">
189<div title="Portable Document Format" class="pdflink">
190<a class="dida" href="mapred_tutorial.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
191        PDF</a>
192</div>
193<h1>Hadoop Map/Reduce教皋</h1>
194<div id="minitoc-area">
195<ul class="minitoc">
196<li>
197<a href="#%E7%9B%AE%E7%9A%84">目的</a>
198</li>
199<li>
200<a href="#%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6">先决条件</a>
201</li>
202<li>
203<a href="#%E6%A6%82%E8%BF%B0">抂述</a>
204</li>
205<li>
206<a href="#%E8%BE%93%E5%85%A5%E4%B8%8E%E8%BE%93%E5%87%BA">蟓入䞎蟓出</a>
207</li>
208<li>
209<a href="#%E4%BE%8B%E5%AD%90%EF%BC%9AWordCount+v1.0">䟋子WordCount v1.0</a>
210<ul class="minitoc">
211<li>
212<a href="#%E6%BA%90%E4%BB%A3%E7%A0%81">源代码</a>
213</li>
214<li>
215<a href="#%E7%94%A8%E6%B3%95">甚法</a>
216</li>
217<li>
218<a href="#%E8%A7%A3%E9%87%8A">解释</a>
219</li>
220</ul>
221</li>
222<li>
223<a href="#Map%2FReduce+-+%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2">Map/Reduce - 甚户界面</a>
224<ul class="minitoc">
225<li>
226<a href="#%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%E6%8F%8F%E8%BF%B0">栞心功胜描述</a>
227<ul class="minitoc">
228<li>
229<a href="#Mapper">Mapper</a>
230</li>
231<li>
232<a href="#Reducer">Reducer</a>
233</li>
234<li>
235<a href="#Partitioner">Partitioner</a>
236</li>
237<li>
238<a href="#Reporter">Reporter</a>
239</li>
240<li>
241<a href="#OutputCollector">OutputCollector</a>
242</li>
243</ul>
244</li>
245<li>
246<a href="#%E4%BD%9C%E4%B8%9A%E9%85%8D%E7%BD%AE">䜜䞚配眮</a>
247</li>
248<li>
249<a href="#%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%89%A7%E8%A1%8C%E5%92%8C%E7%8E%AF%E5%A2%83">任务的执行和环境</a>
250</li>
251<li>
252<a href="#%E4%BD%9C%E4%B8%9A%E7%9A%84%E6%8F%90%E4%BA%A4%E4%B8%8E%E7%9B%91%E6%8E%A7">䜜䞚的提亀䞎监控</a>
253<ul class="minitoc">
254<li>
255<a href="#%E4%BD%9C%E4%B8%9A%E7%9A%84%E6%8E%A7%E5%88%B6">䜜䞚的控制</a>
256</li>
257</ul>
258</li>
259<li>
260<a href="#%E4%BD%9C%E4%B8%9A%E7%9A%84%E8%BE%93%E5%85%A5">䜜䞚的蟓入</a>
261<ul class="minitoc">
262<li>
263<a href="#InputSplit">InputSplit</a>
264</li>
265<li>
266<a href="#RecordReader">RecordReader</a>
267</li>
268</ul>
269</li>
270<li>
271<a href="#%E4%BD%9C%E4%B8%9A%E7%9A%84%E8%BE%93%E5%87%BA">䜜䞚的蟓出</a>
272<ul class="minitoc">
273<li>
274<a href="#%E4%BB%BB%E5%8A%A1%E7%9A%84Side-Effect+File">任务的Side-Effect File</a>
275</li>
276<li>
277<a href="#RecordWriter">RecordWriter</a>
278</li>
279</ul>
280</li>
281<li>
282<a href="#%E5%85%B6%E4%BB%96%E6%9C%89%E7%94%A8%E7%9A%84%E7%89%B9%E6%80%A7">其他有甚的特性</a>
283<ul class="minitoc">
284<li>
285<a href="#Counters">Counters</a>
286</li>
287<li>
288<a href="#DistributedCache">DistributedCache</a>
289</li>
290<li>
291<a href="#Tool">Tool</a>
292</li>
293<li>
294<a href="#IsolationRunner">IsolationRunner</a>
295</li>
296<li>
297<a href="#Profiling">Profiling</a>
298</li>
299<li>
300<a href="#%E8%B0%83%E8%AF%95">调试</a>
301</li>
302<li>
303<a href="#JobControl">JobControl</a>
304</li>
305<li>
306<a href="#%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9">数据压猩</a>
307</li>
308</ul>
309</li>
310</ul>
311</li>
312<li>
313<a href="#%E4%BE%8B%E5%AD%90%EF%BC%9AWordCount+v2.0">䟋子WordCount v2.0</a>
314<ul class="minitoc">
315<li>
316<a href="#%E6%BA%90%E4%BB%A3%E7%A0%81-N10DC0">源代码</a>
317</li>
318<li>
319<a href="#%E8%BF%90%E8%A1%8C%E6%A0%B7%E4%BE%8B">运行样䟋</a>
320</li>
321<li>
322<a href="#%E7%A8%8B%E5%BA%8F%E8%A6%81%E7%82%B9">皋序芁点</a>
323</li>
324</ul>
325</li>
326</ul>
327</div>
328 
329   
330<a name="N1000D"></a><a name="%E7%9B%AE%E7%9A%84"></a>
331<h2 class="h3">目的</h2>
332<div class="section">
333<p>这篇教皋从甚户的角床出发党面地介绍了Hadoop Map/Reduce框架的各䞪方面。</p>
334</div>
335   
336   
337<a name="N10017"></a><a name="%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6"></a>
338<h2 class="h3">先决条件</h2>
339<div class="section">
340<p>请先确讀Hadoop被正确安装、配眮和正垞运行䞭。曎倚信息见</p>
341<ul>
342       
343<li>
344         
345<a href="quickstart.html">Hadoop快速入闚</a>对初次䜿甚者。
346        </li>
347       
348<li>
349         
350<a href="cluster_setup.html">Hadoop集矀搭建</a>对倧规暡分垃匏集矀。
351        </li>
352     
353</ul>
354</div>
355   
356   
357<a name="N10032"></a><a name="%E6%A6%82%E8%BF%B0"></a>
358<h2 class="h3">抂述</h2>
359<div class="section">
360<p>Hadoop Map/Reduce是䞀䞪䜿甚简易的蜯件框架基于它写出来的应甚皋序胜借运行圚由䞊千䞪商甚机噚组成的倧型集矀䞊并以䞀种可靠容错的方匏并行倄理䞊T级别的数据集。</p>
361<p>䞀䞪Map/Reduce <em>䜜䞚job</em> é€šåžžäŒšæŠŠèŸ“入的数据集切分䞺若干独立的数据块由
362      <em>map任务task</em>以完党并行的方匏倄理它们。框架䌚对map的蟓出先进行排序
363      然后把结果蟓入给<em>reduce任务</em>。通垞䜜䞚的蟓入和蟓出郜䌚被存傚圚文件系统䞭。
364      敎䞪框架莟莣任务的调床和监控以及重新执行已经倱莥的任务。</p>
365<p>通垞Map/Reduce框架和<a href="hdfs_design.html">分垃匏文件系统</a>是运行圚䞀组盞同的节点䞊的也就是诎计算节点和存傚节点通垞圚䞀起。这种配眮允讞框架圚那些已经存奜数据的节点䞊高效地调床任务这可以䜿敎䞪集矀的眑络垊宜被非垞高效地利甚。</p>
366<p>Map/Reduce框架由䞀䞪单独的master <span class="codefrag">JobTracker</span> å’Œæ¯äžªé›†çŸ€èŠ‚点䞀䞪slave <span class="codefrag">TaskTracker</span>共同组成。master莟莣调床构成䞀䞪䜜䞚的所有任务这些任务分垃圚䞍同的slave䞊master监控它们的执行重新执行已经倱莥的任务。而slave仅莟莣执行由master指掟的任务。</p>
367<p>应甚皋序至少应该指明蟓入/蟓出的䜍眮路埄并通过实现合适的接口或抜象类提䟛map和reduce凜数。再加䞊其他䜜䞚的参数就构成了<em>䜜䞚配眮job configuration</em>。然后Hadoop的 <em>job client</em>提亀䜜䞚jar包/可执行皋序等和配眮信息给<span class="codefrag">JobTracker</span>后者莟莣分发这些蜯件和配眮信息给slave、调床任务并监控它们的执行同时提䟛状态和诊断信息给job-client。</p>
368<p>虜然Hadoop框架是甚Java<sup>TM</sup>实现的䜆Map/Reduce应甚皋序则䞍䞀定芁甚
369      Java来写 。</p>
370<ul>
371       
372<li>
373         
374<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/streaming/package-summary.html">
375          Hadoop Streaming</a>是䞀种运行䜜䞚的实甚工具它允讞甚户创建和运行任䜕可执行皋序
376          䟋劂Shell工具来做䞺mapper和reducer。
377        </li>
378       
379<li>
380         
381<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/pipes/package-summary.html">
382          Hadoop Pipes</a>是䞀䞪䞎<a href="http://www.swig.org/">SWIG</a>兌容的C++ API
383          没有基于JNI<sup>TM</sup>技术它也可甚于实现Map/Reduce应甚皋序。
384        </li>
385     
386</ul>
387</div>
388   
389   
390<a name="N10082"></a><a name="%E8%BE%93%E5%85%A5%E4%B8%8E%E8%BE%93%E5%87%BA"></a>
391<h2 class="h3">蟓入䞎蟓出</h2>
392<div class="section">
393<p>Map/Reduce框架运蜬圚<span class="codefrag">&lt;key, value&gt;</span> é”®å€Œå¯¹äžŠïŒŒä¹Ÿå°±æ˜¯è¯ŽïŒŒ
394      框架把䜜䞚的蟓入看䞺是䞀组<span class="codefrag">&lt;key, value&gt;</span> é”®å€Œå¯¹ïŒŒåŒæ ·ä¹Ÿäº§å‡ºäž€ç»„
395      <span class="codefrag">&lt;key, value&gt;</span> é”®å€Œå¯¹åšäžºäœœäžšçš„蟓出这䞀组键倌对的类型可胜䞍同。</p>
396<p>框架需芁对<span class="codefrag">key</span>和<span class="codefrag">value</span>的类(classes)进行序列化操䜜
397      因歀这些类需芁实现 <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/Writable.html">Writable</a>接口。
398      及倖䞺了方䟿框架执行排序操䜜<span class="codefrag">key</span>类必须实现
399      <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/WritableComparable.html">
400      WritableComparable</a>接口。
401      </p>
402<p>䞀䞪Map/Reduce 䜜䞚的蟓入和蟓出类型劂䞋所瀺</p>
403<p>
404        (input) <span class="codefrag">&lt;k1, v1&gt;</span> 
405        -&gt; 
406        <strong>map</strong> 
407        -&gt; 
408        <span class="codefrag">&lt;k2, v2&gt;</span> 
409        -&gt; 
410        <strong>combine</strong> 
411        -&gt; 
412        <span class="codefrag">&lt;k2, v2&gt;</span> 
413        -&gt; 
414        <strong>reduce</strong> 
415        -&gt; 
416        <span class="codefrag">&lt;k3, v3&gt;</span> (output)
417      </p>
418</div>
419
420   
421<a name="N100C4"></a><a name="%E4%BE%8B%E5%AD%90%EF%BC%9AWordCount+v1.0"></a>
422<h2 class="h3">䟋子WordCount v1.0</h2>
423<div class="section">
424<p>圚深入细节之前让我们先看䞀䞪Map/Reduce的应甚瀺䟋以䟿对它们的工䜜方匏有䞀䞪初步的讀识。</p>
425<p>
426<span class="codefrag">WordCount</span>是䞀䞪简单的应甚它可以计算出指定数据集䞭每䞀䞪单词出现的次数。</p>
427<p>这䞪应甚适甚于
428      <a href="quickstart.html#Standalone+Operation">单机暡匏</a>
429      <a href="quickstart.html#SingleNodeSetup">䌪分垃匏暡匏</a> æˆ–
430      <a href="quickstart.html#Fully-Distributed+Operation">完党分垃匏暡匏</a> 
431      侉种Hadoop安装方匏。</p>
432<a name="N100E1"></a><a name="%E6%BA%90%E4%BB%A3%E7%A0%81"></a>
433<h3 class="h4">源代码</h3>
434<table class="ForrestTable" cellspacing="1" cellpadding="4">
435         
436<tr>
437           
438<th colspan="1" rowspan="1"></th>
439            <th colspan="1" rowspan="1">WordCount.java</th>
440         
441</tr>
442         
443<tr>
444           
445<td colspan="1" rowspan="1">1.</td>
446            <td colspan="1" rowspan="1">
447              <span class="codefrag">package org.myorg;</span>
448            </td>
449         
450</tr>
451         
452<tr>
453           
454<td colspan="1" rowspan="1">2.</td>
455            <td colspan="1" rowspan="1"></td>
456         
457</tr>
458         
459<tr>
460           
461<td colspan="1" rowspan="1">3.</td>
462            <td colspan="1" rowspan="1">
463              <span class="codefrag">import java.io.IOException;</span>
464            </td>
465         
466</tr>
467         
468<tr>
469           
470<td colspan="1" rowspan="1">4.</td>
471            <td colspan="1" rowspan="1">
472              <span class="codefrag">import java.util.*;</span>
473            </td>
474         
475</tr>
476         
477<tr>
478           
479<td colspan="1" rowspan="1">5.</td>
480            <td colspan="1" rowspan="1"></td>
481         
482</tr>
483         
484<tr>
485           
486<td colspan="1" rowspan="1">6.</td>
487            <td colspan="1" rowspan="1">
488              <span class="codefrag">import org.apache.hadoop.fs.Path;</span>
489            </td>
490         
491</tr>
492         
493<tr>
494           
495<td colspan="1" rowspan="1">7.</td>
496            <td colspan="1" rowspan="1">
497              <span class="codefrag">import org.apache.hadoop.conf.*;</span>
498            </td>
499         
500</tr>
501         
502<tr>
503           
504<td colspan="1" rowspan="1">8.</td>
505            <td colspan="1" rowspan="1">
506              <span class="codefrag">import org.apache.hadoop.io.*;</span>
507            </td>
508         
509</tr>
510         
511<tr>
512           
513<td colspan="1" rowspan="1">9.</td>
514            <td colspan="1" rowspan="1">
515              <span class="codefrag">import org.apache.hadoop.mapred.*;</span>
516            </td>
517         
518</tr>
519         
520<tr>
521           
522<td colspan="1" rowspan="1">10.</td>
523            <td colspan="1" rowspan="1">
524              <span class="codefrag">import org.apache.hadoop.util.*;</span>
525            </td>
526         
527</tr>
528         
529<tr>
530           
531<td colspan="1" rowspan="1">11.</td>
532            <td colspan="1" rowspan="1"></td>
533         
534</tr>
535         
536<tr>
537           
538<td colspan="1" rowspan="1">12.</td>
539            <td colspan="1" rowspan="1">
540              <span class="codefrag">public class WordCount {</span>
541            </td>
542         
543</tr>
544         
545<tr>
546           
547<td colspan="1" rowspan="1">13.</td>
548            <td colspan="1" rowspan="1"></td>
549         
550</tr>
551         
552<tr>
553           
554<td colspan="1" rowspan="1">14.</td>
555            <td colspan="1" rowspan="1">
556              &nbsp;&nbsp;
557              <span class="codefrag">
558                public static class Map extends MapReduceBase
559                implements Mapper&lt;LongWritable, Text, Text, IntWritable&gt; {
560              </span>
561            </td>
562         
563</tr>
564         
565<tr>
566           
567<td colspan="1" rowspan="1">15.</td>
568            <td colspan="1" rowspan="1">
569              &nbsp;&nbsp;&nbsp;&nbsp;
570              <span class="codefrag">
571                private final static IntWritable one = new IntWritable(1);
572              </span>
573            </td>
574         
575</tr>
576         
577<tr>
578           
579<td colspan="1" rowspan="1">16.</td>
580            <td colspan="1" rowspan="1">
581              &nbsp;&nbsp;&nbsp;&nbsp;
582              <span class="codefrag">private Text word = new Text();</span>
583            </td>
584         
585</tr>
586         
587<tr>
588           
589<td colspan="1" rowspan="1">17.</td>
590            <td colspan="1" rowspan="1"></td>
591         
592</tr>
593         
594<tr>
595           
596<td colspan="1" rowspan="1">18.</td>
597            <td colspan="1" rowspan="1">
598              &nbsp;&nbsp;&nbsp;&nbsp;
599              <span class="codefrag">
600                public void map(LongWritable key, Text value,
601                OutputCollector&lt;Text, IntWritable&gt; output,
602                Reporter reporter) throws IOException {
603              </span>
604            </td>
605         
606</tr>
607         
608<tr>
609           
610<td colspan="1" rowspan="1">19.</td>
611            <td colspan="1" rowspan="1">
612              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
613              <span class="codefrag">String line = value.toString();</span>
614            </td>
615         
616</tr>
617         
618<tr>
619           
620<td colspan="1" rowspan="1">20.</td>
621            <td colspan="1" rowspan="1">
622              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
623              <span class="codefrag">StringTokenizer tokenizer = new StringTokenizer(line);</span>
624            </td>
625         
626</tr>
627         
628<tr>
629           
630<td colspan="1" rowspan="1">21.</td>
631            <td colspan="1" rowspan="1">
632              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
633              <span class="codefrag">while (tokenizer.hasMoreTokens()) {</span>
634            </td>
635         
636</tr>
637         
638<tr>
639           
640<td colspan="1" rowspan="1">22.</td>
641            <td colspan="1" rowspan="1">
642              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
643              <span class="codefrag">word.set(tokenizer.nextToken());</span>
644            </td>
645         
646</tr>
647         
648<tr>
649           
650<td colspan="1" rowspan="1">23.</td>
651            <td colspan="1" rowspan="1">
652              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
653              <span class="codefrag">output.collect(word, one);</span>
654            </td>
655         
656</tr>
657         
658<tr>
659           
660<td colspan="1" rowspan="1">24.</td>
661            <td colspan="1" rowspan="1">
662              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
663              <span class="codefrag">}</span>
664            </td>
665         
666</tr>
667         
668<tr>
669           
670<td colspan="1" rowspan="1">25.</td>
671            <td colspan="1" rowspan="1">
672              &nbsp;&nbsp;&nbsp;&nbsp;
673              <span class="codefrag">}</span>
674            </td>
675         
676</tr>
677         
678<tr>
679           
680<td colspan="1" rowspan="1">26.</td>
681            <td colspan="1" rowspan="1">
682              &nbsp;&nbsp;
683              <span class="codefrag">}</span>
684            </td>
685         
686</tr>
687         
688<tr>
689           
690<td colspan="1" rowspan="1">27.</td>
691            <td colspan="1" rowspan="1"></td>
692         
693</tr>
694         
695<tr>
696           
697<td colspan="1" rowspan="1">28.</td>
698            <td colspan="1" rowspan="1">
699              &nbsp;&nbsp;
700              <span class="codefrag">
701                public static class Reduce extends MapReduceBase implements
702                Reducer&lt;Text, IntWritable, Text, IntWritable&gt; {
703              </span>
704            </td>
705         
706</tr>
707         
708<tr>
709           
710<td colspan="1" rowspan="1">29.</td>
711            <td colspan="1" rowspan="1">
712              &nbsp;&nbsp;&nbsp;&nbsp;
713              <span class="codefrag">
714                public void reduce(Text key, Iterator&lt;IntWritable&gt; values,
715                OutputCollector&lt;Text, IntWritable&gt; output,
716                Reporter reporter) throws IOException {
717              </span>
718            </td>
719         
720</tr>
721         
722<tr>
723           
724<td colspan="1" rowspan="1">30.</td>
725            <td colspan="1" rowspan="1">
726              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
727              <span class="codefrag">int sum = 0;</span>
728            </td>
729         
730</tr>
731         
732<tr>
733           
734<td colspan="1" rowspan="1">31.</td>
735            <td colspan="1" rowspan="1">
736              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
737              <span class="codefrag">while (values.hasNext()) {</span>
738            </td>
739         
740</tr>
741         
742<tr>
743           
744<td colspan="1" rowspan="1">32.</td>
745            <td colspan="1" rowspan="1">
746              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
747              <span class="codefrag">sum += values.next().get();</span>
748            </td>
749         
750</tr>
751         
752<tr>
753           
754<td colspan="1" rowspan="1">33.</td>
755            <td colspan="1" rowspan="1">
756              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
757              <span class="codefrag">}</span>
758            </td>
759         
760</tr>
761         
762<tr>
763           
764<td colspan="1" rowspan="1">34.</td>
765            <td colspan="1" rowspan="1">
766              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
767              <span class="codefrag">output.collect(key, new IntWritable(sum));</span>
768            </td>
769         
770</tr>
771         
772<tr>
773           
774<td colspan="1" rowspan="1">35.</td>
775            <td colspan="1" rowspan="1">
776              &nbsp;&nbsp;&nbsp;&nbsp;
777              <span class="codefrag">}</span>
778            </td>
779         
780</tr>
781         
782<tr>
783           
784<td colspan="1" rowspan="1">36.</td>
785            <td colspan="1" rowspan="1">
786              &nbsp;&nbsp;
787              <span class="codefrag">}</span>
788            </td>
789         
790</tr>
791         
792<tr>
793           
794<td colspan="1" rowspan="1">37.</td>
795            <td colspan="1" rowspan="1"></td>
796         
797</tr>
798         
799<tr>
800           
801<td colspan="1" rowspan="1">38.</td>
802            <td colspan="1" rowspan="1">
803              &nbsp;&nbsp;
804              <span class="codefrag">
805                public static void main(String[] args) throws Exception {
806              </span>
807            </td>
808         
809</tr>
810         
811<tr>
812           
813<td colspan="1" rowspan="1">39.</td>
814            <td colspan="1" rowspan="1">
815              &nbsp;&nbsp;&nbsp;&nbsp;
816              <span class="codefrag">
817                JobConf conf = new JobConf(WordCount.class);
818              </span>
819            </td>
820         
821</tr>
822         
823<tr>
824           
825<td colspan="1" rowspan="1">40.</td>
826            <td colspan="1" rowspan="1">
827              &nbsp;&nbsp;&nbsp;&nbsp;
828              <span class="codefrag">conf.setJobName("wordcount");</span>
829            </td>
830         
831</tr>
832         
833<tr>
834           
835<td colspan="1" rowspan="1">41.</td>
836            <td colspan="1" rowspan="1"></td>
837         
838</tr>
839         
840<tr>
841           
842<td colspan="1" rowspan="1">42.</td>
843            <td colspan="1" rowspan="1">
844              &nbsp;&nbsp;&nbsp;&nbsp;
845              <span class="codefrag">conf.setOutputKeyClass(Text.class);</span>
846            </td>
847         
848</tr>
849         
850<tr>
851           
852<td colspan="1" rowspan="1">43.</td>
853            <td colspan="1" rowspan="1">
854              &nbsp;&nbsp;&nbsp;&nbsp;
855              <span class="codefrag">conf.setOutputValueClass(IntWritable.class);</span>
856            </td>
857         
858</tr>
859         
860<tr>
861           
862<td colspan="1" rowspan="1">44.</td>
863            <td colspan="1" rowspan="1"></td>
864         
865</tr>
866         
867<tr>
868           
869<td colspan="1" rowspan="1">45.</td>
870            <td colspan="1" rowspan="1">
871              &nbsp;&nbsp;&nbsp;&nbsp;
872              <span class="codefrag">conf.setMapperClass(Map.class);</span>
873            </td>
874         
875</tr>
876         
877<tr>
878           
879<td colspan="1" rowspan="1">46.</td>
880            <td colspan="1" rowspan="1">
881              &nbsp;&nbsp;&nbsp;&nbsp;
882              <span class="codefrag">conf.setCombinerClass(Reduce.class);</span>
883            </td>
884         
885</tr>
886         
887<tr>
888           
889<td colspan="1" rowspan="1">47.</td>
890            <td colspan="1" rowspan="1">
891              &nbsp;&nbsp;&nbsp;&nbsp;
892              <span class="codefrag">conf.setReducerClass(Reduce.class);</span>
893            </td>
894         
895</tr>
896         
897<tr>
898           
899<td colspan="1" rowspan="1">48.</td>
900            <td colspan="1" rowspan="1"></td>
901         
902</tr>
903         
904<tr>
905           
906<td colspan="1" rowspan="1">49.</td>
907            <td colspan="1" rowspan="1">
908              &nbsp;&nbsp;&nbsp;&nbsp;
909              <span class="codefrag">conf.setInputFormat(TextInputFormat.class);</span>
910            </td>
911         
912</tr>
913         
914<tr>
915           
916<td colspan="1" rowspan="1">50.</td>
917            <td colspan="1" rowspan="1">
918              &nbsp;&nbsp;&nbsp;&nbsp;
919              <span class="codefrag">conf.setOutputFormat(TextOutputFormat.class);</span>
920            </td>
921         
922</tr>
923         
924<tr>
925           
926<td colspan="1" rowspan="1">51.</td>
927            <td colspan="1" rowspan="1"></td>
928         
929</tr>
930         
931<tr>
932           
933<td colspan="1" rowspan="1">52.</td>
934            <td colspan="1" rowspan="1">
935              &nbsp;&nbsp;&nbsp;&nbsp;
936              <span class="codefrag">FileInputFormat.setInputPaths(conf, new Path(args[0]));</span>
937            </td>
938         
939</tr>
940         
941<tr>
942           
943<td colspan="1" rowspan="1">53.</td>
944            <td colspan="1" rowspan="1">
945              &nbsp;&nbsp;&nbsp;&nbsp;
946              <span class="codefrag">FileOutputFormat.setOutputPath(conf, new Path(args[1]));</span>
947            </td>
948         
949</tr>
950         
951<tr>
952           
953<td colspan="1" rowspan="1">54.</td>
954            <td colspan="1" rowspan="1"></td>
955         
956</tr>
957         
958<tr>
959           
960<td colspan="1" rowspan="1">55.</td>
961            <td colspan="1" rowspan="1">
962              &nbsp;&nbsp;&nbsp;&nbsp;
963              <span class="codefrag">JobClient.runJob(conf);</span>
964            </td>
965         
966</tr>
967         
968<tr>
969           
970<td colspan="1" rowspan="1">57.</td>
971            <td colspan="1" rowspan="1">
972              &nbsp;&nbsp;
973              <span class="codefrag">}</span>
974            </td>
975         
976</tr>
977         
978<tr>
979           
980<td colspan="1" rowspan="1">58.</td>
981            <td colspan="1" rowspan="1">
982              <span class="codefrag">}</span>
983            </td>
984         
985</tr>
986         
987<tr>
988           
989<td colspan="1" rowspan="1">59.</td>
990            <td colspan="1" rowspan="1"></td>
991         
992</tr>
993       
994</table>
995<a name="N10463"></a><a name="%E7%94%A8%E6%B3%95"></a>
996<h3 class="h4">甚法</h3>
997<p>假讟环境变量<span class="codefrag">HADOOP_HOME</span>对应安装时的根目圕<span class="codefrag">HADOOP_VERSION</span>对应Hadoop的圓前安装版本猖译<span class="codefrag">WordCount.java</span>来创建jar包可劂䞋操䜜</p>
998<p>
999         
1000<span class="codefrag">$ mkdir wordcount_classes</span>
1001<br>
1002         
1003<span class="codefrag">
1004            $ javac -classpath ${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar
1005              -d wordcount_classes WordCount.java
1006          </span>
1007<br>
1008         
1009<span class="codefrag">$ jar -cvf /usr/joe/wordcount.jar -C wordcount_classes/ .</span> 
1010       
1011</p>
1012<p>假讟</p>
1013<ul>
1014         
1015<li>
1016           
1017<span class="codefrag">/usr/joe/wordcount/input</span>  - 是HDFS䞭的蟓入路埄
1018          </li>
1019         
1020<li>
1021           
1022<span class="codefrag">/usr/joe/wordcount/output</span> - 是HDFS䞭的蟓出路埄
1023          </li>
1024       
1025</ul>
1026<p>甚瀺䟋文本文件做䞺蟓入</p>
1027<p>
1028         
1029<span class="codefrag">$ bin/hadoop dfs -ls /usr/joe/wordcount/input/</span>
1030<br>
1031         
1032<span class="codefrag">/usr/joe/wordcount/input/file01</span>
1033<br>
1034         
1035<span class="codefrag">/usr/joe/wordcount/input/file02</span>
1036<br>
1037         
1038<br>
1039         
1040<span class="codefrag">$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01</span>
1041<br>
1042         
1043<span class="codefrag">Hello World Bye World</span>
1044<br>
1045         
1046<br>
1047         
1048<span class="codefrag">$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02</span>
1049<br>
1050         
1051<span class="codefrag">Hello Hadoop Goodbye Hadoop</span>
1052       
1053</p>
1054<p>运行应甚皋序</p>
1055<p>
1056         
1057<span class="codefrag">
1058            $ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount
1059              /usr/joe/wordcount/input /usr/joe/wordcount/output
1060          </span>
1061       
1062</p>
1063<p>蟓出是</p>
1064<p>
1065         
1066<span class="codefrag">
1067            $ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000
1068          </span>
1069         
1070<br>
1071         
1072<span class="codefrag">Bye    1</span>
1073<br>
1074         
1075<span class="codefrag">Goodbye    1</span>
1076<br>
1077         
1078<span class="codefrag">Hadoop    2</span>
1079<br>
1080         
1081<span class="codefrag">Hello    2</span>
1082<br>
1083         
1084<span class="codefrag">World    2</span>
1085<br>
1086       
1087</p>
1088<p> åº”甚皋序胜借䜿甚<span class="codefrag">-files</span>选项来指定䞀䞪由逗号分隔的路埄列衚这些路埄是task的圓前工䜜目圕。䜿甚选项<span class="codefrag">-libjars</span>可以向map和reduce的classpath䞭添加jar包。䜿甚<span class="codefrag">-archives</span>选项皋序可以䌠递档案文件做䞺参数这些档案文件䌚被解压并䞔圚task的圓前工䜜目圕䞋䌚创建䞀䞪指向解压生成的目圕的笊号铟接以压猩包的名字呜名。
1089        有关呜什行选项的曎倚细节请参考
1090        <a href="commands_manual.html">Commands manual</a>。</p>
1091<p>䜿甚<span class="codefrag">-libjars</span>和<span class="codefrag">-files</span>运行<span class="codefrag">wordcount</span>䟋子<br>
1092       
1093<span class="codefrag"> hadoop jar hadoop-examples.jar wordcount -files cachefile.txt
1094        -libjars mylib.jar input output </span>
1095       
1096</p>
1097<a name="N10504"></a><a name="%E8%A7%A3%E9%87%8A"></a>
1098<h3 class="h4">解释</h3>
1099<p>
1100<span class="codefrag">WordCount</span>应甚皋序非垞盎截了圓。</p>
1101<p>
1102<span class="codefrag">Mapper</span>(14-26行)侭的<span class="codefrag">map</span>方法(18-25行)通过指定的
1103        <span class="codefrag">TextInputFormat</span>(49行)䞀次倄理䞀行。然后它通过<span class="codefrag">StringTokenizer</span>
1104        以空栌䞺分隔笊将䞀行切分䞺若干tokens之后蟓出<span class="codefrag">&lt; &lt;word&gt;, 1&gt;</span>
1105        圢匏的键倌对。</p>
1106<p>
1107        对于瀺䟋䞭的第䞀䞪蟓入map蟓出是<br>
1108         
1109<span class="codefrag">&lt; Hello, 1&gt;</span>
1110<br>
1111         
1112<span class="codefrag">&lt; World, 1&gt;</span>
1113<br>
1114         
1115<span class="codefrag">&lt; Bye, 1&gt;</span>
1116<br>
1117         
1118<span class="codefrag">&lt; World, 1&gt;</span>
1119<br>
1120       
1121</p>
1122<p>
1123          第二䞪蟓入map蟓出是<br>
1124         
1125<span class="codefrag">&lt; Hello, 1&gt;</span>
1126<br>
1127         
1128<span class="codefrag">&lt; Hadoop, 1&gt;</span>
1129<br>
1130         
1131<span class="codefrag">&lt; Goodbye, 1&gt;</span>
1132<br>
1133         
1134<span class="codefrag">&lt; Hadoop, 1&gt;</span>
1135<br>
1136       
1137</p>
1138<p>关于组成䞀䞪指定䜜䞚的map数目的确定以及劂䜕以曎粟细的方匏去控制这些map我们将圚教皋的后续郚分孊习到曎倚的内容。</p>
1139<p>
1140<span class="codefrag">WordCount</span>还指定了䞀䞪<span class="codefrag">combiner</span> (46行)。因歀每次map运行之后䌚对蟓出按照<em>key</em>进行排序然后把蟓出䌠递给本地的combiner按照䜜䞚的配眮䞎Reducer䞀样进行本地聚合。</p>
1141<p>
1142         ç¬¬äž€äžªmap的蟓出是<br>
1143         
1144<span class="codefrag">&lt; Bye, 1&gt;</span>
1145<br>
1146         
1147<span class="codefrag">&lt; Hello, 1&gt;</span>
1148<br>
1149         
1150<span class="codefrag">&lt; World, 2&gt;</span>
1151<br>
1152       
1153</p>
1154<p>
1155          第二䞪map的蟓出是<br>
1156         
1157<span class="codefrag">&lt; Goodbye, 1&gt;</span>
1158<br>
1159         
1160<span class="codefrag">&lt; Hadoop, 2&gt;</span>
1161<br>
1162         
1163<span class="codefrag">&lt; Hello, 1&gt;</span>
1164<br>
1165       
1166</p>
1167<p>
1168<span class="codefrag">Reducer</span>(28-36行)侭的<span class="codefrag">reduce</span>方法(29-35行)
1169        仅是将每䞪key本䟋䞭就是单词出现的次数求和。
1170        </p>
1171<p>
1172          因歀这䞪䜜䞚的蟓出就是<br>
1173         
1174<span class="codefrag">&lt; Bye, 1&gt;</span>
1175<br>
1176         
1177<span class="codefrag">&lt; Goodbye, 1&gt;</span>
1178<br>
1179         
1180<span class="codefrag">&lt; Hadoop, 2&gt;</span>
1181<br>
1182         
1183<span class="codefrag">&lt; Hello, 2&gt;</span>
1184<br>
1185         
1186<span class="codefrag">&lt; World, 2&gt;</span>
1187<br>
1188       
1189</p>
1190<p>代码䞭的<span class="codefrag">run</span>方法䞭指定了䜜䞚的几䞪方面
1191        䟋劂通过呜什行䌠递过来的蟓入/蟓出路埄、key/value的类型、蟓入/蟓出的栌匏等等<span class="codefrag">JobConf</span>䞭的配眮信息。随后皋序调甚了<span class="codefrag">JobClient.runJob</span>(55行)来提亀䜜䞚并䞔监控它的执行。</p>
1192<p>我们将圚本教皋的后续郚分孊习曎倚的关于<span class="codefrag">JobConf</span> <span class="codefrag">JobClient</span>
1193        <span class="codefrag">Tool</span>和其他接口及类(class)。</p>
1194</div>
1195   
1196   
1197<a name="N105B5"></a><a name="Map%2FReduce+-+%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2"></a>
1198<h2 class="h3">Map/Reduce - 甚户界面</h2>
1199<div class="section">
1200<p>这郚分文档䞺甚户将䌚面䞎的Map/Reduce框架䞭的各䞪环节提䟛了适圓的细节。这应该䌚垮助甚户曎细粒床地去实现、配眮和调䌘䜜䞚。然而请泚意每䞪类/接口的javadoc文档提䟛最党面的文档本文只是想起到指南的䜜甚。
1201      </p>
1202<p>我们䌚先看看<span class="codefrag">Mapper</span>和<span class="codefrag">Reducer</span>接口。应甚皋序通垞䌚通过提䟛<span class="codefrag">map</span>和<span class="codefrag">reduce</span>方法来实现它们。
1203      </p>
1204<p>然后我们䌚讚论其他的栞心接口其䞭包括
1205      <span class="codefrag">JobConf</span><span class="codefrag">JobClient</span><span class="codefrag">Partitioner</span>
1206      <span class="codefrag">OutputCollector</span><span class="codefrag">Reporter</span>
1207      <span class="codefrag">InputFormat</span><span class="codefrag">OutputFormat</span>等等。</p>
1208<p>最后我们将通过讚论框架䞭䞀些有甚的功胜点䟋劂<span class="codefrag">DistributedCache</span>
1209      <span class="codefrag">IsolationRunner</span>等等来收尟。</p>
1210<a name="N105EE"></a><a name="%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%E6%8F%8F%E8%BF%B0"></a>
1211<h3 class="h4">栞心功胜描述</h3>
1212<p>应甚皋序通垞䌚通过提䟛<span class="codefrag">map</span>和<span class="codefrag">reduce</span>来实现
1213        <span class="codefrag">Mapper</span>和<span class="codefrag">Reducer</span>接口它们组成䜜䞚的栞心。</p>
1214<a name="N10603"></a><a name="Mapper"></a>
1215<h4>Mapper</h4>
1216<p>
1217<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Mapper.html">
1218          Mapper</a>将蟓入键倌对(key/value pair)映射到䞀组䞭闎栌匏的键倌对集合。</p>
1219<p>Map是䞀类将蟓入记圕集蜬换䞺䞭闎栌匏记圕集的独立任务。
1220          这种蜬换的䞭闎栌匏记圕集䞍需芁䞎蟓入记圕集的类型䞀臎。䞀䞪给定的蟓入键倌对可以映射成0䞪或倚䞪蟓出键倌对。</p>
1221<p>Hadoop Map/Reduce框架䞺每䞀䞪<span class="codefrag">InputSplit</span>产生䞀䞪map任务而每䞪<span class="codefrag">InputSplit</span>是由该䜜䞚的<span class="codefrag">InputFormat</span>产生的。</p>
1222<p>抂括地诎对<span class="codefrag">Mapper</span>的实现者需芁重写
1223          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConfigurable.html#configure(org.apache.hadoop.mapred.JobConf)">
1224                  JobConfigurable.configure(JobConf)</a>方法这䞪方法需芁䌠递䞀䞪<span class="codefrag">JobConf</span>参数目的是完成Mapper的初始化工䜜。然后框架䞺这䞪任务的<span class="codefrag">InputSplit</span>䞭每䞪键倌对调甚䞀次
1225          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Mapper.html#map(K1, V1, org.apache.hadoop.mapred.OutputCollector, org.apache.hadoop.mapred.Reporter)">
1226                  map(WritableComparable, Writable, OutputCollector, Reporter)</a>操䜜。应甚皋序可以通过重写<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/Closeable.html#close()">Closeable.close()</a>方法来执行盞应的枅理工䜜。</p>
1227<p>蟓出键倌对䞍需芁䞎蟓入键倌对的类型䞀臎。䞀䞪给定的蟓入键倌对可以映射成0䞪或倚䞪蟓出键倌对。通过调甚<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/OutputCollector.html#collect(K, V)">
1228          OutputCollector.collect(WritableComparable,Writable)</a>可以收集蟓出的键倌对。</p>
1229<p>应甚皋序可以䜿甚<span class="codefrag">Reporter</span>报告进床讟定应甚级别的状态消息曎新<span class="codefrag">Counters</span>计数噚或者仅是衚明自己运行正垞。</p>
1230<p>框架随后䌚把䞎䞀䞪特定key关联的所有䞭闎过皋的倌value分成组然后把它们䌠给<span class="codefrag">Reducer</span>以产出最终的结果。甚户可以通过
1231          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setOutputKeyComparatorClass(java.lang.Class)">
1232          JobConf.setOutputKeyComparatorClass(Class)</a>来指定具䜓莟莣分组的
1233          <span class="codefrag">Comparator</span>。</p>
1234<p>
1235<span class="codefrag">Mapper</span>的蟓出被排序后就被划分给每䞪<span class="codefrag">Reducer</span>。分块的总数目和䞀䞪䜜䞚的reduce任务的数目是䞀样的。甚户可以通过实现自定义的          <span class="codefrag">Partitioner</span>来控制哪䞪key被分配给哪䞪 <span class="codefrag">Reducer</span>。</p>
1236<p>甚户可选择通过<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setCombinerClass(java.lang.Class)">
1237          JobConf.setCombinerClass(Class)</a>指定䞀䞪<span class="codefrag">combiner</span>它莟莣对䞭闎过皋的蟓出进行本地的聚集这䌚有助于降䜎从<span class="codefrag">Mapper</span>到
1238          <span class="codefrag">Reducer</span>数据䌠蟓量。
1239          </p>
1240<p>这些被排奜序的䞭闎过皋的蟓出结果保存的栌匏是(key-len, key, value-len, value)应甚皋序可以通过<span class="codefrag">JobConf</span>控制对这些䞭闎结果是吊进行压猩以及怎么压猩䜿甚哪种<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/compress/CompressionCodec.html">
1241          CompressionCodec</a>。
1242          </p>
1243<a name="N1067B"></a><a name="%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E4%B8%AAMap%EF%BC%9F"></a>
1244<h5>需芁倚少䞪Map</h5>
1245<p>Map的数目通垞是由蟓入数据的倧小决定的䞀般就是所有蟓入文件的总块block数。</p>
1246<p>Map正垞的并行规暡倧臎是每䞪节点node倧纊10到100䞪map对于CPU
1247            消耗蟃小的map任务可以讟到300䞪巊右。由于每䞪任务初始化需芁䞀定的时闎因歀比蟃合理的情况是map执行的时闎至少超过1分钟。</p>
1248<p>这样劂果䜠蟓入10TB的数据每䞪块block的倧小是128MB䜠将需芁倧纊82,000䞪map来完成任务陀非䜿甚
1249            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setNumMapTasks(int)">
1250            setNumMapTasks(int)</a>泚意这里仅仅是对框架进行了䞀䞪提瀺(hint)实际决定因玠见<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setNumMapTasks(int)">这里</a>将这䞪数倌讟眮埗曎高。</p>
1251<a name="N10694"></a><a name="Reducer"></a>
1252<h4>Reducer</h4>
1253<p>
1254<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reducer.html">
1255          Reducer</a>将䞎䞀䞪key关联的䞀组䞭闎数倌集園纊reduce䞺䞀䞪曎小的数倌集。</p>
1256<p>甚户可以通过<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setNumReduceTasks(int)">
1257          JobConf.setNumReduceTasks(int)</a>讟定䞀䞪䜜䞚䞭reduce任务的数目。</p>
1258<p>抂括地诎对<span class="codefrag">Reducer</span>的实现者需芁重写
1259          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConfigurable.html#configure(org.apache.hadoop.mapred.JobConf)">
1260          JobConfigurable.configure(JobConf)</a>方法这䞪方法需芁䌠递䞀䞪<span class="codefrag">JobConf</span>参数目的是完成Reducer的初始化工䜜。然后框架䞺成组的蟓入数据䞭的每䞪<span class="codefrag">&lt;key, (list of values)&gt;</span>对调甚䞀次
1261          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reducer.html#reduce(K2, java.util.Iterator, org.apache.hadoop.mapred.OutputCollector, org.apache.hadoop.mapred.Reporter)">
1262          reduce(WritableComparable, Iterator, OutputCollector, Reporter)</a>方法。之后应甚皋序可以通过重写<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/Closeable.html#close()">Closeable.close()</a>来执行盞应的枅理工䜜。</p>
1263<p>
1264<span class="codefrag">Reducer</span>有3䞪䞻芁阶段shuffle、sort和reduce。
1265          </p>
1266<a name="N106C4"></a><a name="Shuffle"></a>
1267<h5>Shuffle</h5>
1268<p>
1269<span class="codefrag">Reducer</span>的蟓入就是Mapper已经排奜序的蟓出。圚这䞪阶段框架通过HTTP䞺每䞪Reducer获埗所有Mapper蟓出䞭䞎之盞关的分块。</p>
1270<a name="N106D0"></a><a name="Sort"></a>
1271<h5>Sort</h5>
1272<p>这䞪阶段框架将按照key的倌对<span class="codefrag">Reducer</span>的蟓入进行分组
1273            因䞺䞍同mapper的蟓出䞭可胜䌚有盞同的key。</p>
1274<p>Shuffle和Sort䞀䞪阶段是同时进行的map的蟓出也是䞀蟹被取回䞀蟹被合并的。</p>
1275<a name="N106DF"></a><a name="Secondary+Sort"></a>
1276<h5>Secondary Sort</h5>
1277<p>劂果需芁䞭闎过皋对key的分组规则和reduce前对key的分组规则䞍同那么可以通过<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setOutputValueGroupingComparator(java.lang.Class)">
1278              JobConf.setOutputValueGroupingComparator(Class)</a>来指定䞀䞪<span class="codefrag">Comparator</span>。再加䞊
1279              <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setOutputKeyComparatorClass(java.lang.Class)">
1280              JobConf.setOutputKeyComparatorClass(Class)</a>可甚于控制䞭闎过皋的key劂䜕被分组所以结合䞀者可以实现<em>按倌的二次排序</em>。
1281              </p>
1282<a name="N106F8"></a><a name="Reduce"></a>
1283<h5>Reduce</h5>
1284<p>圚这䞪阶段框架䞺已分组的蟓入数据䞭的每䞪
1285          <span class="codefrag">&lt;key, (list of values)&gt;</span>对调甚䞀次
1286          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reducer.html#reduce(K2, java.util.Iterator, org.apache.hadoop.mapred.OutputCollector, org.apache.hadoop.mapred.Reporter)">
1287          reduce(WritableComparable, Iterator, OutputCollector, Reporter)</a>方法。</p>
1288<p>Reduce任务的蟓出通垞是通过调甚
1289            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/OutputCollector.html#collect(K, V)">
1290            OutputCollector.collect(WritableComparable, Writable)</a>写入
1291            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/fs/FileSystem.html">
1292            文件系统</a>的。</p>
1293<p>应甚皋序可以䜿甚<span class="codefrag">Reporter</span>报告进床讟定应甚皋序级别的状态消息曎新<span class="codefrag">Counters</span>计数噚或者仅是衚明自己运行正垞。</p>
1294<p>
1295<span class="codefrag">Reducer</span>的蟓出是<em>没有排序的</em>。</p>
1296<a name="N10725"></a><a name="%E9%9C%80%E8%A6%81%E5%A4%9A%E5%B0%91%E4%B8%AAReduce%EF%BC%9F"></a>
1297<h5>需芁倚少䞪Reduce</h5>
1298<p>Reduce的数目建议是<span class="codefrag">0.95</span>或<span class="codefrag">1.75</span>乘以
1299            (&lt;<em>no. of nodes</em>&gt; *
1300            <span class="codefrag">mapred.tasktracker.reduce.tasks.maximum</span>)。
1301            </p>
1302<p>甹0.95所有reduce可以圚maps䞀完成时就立刻启劚匀始䌠蟓map的蟓出结果。甚1.75速床快的节点可以圚完成第䞀蜮reduce任务后可以匀始第二蜮这样可以埗到比蟃奜的莟蜜均衡的效果。</p>
1303<p>增加reduce的数目䌚增加敎䞪框架的匀销䜆可以改善莟蜜均衡降䜎由于执行倱莥垊来的莟面圱响。</p>
1304<p>䞊述比䟋因子比敎䜓数目皍小䞀些是䞺了给框架䞭的掚测性任务speculative-tasks
1305            或倱莥的任务预留䞀些reduce的资源。</p>
1306<a name="N10744"></a><a name="%E6%97%A0Reducer"></a>
1307<h5>无Reducer</h5>
1308<p>劂果没有園纊芁进行那么讟眮reduce任务的数目䞺<em>零</em>是合法的。</p>
1309<p>这种情况䞋map任务的蟓出䌚盎接被写入由
1310            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#setOutputPath(org.apache.hadoop.mapred.JobConf,%20org.apache.hadoop.fs.Path)">
1311                    setOutputPath(Path)</a>指定的蟓出路埄。框架圚把它们写入<span class="codefrag">FileSystem</span>之前没有对它们进行排序。
1312            </p>
1313<a name="N1075C"></a><a name="Partitioner"></a>
1314<h4>Partitioner</h4>
1315<p>
1316<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Partitioner.html">
1317          Partitioner</a>甚于划分键倌空闎key space。</p>
1318<p>Partitioner莟莣控制map蟓出结果key的分割。Key或者䞀䞪key子集被甚于产生分区通垞䜿甚的是Hash凜数。分区的数目䞎䞀䞪䜜䞚的reduce任务的数目是䞀样的。因歀它控制将䞭闎过皋的key也就是这条记圕应该发送给<span class="codefrag">m</span>䞪reduce任务䞭的哪䞀䞪来进行reduce操䜜。
1319          </p>
1320<p>
1321<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/lib/HashPartitioner.html">
1322          HashPartitioner</a>是默讀的 <span class="codefrag">Partitioner</span>。  </p>
1323<a name="N10778"></a><a name="Reporter"></a>
1324<h4>Reporter</h4>
1325<p>
1326<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reporter.html">
1327          Reporter</a>是甚于Map/Reduce应甚皋序报告进床讟定应甚级别的状态消息
1328          曎新<span class="codefrag">Counters</span>计数噚的机制。</p>
1329<p>
1330<span class="codefrag">Mapper</span>和<span class="codefrag">Reducer</span>的实现可以利甚<span class="codefrag">Reporter</span>
1331          来报告进床或者仅是衚明自己运行正垞。圚那种应甚皋序需芁花埈长时闎倄理䞪别键倌对的场景䞭这种机制是埈关键的因䞺框架可胜䌚以䞺这䞪任务超时了从而将它区行杀死。及䞀䞪避免这种情况发生的方匏是将配眮参数<span class="codefrag">mapred.task.timeout</span>讟眮䞺䞀䞪足借高的倌或者干脆讟眮䞺零则没有超时限制了。
1332          </p>
1333<p>应甚皋序可以甚<span class="codefrag">Reporter</span>来曎新<span class="codefrag">Counter</span>计数噚。
1334          </p>
1335<a name="N1079F"></a><a name="OutputCollector"></a>
1336<h4>OutputCollector</h4>
1337<p>
1338<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/OutputCollector.html">
1339          OutputCollector</a>是䞀䞪Map/Reduce框架提䟛的甚于收集
1340          <span class="codefrag">Mapper</span>或<span class="codefrag">Reducer</span>蟓出数据的通甚机制
1341          包括䞭闎蟓出结果和䜜䞚的蟓出结果。</p>
1342<p>Hadoop Map/Reduce框架附垊了䞀䞪包含讞倚实甚型的mapper、reducer和partitioner
1343        的<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/lib/package-summary.html">类库</a>。</p>
1344<a name="N107BA"></a><a name="%E4%BD%9C%E4%B8%9A%E9%85%8D%E7%BD%AE"></a>
1345<h3 class="h4">䜜䞚配眮</h3>
1346<p>
1347<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html">
1348        JobConf</a>代衚䞀䞪Map/Reduce䜜䞚的配眮。</p>
1349<p>
1350<span class="codefrag">JobConf</span>是甚户向Hadoop框架描述䞀䞪Map/Reduce䜜䞚劂䜕执行的䞻芁接口。框架䌚按照<span class="codefrag">JobConf</span>描述的信息忠实地去尝试完成这䞪䜜䞚然而</p>
1351<ul>
1352         
1353<li>
1354            䞀些参数可胜䌚被管理者标记䞺<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/conf/Configuration.html#FinalParams">
1355            final</a>这意味它们䞍胜被曎改。
1356          </li>
1357         
1358<li>
1359          䞀些䜜䞚的参数可以被盎截了圓地进行讟眮䟋劂
1360          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setNumReduceTasks(int)">
1361            setNumReduceTasks(int)</a>而及䞀些参数则䞎框架或者䜜䞚的其他参数之闎埮劙地盞互圱响并䞔讟眮起来比蟃倍杂䟋劂<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setNumMapTasks(int)">
1362            setNumMapTasks(int)</a>。
1363          </li>
1364       
1365</ul>
1366<p>通垞<span class="codefrag">JobConf</span>䌚指明<span class="codefrag">Mapper</span>、Combiner(劂果有的话)、
1367        <span class="codefrag">Partitioner</span>、<span class="codefrag">Reducer</span>、<span class="codefrag">InputFormat</span>和
1368        <span class="codefrag">OutputFormat</span>的具䜓实现。<span class="codefrag">JobConf</span>还胜指定䞀组蟓入文件
1369        (<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileInputFormat.html#setInputPaths(org.apache.hadoop.mapred.JobConf,%20org.apache.hadoop.fs.Path[])">setInputPaths(JobConf, Path...)</a>
1370        /<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileInputFormat.html#addInputPath(org.apache.hadoop.mapred.JobConf,%20org.apache.hadoop.fs.Path)">addInputPath(JobConf, Path)</a>)
1371        和(<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileInputFormat.html#setInputPaths(org.apache.hadoop.mapred.JobConf,%20java.lang.String)">setInputPaths(JobConf, String)</a>
1372        /<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileInputFormat.html#addInputPath(org.apache.hadoop.mapred.JobConf,%20java.lang.String)">addInputPaths(JobConf, String)</a>)
1373        以及蟓出文件应该写圚哪儿
1374        (<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#setOutputPath(org.apache.hadoop.mapred.JobConf,%20org.apache.hadoop.fs.Path)">setOutputPath(Path)</a>)。</p>
1375<p>
1376<span class="codefrag">JobConf</span>可选择地对䜜䞚讟眮䞀些高级选项䟋劂讟眮<span class="codefrag">Comparator</span>
1377        攟到<span class="codefrag">DistributedCache</span>䞊的文件䞭闎结果或者䜜䞚蟓出结果是吊需芁压猩以及怎么压猩
1378        利甚甚户提䟛的脚本(<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMapDebugScript(java.lang.String)">setMapDebugScript(String)</a>/<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setReduceDebugScript(java.lang.String)">setReduceDebugScript(String)</a>)     
1379        进行调试䜜䞚是吊允讞<em>预防性speculative</em>任务的执行
1380        (<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMapSpeculativeExecution(boolean)">setMapSpeculativeExecution(boolean)</a>)/(<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setReduceSpeculativeExecution(boolean)">setReduceSpeculativeExecution(boolean)</a>)
1381        每䞪任务最倧的尝试次数
1382        (<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMaxMapAttempts(int)">setMaxMapAttempts(int)</a>/<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMaxReduceAttempts(int)">setMaxReduceAttempts(int)</a>)
1383        䞀䞪䜜䞚胜容忍的任务倱莥的癟分比
1384        (<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMaxMapTaskFailuresPercent(int)">setMaxMapTaskFailuresPercent(int)</a>/<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMaxReduceTaskFailuresPercent(int)">setMaxReduceTaskFailuresPercent(int)</a>)
1385        等等。</p>
1386<p>圓然甚户胜䜿甚
1387        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/conf/Configuration.html#set(java.lang.String, java.lang.String)">set(String, String)</a>/<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/conf/Configuration.html#get(java.lang.String, java.lang.String)">get(String, String)</a>
1388        来讟眮或者取埗应甚皋序需芁的任意参数。然而<span class="codefrag">DistributedCache</span>的䜿甚是面向倧规暡只读数据的。</p>
1389<a name="N1084C"></a><a name="%E4%BB%BB%E5%8A%A1%E7%9A%84%E6%89%A7%E8%A1%8C%E5%92%8C%E7%8E%AF%E5%A2%83"></a>
1390<h3 class="h4">任务的执行和环境</h3>
1391<p>
1392<span class="codefrag">TaskTracker</span>是圚䞀䞪单独的jvm䞊以子进皋的圢匏执行
1393        <span class="codefrag">Mapper</span>/<span class="codefrag">Reducer</span>任务Task的。
1394        </p>
1395<p>子任务䌚继承父<span class="codefrag">TaskTracker</span>的环境。甚户可以通过JobConf侭的
1396        <span class="codefrag">mapred.child.java.opts</span>配眮参数来讟定子jvm䞊的附加选项䟋劂
1397        通过<span class="codefrag">-Djava.library.path=&lt;&gt;</span> å°†äž€äžªéžæ ‡å‡†è·¯åŸ„讟䞺运行时的铟接甚以搜玢共享库等等。劂果<span class="codefrag">mapred.child.java.opts</span>包含䞀䞪笊号<em>@taskid@</em>
1398        它䌚被替换成map/reduce的taskid的倌。</p>
1399<p>䞋面是䞀䞪包含倚䞪参数和替换的䟋子其䞭包括记圕jvm GC日志
1400        JVM JMX代理皋序以无密码的方匏启劚这样它就胜连接到jconsole䞊从而可以查看子进皋的内存和线皋埗到线皋的dump还把子jvm的最倧堆尺寞讟眮䞺512MB
1401        并䞺子jvm的<span class="codefrag">java.library.path</span>添加了䞀䞪附加路埄。</p>
1402<p>
1403         
1404<span class="codefrag">&lt;property&gt;</span>
1405<br>
1406          &nbsp;&nbsp;<span class="codefrag">&lt;name&gt;mapred.child.java.opts&lt;/name&gt;</span>
1407<br>
1408          &nbsp;&nbsp;<span class="codefrag">&lt;value&gt;</span>
1409<br>
1410          &nbsp;&nbsp;&nbsp;&nbsp;<span class="codefrag">
1411                    -Xmx512M -Djava.library.path=/home/mycompany/lib
1412                    -verbose:gc -Xloggc:/tmp/@taskid@.gc</span>
1413<br>
1414          &nbsp;&nbsp;&nbsp;&nbsp;<span class="codefrag">
1415                    -Dcom.sun.management.jmxremote.authenticate=false
1416                    -Dcom.sun.management.jmxremote.ssl=false</span>
1417<br>
1418          &nbsp;&nbsp;<span class="codefrag">&lt;/value&gt;</span>
1419<br>
1420         
1421<span class="codefrag">&lt;/property&gt;</span>
1422       
1423</p>
1424<p>甚户或管理员也可以䜿甚<span class="codefrag">mapred.child.ulimit</span>讟定运行的子任务的最倧虚拟内存。<span class="codefrag">mapred.child.ulimit</span>的倌以KB)䞺单䜍并䞔必须倧于或等于-Xmx参数䌠给JavaVM的倌吊则VM䌚无法启劚。</p>
1425<p>泚意<span class="codefrag">mapred.child.java.opts</span>只甚于讟眮task tracker启劚的子任务。䞺守技进皋讟眮内存选项请查看
1426        <a href="cluster_setup.html#%E9%85%8D%E7%BD%AEHadoop%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E7%9A%84%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83">
1427        cluster_setup.html </a>
1428</p>
1429<p>
1430<span class="codefrag"> ${mapred.local.dir}/taskTracker/</span>是task tracker的本地目圕
1431        甚于创建本地猓存和job。它可以指定倚䞪目圕跚越倚䞪磁盘文件䌚半随机的保存到本地路埄䞋的某䞪目圕。圓job启劚时task tracker根据配眮文档创建本地job目圕目圕结构劂以䞋所瀺</p>
1432<ul>
1433       
1434<li>
1435<span class="codefrag">${mapred.local.dir}/taskTracker/archive/</span> :分垃匏猓存。这䞪目圕保存本地的分垃匏猓存。因歀本地分垃匏猓存是圚所有task和job闎共享的。</li>
1436       
1437<li>
1438<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/</span> :
1439        本地job目圕。
1440        <ul>
1441       
1442<li>
1443<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/work/</span>:
1444        job指定的共享目圕。各䞪任务可以䜿甚这䞪空闎做䞺暂存空闎甚于它们之闎共享文件。这䞪目圕通过<span class="codefrag">job.local.dir </span>参数暎露给甚户。这䞪路埄可以通过API <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#getJobLocalDir()">
1445        JobConf.getJobLocalDir()</a>来访问。它也可以被做䞺系统属性获埗。因歀甚户比劂运行streaming可以调甚<span class="codefrag">System.getProperty("job.local.dir")</span>获埗该目圕。
1446        </li>
1447       
1448<li>
1449<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/jars/</span>:
1450        存攟jar包的路埄甚于存攟䜜䞚的jar文件和展匀的jar。<span class="codefrag">job.jar</span>是应甚皋序的jar文件它䌚被自劚分发到各台机噚圚task启劚前䌚被自劚展匀。䜿甚api
1451        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#getJar()">
1452        JobConf.getJar() </a>凜数可以埗到job.jar的䜍眮。䜿甚JobConf.getJar().getParent()可以访问存攟展匀的jar包的目圕。
1453        </li>
1454       
1455<li>
1456<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/job.xml</span>
1457        䞀䞪job.xml文件本地的通甚的䜜䞚配眮文件。
1458        </li>
1459       
1460<li>
1461<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid</span>
1462        每䞪任务有䞀䞪目圕<span class="codefrag">task-id</span>它里面有劂䞋的目圕结构
1463        <ul>
1464       
1465<li>
1466<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/job.xml</span>
1467       äž€äžªjob.xml文件本地化的任务䜜䞚配眮文件。任务本地化是指䞺该task讟定特定的属性倌。这些倌䌚圚䞋面具䜓诎明。
1468        </li>
1469       
1470<li>
1471<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/output</span>
1472        䞀䞪存攟䞭闎过皋的蟓出文件的目圕。它保存了由framwork产生的䞎时map reduce数据比劂map的蟓出文件等。</li>
1473       
1474<li>
1475<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/work</span>
1476        task的圓前工䜜目圕。</li>
1477       
1478<li>
1479<span class="codefrag">${mapred.local.dir}/taskTracker/jobcache/$jobid/$taskid/work/tmp</span>
1480        task的䞎时目圕。甚户可以讟定属性<span class="codefrag">mapred.child.tmp</span>
1481        来䞺map和reduce task讟定䞎时目圕。猺省倌是<span class="codefrag">./tmp</span>。劂果这䞪倌䞍是绝对路埄
1482        它䌚把task的工䜜路埄加到该路埄前面䜜䞺task的䞎时文件路埄。劂果这䞪倌是绝对路埄则盎接䜿甚这䞪倌。
1483        劂果指定的目圕䞍存圚䌚自劚创建该目圕。之后按照选项
1484        <span class="codefrag">-Djava.io.tmpdir='䞎时文件的绝对路埄'</span>执行java子任务。
1485        pipes和streaming的䞎时文件路埄是通过环境变量<span class="codefrag">TMPDIR='the absolute path of the tmp dir'</span>讟定的。
1486        劂果<span class="codefrag">mapred.child.tmp</span>有<span class="codefrag">./tmp</span>倌这䞪目圕䌚被创建。</li>
1487       
1488</ul>
1489       
1490</li>
1491       
1492</ul>
1493       
1494</li>
1495       
1496</ul>
1497<p>䞋面的属性是䞺每䞪task执行时䜿甚的本地参数它们保存圚本地化的任务䜜䞚配眮文件里</p>
1498<table class="ForrestTable" cellspacing="1" cellpadding="4">
1499         
1500<tr>
1501<th colspan="1" rowspan="1">名称</th><th colspan="1" rowspan="1">类型</th><th colspan="1" rowspan="1">描述</th>
1502</tr>
1503         
1504<tr>
1505<td colspan="1" rowspan="1">mapred.job.id</td><td colspan="1" rowspan="1">String</td><td colspan="1" rowspan="1">job id</td>
1506</tr>
1507         
1508<tr>
1509<td colspan="1" rowspan="1">mapred.jar</td><td colspan="1" rowspan="1">String</td>
1510              <td colspan="1" rowspan="1">job目圕䞋job.jar的䜍眮</td>
1511</tr>
1512         
1513<tr>
1514<td colspan="1" rowspan="1">job.local.dir</td><td colspan="1" rowspan="1"> String</td>
1515              <td colspan="1" rowspan="1">job指定的共享存傚空闎</td>
1516</tr>
1517         
1518<tr>
1519<td colspan="1" rowspan="1">mapred.tip.id</td><td colspan="1" rowspan="1"> String</td>
1520              <td colspan="1" rowspan="1"> task id</td>
1521</tr>
1522         
1523<tr>
1524<td colspan="1" rowspan="1">mapred.task.id</td><td colspan="1" rowspan="1"> String</td>
1525              <td colspan="1" rowspan="1"> task尝试id</td>
1526</tr>
1527         
1528<tr>
1529<td colspan="1" rowspan="1">mapred.task.is.map</td><td colspan="1" rowspan="1"> boolean </td>
1530              <td colspan="1" rowspan="1">是吊是map task</td>
1531</tr>
1532         
1533<tr>
1534<td colspan="1" rowspan="1">mapred.task.partition</td><td colspan="1" rowspan="1"> int </td>
1535              <td colspan="1" rowspan="1">task圚job侭的id</td>
1536</tr>
1537         
1538<tr>
1539<td colspan="1" rowspan="1">map.input.file</td><td colspan="1" rowspan="1"> String</td>
1540              <td colspan="1" rowspan="1"> map读取的文件名</td>
1541</tr>
1542         
1543<tr>
1544<td colspan="1" rowspan="1">map.input.start</td><td colspan="1" rowspan="1"> long</td>
1545              <td colspan="1" rowspan="1"> map蟓入的数据块的起始䜍眮偏移</td>
1546</tr>
1547         
1548<tr>
1549<td colspan="1" rowspan="1">map.input.length </td><td colspan="1" rowspan="1">long </td>
1550              <td colspan="1" rowspan="1">map蟓入的数据块的字节数</td>
1551</tr>
1552         
1553<tr>
1554<td colspan="1" rowspan="1">mapred.work.output.dir</td><td colspan="1" rowspan="1"> String </td>
1555              <td colspan="1" rowspan="1">task䞎时蟓出目圕</td>
1556</tr>
1557       
1558</table>
1559<p>task的标准蟓出和错误蟓出流䌚被读到TaskTracker䞭并䞔记圕到
1560        <span class="codefrag">${HADOOP_LOG_DIR}/userlogs</span>
1561</p>
1562<p>
1563<a href="#DistributedCache">DistributedCache</a>
1564        可甚于map或reduce task䞭分发jar包和本地库。子jvm总是把
1565        <em>圓前工䜜目圕</em> åŠ åˆ°
1566        <span class="codefrag">java.library.path</span> å’Œ <span class="codefrag">LD_LIBRARY_PATH</span>。
1567        因歀可以通过
1568        <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#loadLibrary(java.lang.String)">
1569        System.loadLibrary</a>或
1570        <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#load(java.lang.String)">
1571        System.load</a>装蜜猓存的库。有关䜿甚分垃匏猓存加蜜共享库的细节请参考
1572        <a href="native_libraries.html#%E4%BD%BF%E7%94%A8DistributedCache+%E5%8A%A0%E8%BD%BD%E6%9C%AC%E5%9C%B0%E5%BA%93">
1573        native_libraries.html</a>
1574</p>
1575<a name="N109E3"></a><a name="%E4%BD%9C%E4%B8%9A%E7%9A%84%E6%8F%90%E4%BA%A4%E4%B8%8E%E7%9B%91%E6%8E%A7"></a>
1576<h3 class="h4">䜜䞚的提亀䞎监控</h3>
1577<p>
1578<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobClient.html">
1579        JobClient</a>是甚户提亀的䜜䞚䞎<span class="codefrag">JobTracker</span>亀互的䞻芁接口。
1580        </p>
1581<p>
1582<span class="codefrag">JobClient</span> æäŸ›æäº€äœœäžšïŒŒè¿œèžªè¿›çš‹ïŒŒè®¿é—®å­ä»»åŠ¡çš„日志记圕获埗Map/Reduce集矀状态信息等功胜。
1583        </p>
1584<p>䜜䞚提亀过皋包括 </p>
1585<ol>
1586         
1587<li>检查䜜䞚蟓入蟓出样匏细节</li>
1588         
1589<li>䞺䜜䞚计算<span class="codefrag">InputSplit</span>倌。</li>
1590         
1591<li>
1592           åŠ‚果需芁的话䞺䜜䞚的<span class="codefrag">DistributedCache</span>建立必须的统计信息。
1593          </li>
1594         
1595<li>
1596            拷莝䜜䞚的jar包和配眮文件到<span class="codefrag">FileSystem</span>侊的Map/Reduce系统目圕䞋。
1597          </li>
1598         
1599<li>
1600            提亀䜜䞚到<span class="codefrag">JobTracker</span>并䞔监控它的状态。
1601          </li>
1602       
1603</ol>
1604<p>䜜䞚的历史文件记圕到指定目圕的"_logs/history/"子目圕䞋。这䞪指定目圕由<span class="codefrag">hadoop.job.history.user.location</span>讟定默讀是䜜䞚蟓出的目圕。因歀默讀情况䞋文件䌚存攟圚mapred.output.dir/_logs/history目圕䞋。甚户可以讟眮<span class="codefrag">hadoop.job.history.user.location</span>䞺<span class="codefrag">none</span>来停止日志记圕。
1605        </p>
1606<p> ç”šæˆ·äœ¿ç”šäž‹é¢çš„呜什可以看到圚指定目圕䞋的历史日志记圕的摘芁。
1607        <br>
1608       
1609<span class="codefrag">$ bin/hadoop job -history output-dir</span>
1610<br> 
1611        这䞪呜什䌚打印出䜜䞚的细节以及倱莥的和被杀死的任务细节。<br>
1612        芁查看有关䜜䞚的曎倚细节䟋劂成功的任务、每䞪任务尝试的次数task attempt等可以䜿甚䞋面的呜什
1613        <br>
1614       
1615<span class="codefrag">$ bin/hadoop job -history all output-dir</span>
1616<br>
1617</p>
1618<p>甚户可以䜿甚
1619        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/OutputLogFilter.html">OutputLogFilter</a>
1620        从蟓出目圕列衚䞭筛选日志文件。</p>
1621<p>䞀般情况甚户利甚<span class="codefrag">JobConf</span>创建应甚皋序并配眮䜜䞚属性
1622        然后甚
1623        <span class="codefrag">JobClient</span> æäº€äœœäžšå¹¶ç›‘视它的进皋。</p>
1624<a name="N10A44"></a><a name="%E4%BD%9C%E4%B8%9A%E7%9A%84%E6%8E%A7%E5%88%B6"></a>
1625<h4>䜜䞚的控制</h4>
1626<p>有时候甚䞀䞪单独的Map/Reduce䜜䞚并䞍胜完成䞀䞪倍杂的任务甚户也讞芁铟接倚䞪Map/Reduce䜜䞚才行。这是容易实现的因䞺䜜䞚通垞蟓出到分垃匏文件系统䞊的所以可以把这䞪䜜䞚的蟓出䜜䞺䞋䞀䞪䜜䞚的蟓入实现䞲联。
1627          </p>
1628<p>然而这也意味着确保每䞀䜜䞚完成(成功或倱莥)的莣任就盎接萜圚了客户身䞊。圚这种情况䞋可以甚的控制䜜䞚的选项有
1629          </p>
1630<ul>
1631           
1632<li>
1633             
1634<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobClient.html#runJob(org.apache.hadoop.mapred.JobConf)">
1635              runJob(JobConf)</a>提亀䜜䞚仅圓䜜䞚完成时返回。
1636            </li>
1637           
1638<li>
1639             
1640<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobClient.html#submitJob(org.apache.hadoop.mapred.JobConf)">
1641              submitJob(JobConf)</a>只提亀䜜䞚之后需芁䜠蜮询它返回的
1642              <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/RunningJob.html">
1643              RunningJob</a>句柄的状态并根据情况调床。
1644            </li>
1645           
1646<li>
1647             
1648<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setJobEndNotificationURI(java.lang.String)">
1649              JobConf.setJobEndNotificationURI(String)</a>讟眮䞀䞪䜜䞚完成通知可避免蜮询。
1650           
1651            </li>
1652         
1653</ul>
1654<a name="N10A6E"></a><a name="%E4%BD%9C%E4%B8%9A%E7%9A%84%E8%BE%93%E5%85%A5"></a>
1655<h3 class="h4">䜜䞚的蟓入</h3>
1656<p>
1657<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/InputFormat.html">
1658        InputFormat</a> äžºMap/Reduce䜜䞚描述蟓入的细节规范。
1659        </p>
1660<p>Map/Reduce框架根据䜜䞚的<span class="codefrag">InputFormat</span>来
1661        </p>
1662<ol>
1663         
1664<li>检查䜜䞚蟓入的有效性。</li>
1665         
1666<li>
1667            把蟓入文件切分成倚䞪逻蟑<span class="codefrag">InputSplit</span>实䟋
1668            并把每䞀实䟋分别分发给䞀䞪
1669            <span class="codefrag">Mapper</span>。
1670          </li>
1671         
1672<li>
1673            提䟛<span class="codefrag">RecordReader</span>的实现这䞪RecordReader从逻蟑<span class="codefrag">InputSplit</span>䞭获埗蟓入记圕
1674                这些记圕将由<span class="codefrag">Mapper</span>倄理。
1675          </li>
1676       
1677</ol>
1678<p>基于文件的<span class="codefrag">InputFormat</span>实现通垞是
1679        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileInputFormat.html">
1680        FileInputFormat</a>的子类
1681        默讀行䞺是按照蟓入文件的字节倧小把蟓入数据切分成逻蟑分块<em>logical</em> 
1682        <span class="codefrag">InputSplit</span> ïŒ‰ã€‚
1683        其䞭蟓入文件所圚的<span class="codefrag">FileSystem</span>的数据块尺寞是分块倧小的䞊限。䞋限可以讟眮<span class="codefrag">mapred.min.split.size</span>
1684        的倌。</p>
1685<p>考虑到蟹界情况对于埈倚应甚皋序来诎埈明星按照文件倧小进行逻蟑分割是䞍胜满足需求的。
1686        圚这种情况䞋应甚皋序需芁实现䞀䞪<span class="codefrag">RecordReader</span>来倄理记圕的蟹界并䞺每䞪任务提䟛䞀䞪逻蟑分块的面向记圕的视囟。
1687        </p>
1688<p>
1689<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/TextInputFormat.html">
1690        TextInputFormat</a> æ˜¯é»˜è®€çš„<span class="codefrag">InputFormat</span>。</p>
1691<p>劂果䞀䞪䜜䞚的<span class="codefrag">Inputformat</span>是<span class="codefrag">TextInputFormat</span>
1692        并䞔框架检测到蟓入文件的后猀是<em>.gz</em>和<em>.lzo</em>就䌚䜿甚对应的<span class="codefrag">CompressionCodec</span>自劚解压猩这些文件。
1693        䜆是需芁泚意䞊述垊后猀的压猩文件䞍䌚被切分并䞔敎䞪压猩文件䌚分给䞀䞪mapper来倄理。
1694        </p>
1695<a name="N10AD2"></a><a name="InputSplit"></a>
1696<h4>InputSplit</h4>
1697<p>
1698<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/InputSplit.html">
1699          InputSplit</a> æ˜¯äž€äžªå•ç‹¬çš„<span class="codefrag">Mapper</span>芁倄理的数据块。</p>
1700<p>䞀般的<span class="codefrag">InputSplit</span> æ˜¯å­—节样匏蟓入然后由<span class="codefrag">RecordReader</span>倄理并蜬化成记圕样匏。
1701          </p>
1702<p>
1703<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileSplit.html">
1704                          FileSplit</a> æ˜¯é»˜è®€çš„<span class="codefrag">InputSplit</span>。 它把
1705          <span class="codefrag">map.input.file</span> è®Ÿå®šäžºèŸ“入文件的路埄蟓入文件是逻蟑分块文件。
1706          </p>
1707<a name="N10AF7"></a><a name="RecordReader"></a>
1708<h4>RecordReader</h4>
1709<p>
1710<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/RecordReader.html">
1711          RecordReader</a> ä»Ž<span class="codefrag">InputSlit</span>读入<span class="codefrag">&lt;key, value&gt;</span>对。
1712          </p>
1713<p>䞀般的<span class="codefrag">RecordReader</span> æŠŠç”±<span class="codefrag">InputSplit</span>
1714          提䟛的字节样匏的蟓入文件蜬化成由<span class="codefrag">Mapper</span>倄理的记圕样匏的文件。
1715          å› æ­€<span class="codefrag">RecordReader</span>莟莣倄理记圕的蟹界情况和把数据衚瀺成keys/values对圢匏。
1716          </p>
1717<a name="N10B1A"></a><a name="%E4%BD%9C%E4%B8%9A%E7%9A%84%E8%BE%93%E5%87%BA"></a>
1718<h3 class="h4">䜜䞚的蟓出</h3>
1719<p>
1720<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/OutputFormat.html">
1721        OutputFormat</a> æè¿°Map/Reduce䜜䞚的蟓出样匏。
1722        </p>
1723<p>Map/Reduce框架根据䜜䞚的<span class="codefrag">OutputFormat</span>来
1724        </p>
1725<ol>
1726         
1727<li>
1728            检验䜜䞚的蟓出䟋劂检查蟓出路埄是吊已经存圚。
1729          </li>
1730         
1731<li>
1732            提䟛䞀䞪<span class="codefrag">RecordWriter</span>的实现甚来蟓出䜜䞚结果。
1733            蟓出文件保存圚<span class="codefrag">FileSystem</span>䞊。
1734          </li>
1735       
1736</ol>
1737<p>
1738<span class="codefrag">TextOutputFormat</span>是默讀的
1739        <span class="codefrag">OutputFormat</span>。</p>
1740<a name="N10B43"></a><a name="%E4%BB%BB%E5%8A%A1%E7%9A%84Side-Effect+File"></a>
1741<h4>任务的Side-Effect File</h4>
1742<p>圚䞀些应甚皋序䞭子任务需芁产生䞀些side-file这些文件䞎䜜䞚实际蟓出结果的文件䞍同。
1743          </p>
1744<p>圚这种情况䞋同䞀䞪<span class="codefrag">Mapper</span>或者<span class="codefrag">Reducer</span>的䞀䞪实䟋比劂预防性任务同时打匀或者写
1745          <span class="codefrag">FileSystem</span>䞊的同䞀文件就䌚产生冲突。因歀应甚皋序圚写文件的时候需芁䞺每次任务尝试䞍仅仅是每次任务每䞪任务可以尝试执行埈倚次选取䞀䞪独䞀无二的文件名(䜿甚attemptid䟋劂<span class="codefrag">task_200709221812_0001_m_000000_0</span>)。
1746          </p>
1747<p>䞺了避免冲突Map/Reduce框架䞺每次尝试执行任务郜建立和绎技䞀䞪特殊的
1748          <span class="codefrag">${mapred.output.dir}/_temporary/_${taskid}</span>子目圕这䞪目圕䜍于本次尝试执行任务蟓出结果所圚的<span class="codefrag">FileSystem</span>䞊可以通过
1749          <span class="codefrag">${mapred.work.output.dir}</span>来访问这䞪子目圕。
1750          对于成功完成的任务尝试只有<span class="codefrag">${mapred.output.dir}/_temporary/_${taskid}</span>䞋的文件䌚<em>移劚</em>到<span class="codefrag">${mapred.output.dir}</span>。圓然框架䌚䞢匃那些倱莥的任务尝试的子目圕。这种倄理过皋对于应甚皋序来诎是完党透明的。</p>
1751<p>圚任务执行期闎应甚皋序圚写文件时可以利甚这䞪特性比劂
1752          通过<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#getWorkOutputPath(org.apache.hadoop.mapred.JobConf)">
1753          FileOutputFormat.getWorkOutputPath()</a>获埗<span class="codefrag">${mapred.work.output.dir}</span>目圕
1754          并圚其䞋创建任意任务执行时所需的side-file框架圚任务尝试成功时䌚马䞊移劚这些文件因歀䞍需芁圚皋序内䞺每次任务尝试选取䞀䞪独䞀无二的名字。
1755          </p>
1756<p>泚意圚每次任务尝试执行期闎<span class="codefrag">${mapred.work.output.dir}</span> çš„倌实际䞊是
1757          <span class="codefrag">${mapred.output.dir}/_temporary/_{$taskid}</span>这䞪倌是Map/Reduce框架创建的。
1758          所以䜿甚这䞪特性的方法是圚<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#getWorkOutputPath(org.apache.hadoop.mapred.JobConf)">
1759          FileOutputFormat.getWorkOutputPath() </a>
1760          路埄䞋创建side-file即可。
1761          </p>
1762<p>对于只䜿甚map䞍䜿甚reduce的䜜䞚这䞪结论也成立。这种情况䞋map的蟓出结果盎接生成到HDFS䞊。
1763           </p>
1764<a name="N10B8B"></a><a name="RecordWriter"></a>
1765<h4>RecordWriter</h4>
1766<p>
1767<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/RecordWriter.html">
1768          RecordWriter</a> ç”Ÿæˆ<span class="codefrag">&lt;key, value&gt;</span> 
1769          对到蟓出文件。</p>
1770<p>RecordWriter的实现把䜜䞚的蟓出结果写到
1771          <span class="codefrag">FileSystem</span>。</p>
1772<a name="N10BA2"></a><a name="%E5%85%B6%E4%BB%96%E6%9C%89%E7%94%A8%E7%9A%84%E7%89%B9%E6%80%A7"></a>
1773<h3 class="h4">其他有甚的特性</h3>
1774<a name="N10BA8"></a><a name="Counters"></a>
1775<h4>Counters</h4>
1776<p>
1777<span class="codefrag">Counters</span> æ˜¯å€šäžªç”±Map/Reduce框架或者应甚皋序定义的党局计数噚。
1778          每䞀䞪<span class="codefrag">Counter</span>可以是任䜕䞀种
1779          <span class="codefrag">Enum</span>类型。同䞀特定<span class="codefrag">Enum</span>类型的Counter可以汇集到䞀䞪组其类型䞺<span class="codefrag">Counters.Group</span>。</p>
1780<p>应甚皋序可以定义任意(Enum类型)的<span class="codefrag">Counters</span>并䞔可以通过 <span class="codefrag">map</span> æˆ–者
1781          <span class="codefrag">reduce</span>方法䞭的
1782          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reporter.html#incrCounter(java.lang.Enum, long)">
1783          Reporter.incrCounter(Enum, long)</a>或者
1784          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/Reporter.html#incrCounter(java.lang.String, java.lang.String, long amount)">
1785          Reporter.incrCounter(String, String, long)</a>
1786          曎新。之后框架䌚汇总这些党局counters。
1787          </p>
1788<a name="N10BD4"></a><a name="DistributedCache"></a>
1789<h4>DistributedCache</h4>
1790<p>
1791<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html">
1792          DistributedCache</a> å¯å°†å…·äœ“应甚盞关的、倧尺寞的、只读的文件有效地分垃攟眮。
1793          </p>
1794<p>
1795<span class="codefrag">DistributedCache</span> æ˜¯Map/Reduce框架提䟛的功胜胜借猓存应甚皋序所需的文件
1796                包括文本档案文件jar文件等。
1797          </p>
1798<p>应甚皋序圚<span class="codefrag">JobConf</span>䞭通过url(hdfs://)指定需芁被猓存的文件。
1799          <span class="codefrag">DistributedCache</span>假定由hdfs://栌匏url指定的文件已经圚
1800          <span class="codefrag">FileSystem</span>䞊了。</p>
1801<p>Map-Redcue框架圚䜜䞚所有任务执行之前䌚把必芁的文件拷莝到slave节点䞊。
1802          它运行高效是因䞺每䞪䜜䞚的文件只拷莝䞀次并䞔䞺那些没有文档的slave节点猓存文档。     
1803          </p>
1804<p>
1805<span class="codefrag">DistributedCache</span> æ ¹æ®çŒ“存文档修改的时闎戳进行远螪。
1806          圚䜜䞚执行期闎圓前应甚皋序或者倖郚皋序䞍胜修改猓存文件。
1807          </p>
1808<p>
1809<span class="codefrag">distributedCache</span>可以分发简单的只读数据或文本文件也可以分发倍杂类型的文件䟋劂園档文件和jar文件。園档文件(zip,tar,tgz和tar.gz文件)圚slave节点䞊䌚被<em>解档un-archived</em>。
1810          这些文件可以讟眮<em>执行权限</em>。</p>
1811<p>甚户可以通过讟眮<span class="codefrag">mapred.cache.{files|archives}</span>来分发文件。
1812          劂果芁分发倚䞪文件可以䜿甚逗号分隔文件所圚路埄。也可以利甚API来讟眮该属性
1813            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#addCacheFile(java.net.URI,%20org.apache.hadoop.conf.Configuration)">
1814          DistributedCache.addCacheFile(URI,conf)</a>/
1815          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#addCacheArchive(java.net.URI,%20org.apache.hadoop.conf.Configuration)">
1816          DistributedCache.addCacheArchive(URI,conf)</a> and
1817          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#setCacheFiles(java.net.URI[],%20org.apache.hadoop.conf.Configuration)">
1818          DistributedCache.setCacheFiles(URIs,conf)</a>/
1819          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#setCacheArchives(java.net.URI[],%20org.apache.hadoop.conf.Configuration)">
1820          DistributedCache.setCacheArchives(URIs,conf)</a>
1821          其䞭URI的圢匏是
1822          <span class="codefrag">hdfs://host:port/absolute-path#link-name</span>
1823          圚Streaming皋序䞭可以通过呜什行选项
1824          <span class="codefrag">-cacheFile/-cacheArchive</span>
1825          分发文件。</p>
1826<p>
1827          甚户可以通过<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#createSymlink(org.apache.hadoop.conf.Configuration)">
1828          DistributedCache.createSymlink(Configuration)</a>方法让<span class="codefrag">DistributedCache</span>
1829        圚<em>圓前工䜜目圕</em>䞋创建到猓存文件的笊号铟接。
1830        或者通过讟眮配眮文件属性<span class="codefrag">mapred.create.symlink</span>䞺<span class="codefrag">yes</span>。
1831        分垃匏猓存䌚截取URI的片段䜜䞺铟接的名字。
1832        䟋劂URI是 <span class="codefrag">hdfs://namenode:port/lib.so.1#lib.so</span>
1833        则圚task圓前工䜜目圕䌚有名䞺<span class="codefrag">lib.so</span>的铟接
1834        它䌚铟接分垃匏猓存䞭的<span class="codefrag">lib.so.1</span>。
1835        </p>
1836<p>
1837<span class="codefrag">DistributedCache</span>可圚map/reduce任务䞭䜜䞺
1838        䞀种基础蜯件分发机制䜿甚。它可以被甚于分发jar包和本地库native libraries。
1839        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#addArchiveToClassPath(org.apache.hadoop.fs.Path,%20org.apache.hadoop.conf.Configuration)">
1840        DistributedCache.addArchiveToClassPath(Path, Configuration)</a>和
1841        <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/filecache/DistributedCache.html#addFileToClassPath(org.apache.hadoop.fs.Path,%20org.apache.hadoop.conf.Configuration)">
1842        DistributedCache.addFileToClassPath(Path, Configuration)</a> API胜借被甚于
1843        猓存文件和jar包并把它们加入子jvm的<em>classpath</em>。也可以通过讟眮配眮文档里的属性
1844        <span class="codefrag">mapred.job.classpath.{files|archives}</span>蟟到盞同的效果。猓存文件可甚于分发和装蜜本地库。
1845        </p>
1846<a name="N10C50"></a><a name="Tool"></a>
1847<h4>Tool</h4>
1848<p>
1849<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/util/Tool.html">Tool</a> 
1850          接口支持倄理垞甚的Hadoop呜什行选项。
1851          </p>
1852<p>
1853<span class="codefrag">Tool</span> æ˜¯Map/Reduce工具或应甚的标准。应甚皋序应只倄理其定制参数
1854          芁把标准呜什行选项通过
1855                <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/util/ToolRunner.html#run(org.apache.hadoop.util.Tool, java.lang.String[])"> ToolRunner.run(Tool, String[])</a> 
1856                委托给
1857          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/util/GenericOptionsParser.html">
1858          GenericOptionsParser</a>倄理。
1859          </p>
1860<p>
1861            Hadoop呜什行的垞甚选项有<br>
1862           
1863<span class="codefrag">
1864              -conf &lt;configuration file&gt;
1865            </span>
1866           
1867<br>
1868           
1869<span class="codefrag">
1870              -D &lt;property=value&gt;
1871            </span>
1872           
1873<br>
1874           
1875<span class="codefrag">
1876              -fs &lt;local|namenode:port&gt;
1877            </span>
1878           
1879<br>
1880           
1881<span class="codefrag">
1882              -jt &lt;local|jobtracker:port&gt;
1883            </span>
1884         
1885</p>
1886<a name="N10C81"></a><a name="IsolationRunner"></a>
1887<h4>IsolationRunner</h4>
1888<p>
1889<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/IsolationRunner.html">
1890          IsolationRunner</a> æ˜¯åž®åŠ©è°ƒè¯•Map/Reduce皋序的工具。</p>
1891<p>䜿甚<span class="codefrag">IsolationRunner</span>的方法是銖先讟眮
1892          <span class="codefrag">keep.failed.tasks.files</span>属性䞺<span class="codefrag">true</span> 
1893          同时参考<span class="codefrag">keep.tasks.files.pattern</span>。</p>
1894<p>
1895            然后登圕到任务运行倱莥的节点䞊进入
1896            <span class="codefrag">TaskTracker</span>的本地路埄运行
1897            <span class="codefrag">IsolationRunner</span><br>
1898           
1899<span class="codefrag">$ cd &lt;local path&gt;/taskTracker/${taskid}/work</span>
1900<br>
1901           
1902<span class="codefrag">
1903              $ bin/hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml
1904            </span>
1905         
1906</p>
1907<p>
1908<span class="codefrag">IsolationRunner</span>䌚把倱莥的任务攟圚单独的䞀䞪胜借调试的jvm䞊运行并䞔采甚和之前完党䞀样的蟓入数据。
1909                </p>
1910<a name="N10CB4"></a><a name="Profiling"></a>
1911<h4>Profiling</h4>
1912<p>Profiling是䞀䞪工具它䜿甚内眮的java profiler工具进行分析获埗(2-3䞪)map或reduce样䟋运行分析报告。</p>
1913<p>甚户可以通过讟眮属性<span class="codefrag">mapred.task.profile</span>指定系统是吊采集profiler信息。
1914          利甚api<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setProfileEnabled(boolean)">
1915          JobConf.setProfileEnabled(boolean)可以修改属性倌</a>。劂果讟䞺<span class="codefrag">true</span>
1916          则匀启profiling功胜。profiler信息保存圚甚户日志目圕䞋。猺省情况profiling功胜是关闭的。</p>
1917<p>劂果甚户讟定䜿甚profiling功胜可以䜿甚配眮文档里的属性
1918          <span class="codefrag">mapred.task.profile.{maps|reduces}</span>
1919          讟眮芁profile map/reduce task的范囎。讟眮该属性倌的api是
1920           <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setProfileTaskRange(boolean,%20java.lang.String)">
1921          JobConf.setProfileTaskRange(boolean,String)</a>。
1922          范囎的猺省倌是<span class="codefrag">0-2</span>。</p>
1923<p>甚户可以通过讟定配眮文档里的属性<span class="codefrag">mapred.task.profile.params</span>
1924          来指定profiler配眮参数。修改属性芁䜿甚api
1925          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setProfileParams(java.lang.String)">
1926          JobConf.setProfileParams(String)</a>。圓运行task时劂果字笊䞲包含<span class="codefrag">%s</span>。
1927          它䌚被替换成profileing的蟓出文件名。这些参数䌚圚呜什行里䌠递到子JVM䞭。猺省的profiling
1928          参数是
1929          <span class="codefrag">-agentlib:hprof=cpu=samples,heap=sites,force=n,thread=y,verbose=n,file=%s</span>。
1930          </p>
1931<a name="N10CE8"></a><a name="%E8%B0%83%E8%AF%95"></a>
1932<h4>调试</h4>
1933<p>Map/Reduce框架胜借运行甚户提䟛的甚于调试的脚本皋序。
1934          圓map/reduce任务倱莥时甚户可以通过运行脚本圚任务日志䟋劂任务的标准蟓出、标准错误、系统日志以及䜜䞚配眮文件䞊做后续倄理工䜜。甚户提䟛的调试脚本皋序的标准蟓出和标准错误䌚蟓出䞺诊断文件。劂果需芁的话这些蟓出结果也可以打印圚甚户界面䞊。</p>
1935<p> åœšæŽ¥äž‹æ¥çš„章节我们讚论劂䜕䞎䜜䞚䞀起提亀调试脚本。䞺了提亀调试脚本
1936          銖先芁把这䞪脚本分发出去而䞔还芁圚配眮文件里讟眮。
1937          </p>
1938<a name="N10CF4"></a><a name="%E5%A6%82%E4%BD%95%E5%88%86%E5%8F%91%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%9A"></a>
1939<h5> åŠ‚䜕分发脚本文件</h5>
1940<p>甚户芁甚
1941          <a href="mapred_tutorial.html#DistributedCache">DistributedCache</a>
1942          机制来<em>分发</em>和<em>铟接</em>脚本文件</p>
1943<a name="N10D08"></a><a name="%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E8%84%9A%E6%9C%AC%EF%BC%9A"></a>
1944<h5> åŠ‚䜕提亀脚本</h5>
1945<p> äž€äžªå¿«é€Ÿæäº€è°ƒè¯•è„šæœ¬çš„方法是分别䞺需芁调试的map任务和reduce任务讟眮
1946                "mapred.map.task.debug.script" 和 "mapred.reduce.task.debug.script"
1947         å±žæ€§çš„倌。这些属性也可以通过
1948          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMapDebugScript(java.lang.String)">
1949          JobConf.setMapDebugScript(String) </a>和
1950          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setReduceDebugScript(java.lang.String)">
1951          JobConf.setReduceDebugScript(String) </a>API来讟眮。对于streaming
1952          可以分别䞺需芁调试的map任务和reduce任务䜿甚呜什行选项-mapdebug 和 -reducedegug来提亀调试脚本。
1953          </p>
1954<p>脚本的参数是任务的标准蟓出、标准错误、系统日志以及䜜䞚配眮文件。圚运行map/reduce倱莥的节点䞊运行调试呜什是
1955                 <br>
1956         
1957<span class="codefrag"> $script $stdout $stderr $syslog $jobconf </span> 
1958</p>
1959<p> Pipes 皋序根据第五䞪参数获埗c++皋序名。
1960          因歀调试pipes皋序的呜什是<br> 
1961         
1962<span class="codefrag">$script $stdout $stderr $syslog $jobconf $program </span> 
1963         
1964</p>
1965<a name="N10D2A"></a><a name="%E9%BB%98%E8%AE%A4%E8%A1%8C%E4%B8%BA"></a>
1966<h5> é»˜è®€è¡Œäžº </h5>
1967<p> å¯¹äºŽpipes默讀的脚本䌚甚gdb倄理core dump
1968          打印 stack trace并䞔给出正圚运行线皋的信息。</p>
1969<a name="N10D35"></a><a name="JobControl"></a>
1970<h4>JobControl</h4>
1971<p>
1972<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/jobcontrol/package-summary.html">
1973          JobControl</a>是䞀䞪工具它封装了䞀组Map/Reduce䜜䞚以及他们之闎的䟝赖关系。
1974          </p>
1975<a name="N10D42"></a><a name="%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9"></a>
1976<h4>数据压猩</h4>
1977<p>Hadoop Map/Reduce框架䞺应甚皋序的写入文件操䜜提䟛压猩工具这些工具可以䞺map蟓出的䞭闎数据和䜜䞚最终蟓出数据䟋劂reduce的蟓出提䟛支持。它还附垊了䞀些
1978          <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/io/compress/CompressionCodec.html">
1979          CompressionCodec</a>的实现比劂实现了
1980          <a href="http://www.zlib.net/">zlib</a>和<a href="http://www.oberhumer.com/opensource/lzo/">lzo</a>压猩算法。
1981           Hadoop同样支持<a href="http://www.gzip.org/">gzip</a>文件栌匏。
1982          </p>
1983<p>考虑到性胜问题zlib以及Java类库的猺倱lzo等因玠Hadoop也䞺䞊述压猩解压算法提䟛本地库的实现。曎倚的细节请参考
1984          <a href="native_libraries.html">这里</a>。</p>
1985<a name="N10D62"></a><a name="%E4%B8%AD%E9%97%B4%E8%BE%93%E5%87%BA"></a>
1986<h5>䞭闎蟓出</h5>
1987<p>应甚皋序可以通过
1988            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setCompressMapOutput(boolean)">
1989            JobConf.setCompressMapOutput(boolean)</a>api控制map蟓出的䞭闎结果并䞔可以通过
1990            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/JobConf.html#setMapOutputCompressorClass(java.lang.Class)">
1991            JobConf.setMapOutputCompressorClass(Class)</a>api指定
1992            <span class="codefrag">CompressionCodec</span>。
1993        </p>
1994<a name="N10D77"></a><a name="%E4%BD%9C%E4%B8%9A%E8%BE%93%E5%87%BA"></a>
1995<h5>䜜䞚蟓出</h5>
1996<p>应甚皋序可以通过
1997            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#setCompressOutput(org.apache.hadoop.mapred.JobConf,%20boolean)">
1998            FileOutputFormat.setCompressOutput(JobConf, boolean)</a>
1999            api控制蟓出是吊需芁压猩并䞔可以䜿甚
2000            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/FileOutputFormat.html#setOutputCompressorClass(org.apache.hadoop.mapred.JobConf,%20java.lang.Class)">
2001            FileOutputFormat.setOutputCompressorClass(JobConf, Class)</a>api指定<span class="codefrag">CompressionCodec</span>。</p>
2002<p>劂果䜜䞚蟓出芁保存成
2003            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/SequenceFileOutputFormat.html">
2004            SequenceFileOutputFormat</a>栌匏需芁䜿甚
2005            <a href="http://hadoop.apache.org/core/docs/r0.18.2/api/org/apache/hadoop/mapred/SequenceFileOutputFormat.html#setOutputCompressionType(org.apache.hadoop.mapred.JobConf,%20org.apache.hadoop.io.SequenceFile.CompressionType)">
2006            SequenceFileOutputFormat.setOutputCompressionType(JobConf,
2007            SequenceFile.CompressionType)</a>api来讟定
2008            <span class="codefrag">SequenceFile.CompressionType</span> (i.e. <span class="codefrag">RECORD</span> /
2009            <span class="codefrag">BLOCK</span> - 默讀是<span class="codefrag">RECORD</span>)。
2010            </p>
2011</div>
2012
2013   
2014<a name="N10DA6"></a><a name="%E4%BE%8B%E5%AD%90%EF%BC%9AWordCount+v2.0"></a>
2015<h2 class="h3">䟋子WordCount v2.0</h2>
2016<div class="section">
2017<p>这里是䞀䞪曎党面的<span class="codefrag">WordCount</span>䟋子它䜿甚了我们已经讚论过的埈倚Map/Reduce框架提䟛的功胜。
2018      </p>
2019<p>运行这䞪䟋子需芁HDFS的某些功胜特别是
2020      <span class="codefrag">DistributedCache</span>盞关功胜。因歀这䞪䟋子只胜运行圚
2021      <a href="quickstart.html#SingleNodeSetup">䌪分垃匏</a> æˆ–者
2022      <a href="quickstart.html#Fully-Distributed+Operation">完党分垃匏暡匏</a>的
2023      Hadoop䞊。</p>
2024<a name="N10DC0"></a><a name="%E6%BA%90%E4%BB%A3%E7%A0%81-N10DC0"></a>
2025<h3 class="h4">源代码</h3>
2026<table class="ForrestTable" cellspacing="1" cellpadding="4">
2027         
2028<tr>
2029           
2030<th colspan="1" rowspan="1"></th>
2031            <th colspan="1" rowspan="1">WordCount.java</th>
2032         
2033</tr>
2034         
2035<tr>
2036           
2037<td colspan="1" rowspan="1">1.</td>
2038            <td colspan="1" rowspan="1">
2039              <span class="codefrag">package org.myorg;</span>
2040            </td>
2041         
2042</tr>
2043         
2044<tr>
2045           
2046<td colspan="1" rowspan="1">2.</td>
2047            <td colspan="1" rowspan="1"></td>
2048         
2049</tr>
2050         
2051<tr>
2052           
2053<td colspan="1" rowspan="1">3.</td>
2054            <td colspan="1" rowspan="1">
2055              <span class="codefrag">import java.io.*;</span>
2056            </td>
2057         
2058</tr>
2059         
2060<tr>
2061           
2062<td colspan="1" rowspan="1">4.</td>
2063            <td colspan="1" rowspan="1">
2064              <span class="codefrag">import java.util.*;</span>
2065            </td>
2066         
2067</tr>
2068         
2069<tr>
2070           
2071<td colspan="1" rowspan="1">5.</td>
2072            <td colspan="1" rowspan="1"></td>
2073         
2074</tr>
2075         
2076<tr>
2077           
2078<td colspan="1" rowspan="1">6.</td>
2079            <td colspan="1" rowspan="1">
2080              <span class="codefrag">import org.apache.hadoop.fs.Path;</span>
2081            </td>
2082         
2083</tr>
2084         
2085<tr>
2086           
2087<td colspan="1" rowspan="1">7.</td>
2088            <td colspan="1" rowspan="1">
2089              <span class="codefrag">import org.apache.hadoop.filecache.DistributedCache;</span>
2090            </td>
2091         
2092</tr>
2093         
2094<tr>
2095           
2096<td colspan="1" rowspan="1">8.</td>
2097            <td colspan="1" rowspan="1">
2098              <span class="codefrag">import org.apache.hadoop.conf.*;</span>
2099            </td>
2100         
2101</tr>
2102         
2103<tr>
2104           
2105<td colspan="1" rowspan="1">9.</td>
2106            <td colspan="1" rowspan="1">
2107              <span class="codefrag">import org.apache.hadoop.io.*;</span>
2108            </td>
2109         
2110</tr>
2111         
2112<tr>
2113           
2114<td colspan="1" rowspan="1">10.</td>
2115            <td colspan="1" rowspan="1">
2116              <span class="codefrag">import org.apache.hadoop.mapred.*;</span>
2117            </td>
2118         
2119</tr>
2120         
2121<tr>
2122           
2123<td colspan="1" rowspan="1">11.</td>
2124            <td colspan="1" rowspan="1">
2125              <span class="codefrag">import org.apache.hadoop.util.*;</span>
2126            </td>
2127         
2128</tr>
2129         
2130<tr>
2131           
2132<td colspan="1" rowspan="1">12.</td>
2133            <td colspan="1" rowspan="1"></td>
2134         
2135</tr>
2136         
2137<tr>
2138           
2139<td colspan="1" rowspan="1">13.</td>
2140            <td colspan="1" rowspan="1">
2141              <span class="codefrag">public class WordCount extends Configured implements Tool {</span>
2142            </td>
2143         
2144</tr>
2145         
2146<tr>
2147           
2148<td colspan="1" rowspan="1">14.</td>
2149            <td colspan="1" rowspan="1"></td>
2150         
2151</tr>
2152         
2153<tr>
2154           
2155<td colspan="1" rowspan="1">15.</td>
2156            <td colspan="1" rowspan="1">
2157              &nbsp;&nbsp;
2158              <span class="codefrag">
2159                public static class Map extends MapReduceBase
2160                implements Mapper&lt;LongWritable, Text, Text, IntWritable&gt; {
2161              </span>
2162            </td>
2163         
2164</tr>
2165         
2166<tr>
2167           
2168<td colspan="1" rowspan="1">16.</td>
2169            <td colspan="1" rowspan="1"></td>
2170         
2171</tr>
2172         
2173<tr>
2174           
2175<td colspan="1" rowspan="1">17.</td>
2176            <td colspan="1" rowspan="1">
2177              &nbsp;&nbsp;&nbsp;&nbsp;
2178              <span class="codefrag">
2179                static enum Counters { INPUT_WORDS }
2180              </span>
2181            </td>
2182         
2183</tr>
2184         
2185<tr>
2186           
2187<td colspan="1" rowspan="1">18.</td>
2188            <td colspan="1" rowspan="1"></td>
2189         
2190</tr>
2191         
2192<tr>
2193           
2194<td colspan="1" rowspan="1">19.</td>
2195            <td colspan="1" rowspan="1">
2196              &nbsp;&nbsp;&nbsp;&nbsp;
2197              <span class="codefrag">
2198                private final static IntWritable one = new IntWritable(1);
2199              </span>
2200            </td>
2201         
2202</tr>
2203         
2204<tr>
2205           
2206<td colspan="1" rowspan="1">20.</td>
2207            <td colspan="1" rowspan="1">
2208              &nbsp;&nbsp;&nbsp;&nbsp;
2209              <span class="codefrag">private Text word = new Text();</span>
2210            </td>
2211         
2212</tr>
2213         
2214<tr>
2215           
2216<td colspan="1" rowspan="1">21.</td>
2217            <td colspan="1" rowspan="1"></td>
2218         
2219</tr>
2220         
2221<tr>
2222           
2223<td colspan="1" rowspan="1">22.</td>
2224            <td colspan="1" rowspan="1">
2225              &nbsp;&nbsp;&nbsp;&nbsp;
2226              <span class="codefrag">private boolean caseSensitive = true;</span>
2227            </td>
2228         
2229</tr>
2230         
2231<tr>
2232           
2233<td colspan="1" rowspan="1">23.</td>
2234            <td colspan="1" rowspan="1">
2235              &nbsp;&nbsp;&nbsp;&nbsp;
2236              <span class="codefrag">private Set&lt;String&gt; patternsToSkip = new HashSet&lt;String&gt;();</span>
2237            </td>
2238         
2239</tr>
2240         
2241<tr>
2242           
2243<td colspan="1" rowspan="1">24.</td>
2244            <td colspan="1" rowspan="1"></td>
2245         
2246</tr>
2247         
2248<tr>
2249           
2250<td colspan="1" rowspan="1">25.</td>
2251            <td colspan="1" rowspan="1">
2252              &nbsp;&nbsp;&nbsp;&nbsp;
2253              <span class="codefrag">private long numRecords = 0;</span>
2254            </td>
2255         
2256</tr>
2257         
2258<tr>
2259           
2260<td colspan="1" rowspan="1">26.</td>
2261            <td colspan="1" rowspan="1">
2262              &nbsp;&nbsp;&nbsp;&nbsp;
2263              <span class="codefrag">private String inputFile;</span>
2264            </td>
2265         
2266</tr>
2267         
2268<tr>
2269           
2270<td colspan="1" rowspan="1">27.</td>
2271            <td colspan="1" rowspan="1"></td>
2272         
2273</tr>
2274         
2275<tr>
2276           
2277<td colspan="1" rowspan="1">28.</td>
2278            <td colspan="1" rowspan="1">
2279              &nbsp;&nbsp;&nbsp;&nbsp;
2280              <span class="codefrag">public void configure(JobConf job) {</span>
2281            </td>
2282         
2283</tr>
2284         
2285<tr>
2286           
2287<td colspan="1" rowspan="1">29.</td>
2288            <td colspan="1" rowspan="1">
2289              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2290              <span class="codefrag">
2291                caseSensitive = job.getBoolean("wordcount.case.sensitive", true);
2292              </span>
2293            </td>
2294         
2295</tr>
2296         
2297<tr>
2298           
2299<td colspan="1" rowspan="1">30.</td>
2300            <td colspan="1" rowspan="1">
2301              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2302              <span class="codefrag">inputFile = job.get("map.input.file");</span>
2303            </td>
2304         
2305</tr>
2306         
2307<tr>
2308           
2309<td colspan="1" rowspan="1">31.</td>
2310            <td colspan="1" rowspan="1"></td>
2311         
2312</tr>
2313         
2314<tr>
2315           
2316<td colspan="1" rowspan="1">32.</td>
2317            <td colspan="1" rowspan="1">
2318              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2319              <span class="codefrag">if (job.getBoolean("wordcount.skip.patterns", false)) {</span>
2320            </td>
2321         
2322</tr>
2323         
2324<tr>
2325           
2326<td colspan="1" rowspan="1">33.</td>
2327            <td colspan="1" rowspan="1">
2328              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2329              <span class="codefrag">Path[] patternsFiles = new Path[0];</span>
2330            </td>
2331         
2332</tr>
2333         
2334<tr>
2335           
2336<td colspan="1" rowspan="1">34.</td>
2337            <td colspan="1" rowspan="1">
2338              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2339              <span class="codefrag">try {</span>
2340            </td>
2341         
2342</tr>
2343         
2344<tr>
2345           
2346<td colspan="1" rowspan="1">35.</td>
2347            <td colspan="1" rowspan="1">
2348              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2349              <span class="codefrag">
2350                patternsFiles = DistributedCache.getLocalCacheFiles(job);
2351              </span>
2352            </td>
2353         
2354</tr>
2355         
2356<tr>
2357           
2358<td colspan="1" rowspan="1">36.</td>
2359            <td colspan="1" rowspan="1">
2360              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2361              <span class="codefrag">} catch (IOException ioe) {</span>
2362            </td>
2363         
2364</tr>
2365         
2366<tr>
2367           
2368<td colspan="1" rowspan="1">37.</td>
2369            <td colspan="1" rowspan="1">
2370              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2371              <span class="codefrag">
2372                System.err.println("Caught exception while getting cached files: "
2373                + StringUtils.stringifyException(ioe));
2374              </span>
2375            </td>
2376         
2377</tr>
2378         
2379<tr>
2380           
2381<td colspan="1" rowspan="1">38.</td>
2382            <td colspan="1" rowspan="1">
2383              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2384              <span class="codefrag">}</span>
2385            </td>
2386         
2387</tr>
2388         
2389<tr>
2390           
2391<td colspan="1" rowspan="1">39.</td>
2392            <td colspan="1" rowspan="1">
2393              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2394              <span class="codefrag">for (Path patternsFile : patternsFiles) {</span>
2395            </td>
2396         
2397</tr>
2398         
2399<tr>
2400           
2401<td colspan="1" rowspan="1">40.</td>
2402            <td colspan="1" rowspan="1">
2403              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2404              <span class="codefrag">parseSkipFile(patternsFile);</span>
2405            </td>
2406         
2407</tr>
2408         
2409<tr>
2410           
2411<td colspan="1" rowspan="1">41.</td>
2412            <td colspan="1" rowspan="1">
2413              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2414              <span class="codefrag">}</span>
2415            </td>
2416         
2417</tr>
2418         
2419<tr>
2420           
2421<td colspan="1" rowspan="1">42.</td>
2422            <td colspan="1" rowspan="1">
2423              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2424              <span class="codefrag">}</span>
2425            </td>
2426         
2427</tr>
2428         
2429<tr>
2430           
2431<td colspan="1" rowspan="1">43.</td>
2432            <td colspan="1" rowspan="1">
2433              &nbsp;&nbsp;&nbsp;&nbsp;
2434              <span class="codefrag">}</span>
2435            </td>
2436         
2437</tr>
2438         
2439<tr>
2440           
2441<td colspan="1" rowspan="1">44.</td>
2442            <td colspan="1" rowspan="1"></td>
2443         
2444</tr>
2445         
2446<tr>
2447           
2448<td colspan="1" rowspan="1">45.</td>
2449            <td colspan="1" rowspan="1">
2450              &nbsp;&nbsp;&nbsp;&nbsp;
2451              <span class="codefrag">private void parseSkipFile(Path patternsFile) {</span>
2452            </td>
2453         
2454</tr>
2455         
2456<tr>
2457           
2458<td colspan="1" rowspan="1">46.</td>
2459            <td colspan="1" rowspan="1">
2460              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2461              <span class="codefrag">try {</span>
2462            </td>
2463         
2464</tr>
2465         
2466<tr>
2467           
2468<td colspan="1" rowspan="1">47.</td>
2469            <td colspan="1" rowspan="1">
2470              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2471              <span class="codefrag">
2472                BufferedReader fis =
2473                  new BufferedReader(new FileReader(patternsFile.toString()));
2474              </span>
2475            </td>
2476         
2477</tr>
2478         
2479<tr>
2480           
2481<td colspan="1" rowspan="1">48.</td>
2482            <td colspan="1" rowspan="1">
2483              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2484              <span class="codefrag">String pattern = null;</span>
2485            </td>
2486         
2487</tr>
2488         
2489<tr>
2490           
2491<td colspan="1" rowspan="1">49.</td>
2492            <td colspan="1" rowspan="1">
2493              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2494              <span class="codefrag">while ((pattern = fis.readLine()) != null) {</span>
2495            </td>
2496         
2497</tr>
2498         
2499<tr>
2500           
2501<td colspan="1" rowspan="1">50.</td>
2502            <td colspan="1" rowspan="1">
2503              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2504              <span class="codefrag">patternsToSkip.add(pattern);</span>
2505            </td>
2506         
2507</tr>
2508         
2509<tr>
2510           
2511<td colspan="1" rowspan="1">51.</td>
2512            <td colspan="1" rowspan="1">
2513              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2514              <span class="codefrag">}</span>
2515            </td>
2516         
2517</tr>
2518         
2519<tr>
2520           
2521<td colspan="1" rowspan="1">52.</td>
2522            <td colspan="1" rowspan="1">
2523              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2524              <span class="codefrag">} catch (IOException ioe) {</span>
2525            </td>
2526         
2527</tr>
2528         
2529<tr>
2530           
2531<td colspan="1" rowspan="1">53.</td>
2532            <td colspan="1" rowspan="1">
2533              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2534              <span class="codefrag">
2535                System.err.println("Caught exception while parsing the cached file '" +
2536                                   patternsFile + "' : " +
2537                                   StringUtils.stringifyException(ioe));
2538               
2539              </span>
2540            </td>
2541         
2542</tr>
2543         
2544<tr>
2545           
2546<td colspan="1" rowspan="1">54.</td>
2547            <td colspan="1" rowspan="1">
2548              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2549              <span class="codefrag">}</span>
2550            </td>
2551         
2552</tr>
2553         
2554<tr>
2555           
2556<td colspan="1" rowspan="1">55.</td>
2557            <td colspan="1" rowspan="1">
2558              &nbsp;&nbsp;&nbsp;&nbsp;
2559              <span class="codefrag">}</span>
2560            </td>
2561         
2562</tr>
2563         
2564<tr>
2565           
2566<td colspan="1" rowspan="1">56.</td>
2567            <td colspan="1" rowspan="1"></td>
2568         
2569</tr>
2570         
2571<tr>
2572           
2573<td colspan="1" rowspan="1">57.</td>
2574            <td colspan="1" rowspan="1">
2575              &nbsp;&nbsp;&nbsp;&nbsp;
2576              <span class="codefrag">
2577                public void map(LongWritable key, Text value,
2578                OutputCollector&lt;Text, IntWritable&gt; output,
2579                Reporter reporter) throws IOException {
2580              </span>
2581            </td>
2582         
2583</tr>
2584         
2585<tr>
2586           
2587<td colspan="1" rowspan="1">58.</td>
2588            <td colspan="1" rowspan="1">
2589              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2590              <span class="codefrag">
2591                String line =
2592                  (caseSensitive) ? value.toString() :
2593                                    value.toString().toLowerCase();
2594              </span>
2595            </td>
2596         
2597</tr>
2598         
2599<tr>
2600           
2601<td colspan="1" rowspan="1">59.</td>
2602            <td colspan="1" rowspan="1"></td>
2603         
2604</tr>
2605         
2606<tr>
2607           
2608<td colspan="1" rowspan="1">60.</td>
2609            <td colspan="1" rowspan="1">
2610              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2611              <span class="codefrag">for (String pattern : patternsToSkip) {</span>
2612            </td>
2613         
2614</tr>
2615         
2616<tr>
2617           
2618<td colspan="1" rowspan="1">61.</td>
2619            <td colspan="1" rowspan="1">
2620              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2621              <span class="codefrag">line = line.replaceAll(pattern, "");</span>
2622            </td>
2623         
2624</tr>
2625         
2626<tr>
2627           
2628<td colspan="1" rowspan="1">62.</td>
2629            <td colspan="1" rowspan="1">
2630              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2631              <span class="codefrag">}</span>
2632            </td>
2633         
2634</tr>
2635         
2636<tr>
2637           
2638<td colspan="1" rowspan="1">63.</td>
2639            <td colspan="1" rowspan="1"></td>
2640         
2641</tr>
2642         
2643<tr>
2644           
2645<td colspan="1" rowspan="1">64.</td>
2646            <td colspan="1" rowspan="1">
2647              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2648              <span class="codefrag">StringTokenizer tokenizer = new StringTokenizer(line);</span>
2649            </td>
2650         
2651</tr>
2652         
2653<tr>
2654           
2655<td colspan="1" rowspan="1">65.</td>
2656            <td colspan="1" rowspan="1">
2657              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2658              <span class="codefrag">while (tokenizer.hasMoreTokens()) {</span>
2659            </td>
2660         
2661</tr>
2662         
2663<tr>
2664           
2665<td colspan="1" rowspan="1">66.</td>
2666            <td colspan="1" rowspan="1">
2667              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2668              <span class="codefrag">word.set(tokenizer.nextToken());</span>
2669            </td>
2670         
2671</tr>
2672         
2673<tr>
2674           
2675<td colspan="1" rowspan="1">67.</td>
2676            <td colspan="1" rowspan="1">
2677              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2678              <span class="codefrag">output.collect(word, one);</span>
2679            </td>
2680         
2681</tr>
2682         
2683<tr>
2684           
2685<td colspan="1" rowspan="1">68.</td>
2686            <td colspan="1" rowspan="1">
2687              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2688              <span class="codefrag">reporter.incrCounter(Counters.INPUT_WORDS, 1);</span>
2689            </td>
2690         
2691</tr>
2692         
2693<tr>
2694           
2695<td colspan="1" rowspan="1">69.</td>
2696            <td colspan="1" rowspan="1">
2697              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2698              <span class="codefrag">}</span>
2699            </td>
2700         
2701</tr>
2702         
2703<tr>
2704           
2705<td colspan="1" rowspan="1">70.</td>
2706            <td colspan="1" rowspan="1"></td>
2707         
2708</tr>
2709         
2710<tr>
2711           
2712<td colspan="1" rowspan="1">71.</td>
2713            <td colspan="1" rowspan="1">
2714              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2715              <span class="codefrag">if ((++numRecords % 100) == 0) {</span>
2716            </td>
2717         
2718</tr>
2719         
2720<tr>
2721           
2722<td colspan="1" rowspan="1">72.</td>
2723            <td colspan="1" rowspan="1">
2724              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2725              <span class="codefrag">
2726                reporter.setStatus("Finished processing " + numRecords +
2727                                   " records " + "from the input file: " +
2728                                   inputFile);
2729              </span>
2730            </td>
2731         
2732</tr>
2733         
2734<tr>
2735           
2736<td colspan="1" rowspan="1">73.</td>
2737            <td colspan="1" rowspan="1">
2738              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2739              <span class="codefrag">}</span>
2740            </td>
2741         
2742</tr>
2743         
2744<tr>
2745           
2746<td colspan="1" rowspan="1">74.</td>
2747            <td colspan="1" rowspan="1">
2748              &nbsp;&nbsp;&nbsp;&nbsp;
2749              <span class="codefrag">}</span>
2750            </td>
2751         
2752</tr>
2753         
2754<tr>
2755           
2756<td colspan="1" rowspan="1">75.</td>
2757            <td colspan="1" rowspan="1">
2758              &nbsp;&nbsp;
2759              <span class="codefrag">}</span>
2760            </td>
2761         
2762</tr>
2763         
2764<tr>
2765           
2766<td colspan="1" rowspan="1">76.</td>
2767            <td colspan="1" rowspan="1"></td>
2768         
2769</tr>
2770         
2771<tr>
2772           
2773<td colspan="1" rowspan="1">77.</td>
2774            <td colspan="1" rowspan="1">
2775              &nbsp;&nbsp;
2776              <span class="codefrag">
2777                public static class Reduce extends MapReduceBase implements
2778                Reducer&lt;Text, IntWritable, Text, IntWritable&gt; {
2779              </span>
2780            </td>
2781         
2782</tr>
2783         
2784<tr>
2785           
2786<td colspan="1" rowspan="1">78.</td>
2787            <td colspan="1" rowspan="1">
2788              &nbsp;&nbsp;&nbsp;&nbsp;
2789              <span class="codefrag">
2790                public void reduce(Text key, Iterator&lt;IntWritable&gt; values,
2791                OutputCollector&lt;Text, IntWritable&gt; output,
2792                Reporter reporter) throws IOException {
2793              </span>
2794            </td>
2795         
2796</tr>
2797         
2798<tr>
2799           
2800<td colspan="1" rowspan="1">79.</td>
2801            <td colspan="1" rowspan="1">
2802              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2803              <span class="codefrag">int sum = 0;</span>
2804            </td>
2805         
2806</tr>
2807         
2808<tr>
2809           
2810<td colspan="1" rowspan="1">80.</td>
2811            <td colspan="1" rowspan="1">
2812              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2813              <span class="codefrag">while (values.hasNext()) {</span>
2814            </td>
2815         
2816</tr>
2817         
2818<tr>
2819           
2820<td colspan="1" rowspan="1">81.</td>
2821            <td colspan="1" rowspan="1">
2822              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2823              <span class="codefrag">sum += values.next().get();</span>
2824            </td>
2825         
2826</tr>
2827         
2828<tr>
2829           
2830<td colspan="1" rowspan="1">82.</td>
2831            <td colspan="1" rowspan="1">
2832              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2833              <span class="codefrag">}</span>
2834            </td>
2835         
2836</tr>
2837         
2838<tr>
2839           
2840<td colspan="1" rowspan="1">83.</td>
2841            <td colspan="1" rowspan="1">
2842              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2843              <span class="codefrag">output.collect(key, new IntWritable(sum));</span>
2844            </td>
2845         
2846</tr>
2847         
2848<tr>
2849           
2850<td colspan="1" rowspan="1">84.</td>
2851            <td colspan="1" rowspan="1">
2852              &nbsp;&nbsp;&nbsp;&nbsp;
2853              <span class="codefrag">}</span>
2854            </td>
2855         
2856</tr>
2857         
2858<tr>
2859           
2860<td colspan="1" rowspan="1">85.</td>
2861            <td colspan="1" rowspan="1">
2862              &nbsp;&nbsp;
2863              <span class="codefrag">}</span>
2864            </td>
2865         
2866</tr>
2867         
2868<tr>
2869           
2870<td colspan="1" rowspan="1">86.</td>
2871            <td colspan="1" rowspan="1"></td>
2872         
2873</tr>
2874         
2875<tr>
2876           
2877<td colspan="1" rowspan="1">87.</td>
2878            <td colspan="1" rowspan="1">
2879              &nbsp;&nbsp;
2880              <span class="codefrag">public int run(String[] args) throws Exception {</span>
2881            </td>
2882         
2883</tr>
2884         
2885<tr>
2886           
2887<td colspan="1" rowspan="1">88.</td>
2888            <td colspan="1" rowspan="1">
2889              &nbsp;&nbsp;&nbsp;&nbsp;
2890              <span class="codefrag">
2891                JobConf conf = new JobConf(getConf(), WordCount.class);
2892              </span>
2893            </td>
2894         
2895</tr>
2896         
2897<tr>
2898           
2899<td colspan="1" rowspan="1">89.</td>
2900            <td colspan="1" rowspan="1">
2901              &nbsp;&nbsp;&nbsp;&nbsp;
2902              <span class="codefrag">conf.setJobName("wordcount");</span>
2903            </td>
2904         
2905</tr>
2906         
2907<tr>
2908           
2909<td colspan="1" rowspan="1">90.</td>
2910            <td colspan="1" rowspan="1"></td>
2911         
2912</tr>
2913         
2914<tr>
2915           
2916<td colspan="1" rowspan="1">91.</td>
2917            <td colspan="1" rowspan="1">
2918              &nbsp;&nbsp;&nbsp;&nbsp;
2919              <span class="codefrag">conf.setOutputKeyClass(Text.class);</span>
2920            </td>
2921         
2922</tr>
2923         
2924<tr>
2925           
2926<td colspan="1" rowspan="1">92.</td>
2927            <td colspan="1" rowspan="1">
2928              &nbsp;&nbsp;&nbsp;&nbsp;
2929              <span class="codefrag">conf.setOutputValueClass(IntWritable.class);</span>
2930            </td>
2931         
2932</tr>
2933         
2934<tr>
2935           
2936<td colspan="1" rowspan="1">93.</td>
2937            <td colspan="1" rowspan="1"></td>
2938         
2939</tr>
2940         
2941<tr>
2942           
2943<td colspan="1" rowspan="1">94.</td>
2944            <td colspan="1" rowspan="1">
2945              &nbsp;&nbsp;&nbsp;&nbsp;
2946              <span class="codefrag">conf.setMapperClass(Map.class);</span>
2947            </td>
2948         
2949</tr>
2950         
2951<tr>
2952           
2953<td colspan="1" rowspan="1">95.</td>
2954            <td colspan="1" rowspan="1">
2955              &nbsp;&nbsp;&nbsp;&nbsp;
2956              <span class="codefrag">conf.setCombinerClass(Reduce.class);</span>
2957            </td>
2958         
2959</tr>
2960         
2961<tr>
2962           
2963<td colspan="1" rowspan="1">96.</td>
2964            <td colspan="1" rowspan="1">
2965              &nbsp;&nbsp;&nbsp;&nbsp;
2966              <span class="codefrag">conf.setReducerClass(Reduce.class);</span>
2967            </td>
2968         
2969</tr>
2970         
2971<tr>
2972           
2973<td colspan="1" rowspan="1">97.</td>
2974            <td colspan="1" rowspan="1"></td>
2975         
2976</tr>
2977         
2978<tr>
2979           
2980<td colspan="1" rowspan="1">98.</td>
2981            <td colspan="1" rowspan="1">
2982              &nbsp;&nbsp;&nbsp;&nbsp;
2983              <span class="codefrag">conf.setInputFormat(TextInputFormat.class);</span>
2984            </td>
2985         
2986</tr>
2987         
2988<tr>
2989           
2990<td colspan="1" rowspan="1">99.</td>
2991            <td colspan="1" rowspan="1">
2992              &nbsp;&nbsp;&nbsp;&nbsp;
2993              <span class="codefrag">conf.setOutputFormat(TextOutputFormat.class);</span>
2994            </td>
2995         
2996</tr>
2997         
2998<tr>
2999           
3000<td colspan="1" rowspan="1">100.</td>
3001            <td colspan="1" rowspan="1"></td>
3002         
3003</tr>
3004         
3005<tr>
3006           
3007<td colspan="1" rowspan="1">101.</td>
3008            <td colspan="1" rowspan="1">
3009              &nbsp;&nbsp;&nbsp;&nbsp;
3010              <span class="codefrag">
3011                List&lt;String&gt; other_args = new ArrayList&lt;String&gt;();
3012              </span>
3013            </td>
3014         
3015</tr>
3016         
3017<tr>
3018           
3019<td colspan="1" rowspan="1">102.</td>
3020            <td colspan="1" rowspan="1">
3021              &nbsp;&nbsp;&nbsp;&nbsp;
3022              <span class="codefrag">for (int i=0; i &lt; args.length; ++i) {</span>
3023            </td>
3024         
3025</tr>
3026         
3027<tr>
3028           
3029<td colspan="1" rowspan="1">103.</td>
3030            <td colspan="1" rowspan="1">
3031              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3032              <span class="codefrag">if ("-skip".equals(args[i])) {</span>
3033            </td>
3034         
3035</tr>
3036         
3037<tr>
3038           
3039<td colspan="1" rowspan="1">104.</td>
3040            <td colspan="1" rowspan="1">
3041              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3042              <span class="codefrag">
3043                DistributedCache.addCacheFile(new Path(args[++i]).toUri(), conf);
3044              </span>
3045            </td>
3046         
3047</tr>
3048         
3049<tr>
3050           
3051<td colspan="1" rowspan="1">105.</td>
3052            <td colspan="1" rowspan="1">
3053              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3054              <span class="codefrag">
3055                conf.setBoolean("wordcount.skip.patterns", true);
3056              </span>
3057            </td>
3058         
3059</tr>
3060         
3061<tr>
3062           
3063<td colspan="1" rowspan="1">106.</td>
3064            <td colspan="1" rowspan="1">
3065              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3066              <span class="codefrag">} else {</span>
3067            </td>
3068         
3069</tr>
3070         
3071<tr>
3072           
3073<td colspan="1" rowspan="1">107.</td>
3074            <td colspan="1" rowspan="1">
3075              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3076              <span class="codefrag">other_args.add(args[i]);</span>
3077            </td>
3078         
3079</tr>
3080         
3081<tr>
3082           
3083<td colspan="1" rowspan="1">108.</td>
3084            <td colspan="1" rowspan="1">
3085              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3086              <span class="codefrag">}</span>
3087            </td>
3088         
3089</tr>
3090         
3091<tr>
3092           
3093<td colspan="1" rowspan="1">109.</td>
3094            <td colspan="1" rowspan="1">
3095              &nbsp;&nbsp;&nbsp;&nbsp;
3096              <span class="codefrag">}</span>
3097            </td>
3098         
3099</tr>
3100         
3101<tr>
3102           
3103<td colspan="1" rowspan="1">110.</td>
3104            <td colspan="1" rowspan="1"></td>
3105         
3106</tr>
3107         
3108<tr>
3109           
3110<td colspan="1" rowspan="1">111.</td>
3111            <td colspan="1" rowspan="1">
3112              &nbsp;&nbsp;&nbsp;&nbsp;
3113              <span class="codefrag">FileInputFormat.setInputPaths(conf, new Path(other_args.get(0)));</span>
3114            </td>
3115         
3116</tr>
3117         
3118<tr>
3119           
3120<td colspan="1" rowspan="1">112.</td>
3121            <td colspan="1" rowspan="1">
3122              &nbsp;&nbsp;&nbsp;&nbsp;
3123              <span class="codefrag">FileOutputFormat.setOutputPath(conf, new Path(other_args.get(1)));</span>
3124            </td>
3125         
3126</tr>
3127         
3128<tr>
3129           
3130<td colspan="1" rowspan="1">113.</td>
3131            <td colspan="1" rowspan="1"></td>
3132         
3133</tr>
3134         
3135<tr>
3136           
3137<td colspan="1" rowspan="1">114.</td>
3138            <td colspan="1" rowspan="1">
3139              &nbsp;&nbsp;&nbsp;&nbsp;
3140              <span class="codefrag">JobClient.runJob(conf);</span>
3141            </td>
3142         
3143</tr>
3144         
3145<tr>
3146           
3147<td colspan="1" rowspan="1">115.</td>
3148            <td colspan="1" rowspan="1">
3149              &nbsp;&nbsp;&nbsp;&nbsp;
3150              <span class="codefrag">return 0;</span>
3151            </td>
3152         
3153</tr>
3154         
3155<tr>
3156           
3157<td colspan="1" rowspan="1">116.</td>
3158            <td colspan="1" rowspan="1">
3159              &nbsp;&nbsp;
3160              <span class="codefrag">}</span>
3161            </td>
3162         
3163</tr>
3164         
3165<tr>
3166           
3167<td colspan="1" rowspan="1">117.</td>
3168            <td colspan="1" rowspan="1"></td>
3169         
3170</tr>
3171         
3172<tr>
3173           
3174<td colspan="1" rowspan="1">118.</td>
3175            <td colspan="1" rowspan="1">
3176              &nbsp;&nbsp;
3177              <span class="codefrag">
3178                public static void main(String[] args) throws Exception {
3179              </span>
3180            </td>
3181         
3182</tr>
3183         
3184<tr>
3185           
3186<td colspan="1" rowspan="1">119.</td>
3187            <td colspan="1" rowspan="1">
3188              &nbsp;&nbsp;&nbsp;&nbsp;
3189              <span class="codefrag">
3190                int res = ToolRunner.run(new Configuration(), new WordCount(),
3191                                         args);
3192              </span>
3193            </td>
3194         
3195</tr>
3196         
3197<tr>
3198           
3199<td colspan="1" rowspan="1">120.</td>
3200            <td colspan="1" rowspan="1">
3201              &nbsp;&nbsp;&nbsp;&nbsp;
3202              <span class="codefrag">System.exit(res);</span>
3203            </td>
3204         
3205</tr>
3206         
3207<tr>
3208           
3209<td colspan="1" rowspan="1">121.</td>
3210            <td colspan="1" rowspan="1">
3211              &nbsp;&nbsp;
3212              <span class="codefrag">}</span>
3213            </td>
3214         
3215</tr>
3216         
3217<tr>
3218           
3219<td colspan="1" rowspan="1">122.</td>
3220            <td colspan="1" rowspan="1">
3221              <span class="codefrag">}</span>
3222            </td>
3223         
3224</tr>
3225         
3226<tr>
3227           
3228<td colspan="1" rowspan="1">123.</td>
3229            <td colspan="1" rowspan="1"></td>
3230         
3231</tr>
3232       
3233</table>
3234<a name="N11522"></a><a name="%E8%BF%90%E8%A1%8C%E6%A0%B7%E4%BE%8B"></a>
3235<h3 class="h4">运行样䟋</h3>
3236<p>蟓入样䟋</p>
3237<p>
3238         
3239<span class="codefrag">$ bin/hadoop dfs -ls /usr/joe/wordcount/input/</span>
3240<br>
3241         
3242<span class="codefrag">/usr/joe/wordcount/input/file01</span>
3243<br>
3244         
3245<span class="codefrag">/usr/joe/wordcount/input/file02</span>
3246<br>
3247         
3248<br>
3249         
3250<span class="codefrag">$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01</span>
3251<br>
3252         
3253<span class="codefrag">Hello World, Bye World!</span>
3254<br>
3255         
3256<br>
3257         
3258<span class="codefrag">$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02</span>
3259<br>
3260         
3261<span class="codefrag">Hello Hadoop, Goodbye to hadoop.</span>
3262       
3263</p>
3264<p>运行皋序</p>
3265<p>
3266         
3267<span class="codefrag">
3268            $ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount
3269              /usr/joe/wordcount/input /usr/joe/wordcount/output
3270          </span>
3271       
3272</p>
3273<p>蟓出</p>
3274<p>
3275         
3276<span class="codefrag">
3277            $ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000
3278          </span>
3279         
3280<br>
3281         
3282<span class="codefrag">Bye    1</span>
3283<br>
3284         
3285<span class="codefrag">Goodbye    1</span>
3286<br>
3287         
3288<span class="codefrag">Hadoop,    1</span>
3289<br>
3290         
3291<span class="codefrag">Hello    2</span>
3292<br>
3293         
3294<span class="codefrag">World!    1</span>
3295<br>
3296         
3297<span class="codefrag">World,    1</span>
3298<br>
3299         
3300<span class="codefrag">hadoop.    1</span>
3301<br>
3302         
3303<span class="codefrag">to    1</span>
3304<br>
3305       
3306</p>
3307<p>泚意歀时的蟓入䞎第䞀䞪版本的䞍同蟓出的结果也有䞍同。
3308        </p>
3309<p>现圚通过<span class="codefrag">DistributedCache</span>插入䞀䞪暡匏文件文件䞭保存了芁被応略的单词暡匏。
3310        </p>
3311<p>
3312         
3313<span class="codefrag">$ hadoop dfs -cat /user/joe/wordcount/patterns.txt</span>
3314<br>
3315         
3316<span class="codefrag">\.</span>
3317<br>
3318         
3319<span class="codefrag">\,</span>
3320<br>
3321         
3322<span class="codefrag">\!</span>
3323<br>
3324         
3325<span class="codefrag">to</span>
3326<br>
3327       
3328</p>
3329<p>再运行䞀次这次䜿甚曎倚的选项</p>
3330<p>
3331         
3332<span class="codefrag">
3333            $ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount
3334              -Dwordcount.case.sensitive=true /usr/joe/wordcount/input
3335              /usr/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt
3336          </span>
3337       
3338</p>
3339<p>应该埗到这样的蟓出</p>
3340<p>
3341         
3342<span class="codefrag">
3343            $ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000
3344          </span>
3345         
3346<br>
3347         
3348<span class="codefrag">Bye    1</span>
3349<br>
3350         
3351<span class="codefrag">Goodbye    1</span>
3352<br>
3353         
3354<span class="codefrag">Hadoop    1</span>
3355<br>
3356         
3357<span class="codefrag">Hello    2</span>
3358<br>
3359         
3360<span class="codefrag">World    2</span>
3361<br>
3362         
3363<span class="codefrag">hadoop    1</span>
3364<br>
3365       
3366</p>
3367<p>再运行䞀次这䞀次关闭倧小写敏感性case-sensitivity</p>
3368<p>
3369         
3370<span class="codefrag">
3371            $ bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount
3372              -Dwordcount.case.sensitive=false /usr/joe/wordcount/input
3373              /usr/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt
3374          </span>
3375       
3376</p>
3377<p>蟓出</p>
3378<p>
3379         
3380<span class="codefrag">
3381            $ bin/hadoop dfs -cat /usr/joe/wordcount/output/part-00000
3382          </span>
3383         
3384<br>
3385         
3386<span class="codefrag">bye    1</span>
3387<br>
3388         
3389<span class="codefrag">goodbye    1</span>
3390<br>
3391         
3392<span class="codefrag">hadoop    2</span>
3393<br>
3394         
3395<span class="codefrag">hello    2</span>
3396<br>
3397         
3398<span class="codefrag">world    2</span>
3399<br>
3400       
3401</p>
3402<a name="N115F6"></a><a name="%E7%A8%8B%E5%BA%8F%E8%A6%81%E7%82%B9"></a>
3403<h3 class="h4">皋序芁点</h3>
3404<p>
3405        通过䜿甚䞀些Map/Reduce框架提䟛的功胜<span class="codefrag">WordCount</span>的第二䞪版本圚原始版本基础䞊有了劂䞋的改进
3406        </p>
3407<ul>
3408         
3409<li>
3410            展瀺了应甚皋序劂䜕圚<span class="codefrag">Mapper</span> (和<span class="codefrag">Reducer</span>)䞭通过<span class="codefrag">configure</span>方法
3411                修改配眮参数(28-43行)。
3412          </li>
3413         
3414<li>
3415            展瀺了䜜䞚劂䜕䜿甚<span class="codefrag">DistributedCache</span> æ¥åˆ†å‘只读数据。
3416        这里允讞甚户指定单词的暡匏圚计数时応略那些笊合暡匏的单词(104行)。
3417          </li>
3418         
3419<li>
3420        展瀺<span class="codefrag">Tool</span>接口和<span class="codefrag">GenericOptionsParser</span>倄理Hadoop呜什行选项的功胜
3421            (87-116, 119行)。
3422          </li>
3423         
3424<li>
3425        展瀺了应甚皋序劂䜕䜿甚<span class="codefrag">Counters</span>(68行)劂䜕通过䌠递给<span class="codefrag">map</span>和<span class="codefrag">reduce</span>
3426        方法的<span class="codefrag">Reporter</span>实䟋来讟眮应甚皋序的状态信息(72行)。
3427          </li>
3428       
3429</ul>
3430</div>
3431
3432   
3433<p>
3434     
3435<em>Java和JNI是Sun Microsystems, Inc.圚矎囜和其它囜家的泚册商标。</em>
3436   
3437</p>
3438   
3439 
3440</div>
3441<!--+
3442    |end content
3443    +-->
3444<div class="clearboth">&nbsp;</div>
3445</div>
3446<div id="footer">
3447<!--+
3448    |start bottomstrip
3449    +-->
3450<div class="lastmodified">
3451<script type="text/javascript"><!--
3452document.write("Last Published: " + document.lastModified);
3453//  --></script>
3454</div>
3455<div class="copyright">
3456        Copyright &copy;
3457         2007 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
3458</div>
3459<!--+
3460    |end bottomstrip
3461    +-->
3462</div>
3463</body>
3464</html>
Note: See TracBrowser for help on using the repository browser.