source: proiecte/HadoopJUnit/hadoop-0.20.1/docs/cn/streaming.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: 39.6 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<meta name="http-equiv" content="Content-Type">
9<meta name="content" content="text/html;">
10<meta name="charset" content="utf-8">
11<title>Hadoop Streaming</title>
12<link type="text/css" href="skin/basic.css" rel="stylesheet">
13<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
14<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
15<link type="text/css" href="skin/profile.css" rel="stylesheet">
16<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>
17<link rel="shortcut icon" href="images/favicon.ico">
18</head>
19<body onload="init()">
20<script type="text/javascript">ndeSetTextSize();</script>
21<div id="top">
22<!--+
23    |breadtrail
24    +-->
25<div class="breadtrail">
26<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>
27</div>
28<!--+
29    |header
30    +-->
31<div class="header">
32<!--+
33    |start group logo
34    +-->
35<div class="grouplogo">
36<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
37</div>
38<!--+
39    |end group logo
40    +-->
41<!--+
42    |start Project Logo
43    +-->
44<div class="projectlogo">
45<a href="http://hadoop.apache.org/core/"><img class="logoImage" alt="Hadoop" src="images/core-logo.gif" title="Scalable Computing Platform"></a>
46</div>
47<!--+
48    |end Project Logo
49    +-->
50<!--+
51    |start Search
52    +-->
53<div class="searchbox">
54<form action="http://www.google.com/search" method="get" class="roundtopsmall">
55<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; 
56                    <input name="Search" value="Search" type="submit">
57</form>
58</div>
59<!--+
60    |end search
61    +-->
62<!--+
63    |start Tabs
64    +-->
65<ul id="tabs">
66<li>
67<a class="unselected" href="http://hadoop.apache.org/core/">项目</a>
68</li>
69<li>
70<a class="unselected" href="http://wiki.apache.org/hadoop">绎基</a>
71</li>
72<li class="current">
73<a class="selected" href="index.html">Hadoop 0.18文档</a>
74</li>
75</ul>
76<!--+
77    |end Tabs
78    +-->
79</div>
80</div>
81<div id="main">
82<div id="publishedStrip">
83<!--+
84    |start Subtabs
85    +-->
86<div id="level2tabs"></div>
87<!--+
88    |end Endtabs
89    +-->
90<script type="text/javascript"><!--
91document.write("Last Published: " + document.lastModified);
92//  --></script>
93</div>
94<!--+
95    |breadtrail
96    +-->
97<div class="breadtrail">
98
99             &nbsp;
100           </div>
101<!--+
102    |start Menu, mainarea
103    +-->
104<!--+
105    |start Menu
106    +-->
107<div id="menu">
108<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>
109<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
110<div class="menuitem">
111<a href="index.html">抂述</a>
112</div>
113<div class="menuitem">
114<a href="quickstart.html">快速入闚</a>
115</div>
116<div class="menuitem">
117<a href="cluster_setup.html">集矀搭建</a>
118</div>
119<div class="menuitem">
120<a href="hdfs_design.html">HDFS构架讟计</a>
121</div>
122<div class="menuitem">
123<a href="hdfs_user_guide.html">HDFS䜿甚指南</a>
124</div>
125<div class="menuitem">
126<a href="hdfs_permissions_guide.html">HDFS权限指南</a>
127</div>
128<div class="menuitem">
129<a href="hdfs_quota_admin_guide.html">HDFS配额管理指南</a>
130</div>
131<div class="menuitem">
132<a href="commands_manual.html">呜什手册</a>
133</div>
134<div class="menuitem">
135<a href="hdfs_shell.html">FS Shell䜿甚指南</a>
136</div>
137<div class="menuitem">
138<a href="distcp.html">DistCp䜿甚指南</a>
139</div>
140<div class="menuitem">
141<a href="mapred_tutorial.html">Map-Reduce教皋</a>
142</div>
143<div class="menuitem">
144<a href="native_libraries.html">Hadoop本地库</a>
145</div>
146<div class="menupage">
147<div class="menupagetitle">Streaming</div>
148</div>
149<div class="menuitem">
150<a href="hadoop_archives.html">Hadoop Archives</a>
151</div>
152<div class="menuitem">
153<a href="hod.html">Hadoop On Demand</a>
154</div>
155<div class="menuitem">
156<a href="http://hadoop.apache.org/core/docs/r0.18.2/api/index.html">API参考</a>
157</div>
158<div class="menuitem">
159<a href="http://hadoop.apache.org/core/docs/r0.18.2/jdiff/changes.html">API Changes</a>
160</div>
161<div class="menuitem">
162<a href="http://wiki.apache.org/hadoop/">绎基</a>
163</div>
164<div class="menuitem">
165<a href="http://wiki.apache.org/hadoop/FAQ">垞见问题</a>
166</div>
167<div class="menuitem">
168<a href="http://hadoop.apache.org/core/mailing_lists.html">邮件列衚</a>
169</div>
170<div class="menuitem">
171<a href="http://hadoop.apache.org/core/docs/r0.18.2/releasenotes.html">发行诎明</a>
172</div>
173<div class="menuitem">
174<a href="http://hadoop.apache.org/core/docs/r0.18.2/changes.html">变曎日志</a>
175</div>
176</div>
177<div id="credit"></div>
178<div id="roundbottom">
179<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
180<!--+
181  |alternative credits
182  +-->
183<div id="credit2"></div>
184</div>
185<!--+
186    |end Menu
187    +-->
188<!--+
189    |start content
190    +-->
191<div id="content">
192<div title="Portable Document Format" class="pdflink">
193<a class="dida" href="streaming.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
194        PDF</a>
195</div>
196<h1>Hadoop Streaming</h1>
197<div id="minitoc-area">
198<ul class="minitoc">
199<li>
200<a href="#Hadoop+Streaming">Hadoop Streaming</a>
201</li>
202<li>
203<a href="#Streaming%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">Streaming工䜜原理</a>
204</li>
205<li>
206<a href="#%E5%B0%86%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E5%88%B0%E6%8F%90%E4%BA%A4%E7%9A%84%E4%BD%9C%E4%B8%9A%E4%B8%AD">将文件打包到提亀的䜜䞚䞭</a>
207</li>
208<li>
209<a href="#Streaming%E9%80%89%E9%A1%B9%E4%B8%8E%E7%94%A8%E6%B3%95">Streaming选项䞎甚法</a>
210<ul class="minitoc">
211<li>
212<a href="#%E5%8F%AA%E4%BD%BF%E7%94%A8Mapper%E7%9A%84%E4%BD%9C%E4%B8%9A">只䜿甚Mapper的䜜䞚</a>
213</li>
214<li>
215<a href="#%E4%B8%BA%E4%BD%9C%E4%B8%9A%E6%8C%87%E5%AE%9A%E5%85%B6%E4%BB%96%E6%8F%92%E4%BB%B6">䞺䜜䞚指定其他插件</a>
216</li>
217<li>
218<a href="#Hadoop+Streaming%E4%B8%AD%E7%9A%84%E5%A4%A7%E6%96%87%E4%BB%B6%E5%92%8C%E6%A1%A3%E6%A1%88">Hadoop Streaming䞭的倧文件和档案</a>
219</li>
220<li>
221<a href="#%E4%B8%BA%E4%BD%9C%E4%B8%9A%E6%8C%87%E5%AE%9A%E9%99%84%E5%8A%A0%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0">䞺䜜䞚指定附加配眮参数</a>
222</li>
223<li>
224<a href="#%E5%85%B6%E4%BB%96%E9%80%89%E9%A1%B9">其他选项</a>
225</li>
226</ul>
227</li>
228<li>
229<a href="#%E5%85%B6%E4%BB%96%E4%BE%8B%E5%AD%90">其他䟋子</a>
230<ul class="minitoc">
231<li>
232<a href="#%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%B9%E6%B3%95%E5%88%87%E5%88%86%E8%A1%8C%E6%9D%A5%E5%BD%A2%E6%88%90Key%2FValue%E5%AF%B9">䜿甚自定义的方法切分行来圢成Key/Value对</a>
233</li>
234<li>
235<a href="#%E4%B8%80%E4%B8%AA%E5%AE%9E%E7%94%A8%E7%9A%84Partitioner%E7%B1%BB">䞀䞪实甚的Partitionerç±» 二次排序-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 选项 </a>
236</li>
237<li>
238<a href="#Hadoop%E8%81%9A%E5%90%88%E5%8A%9F%E8%83%BD%E5%8C%85%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88-reduce+aggregate+%E9%80%89%E9%A1%B9%EF%BC%89">Hadoop聚合功胜包的䜿甚-reduce aggregate 选项</a>
239</li>
240<li>
241<a href="#%E5%AD%97%E6%AE%B5%E7%9A%84%E9%80%89%E5%8F%96%EF%BC%88%E7%B1%BB%E4%BC%BC%E4%BA%8Eunix%E4%B8%AD%E7%9A%84+%27cut%27+%E5%91%BD%E4%BB%A4%EF%BC%89">字段的选取类䌌于unix侭的 'cut' 呜什 </a>
242</li>
243</ul>
244</li>
245<li>
246<a href="#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">垞见问题</a>
247<ul class="minitoc">
248<li>
249<a href="#%E6%88%91%E8%AF%A5%E6%80%8E%E6%A0%B7%E4%BD%BF%E7%94%A8Hadoop+Streaming%E8%BF%90%E8%A1%8C%E4%B8%80%E7%BB%84%E7%8B%AC%E7%AB%8B%EF%BC%88%E7%9B%B8%E5%85%B3%EF%BC%89%E7%9A%84%E4%BB%BB%E5%8A%A1%E5%91%A2%EF%BC%9F">我该怎样䜿甚Hadoop Streaming运行䞀组独立盞关的任务呢</a>
250</li>
251<li>
252<a href="#%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E5%85%B6%E4%B8%AD%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%80%E4%B8%AAmap%EF%BC%9F">劂䜕倄理倚䞪文件其䞭每䞪文件䞀䞪map</a>
253</li>
254<li>
255<a href="#%E5%BA%94%E8%AF%A5%E4%BD%BF%E7%94%A8%E5%A4%9A%E5%B0%91%E4%B8%AAreducer%EF%BC%9F">应该䜿甚倚少䞪reducer</a>
256</li>
257<li>
258<a href="#%E5%A6%82%E6%9E%9C%E5%9C%A8Shell%E8%84%9A%E6%9C%AC%E9%87%8C%E8%AE%BE%E7%BD%AE%E4%B8%80%E4%B8%AA%E5%88%AB%E5%90%8D%EF%BC%8C%E5%B9%B6%E6%94%BE%E5%9C%A8-mapper%E4%B9%8B%E5%90%8E%EF%BC%8CStreaming%E4%BC%9A%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C%E5%90%97%EF%BC%9F%0A%E4%BE%8B%E5%A6%82%EF%BC%8Calias+cl%3D%27cut+-fl%27%EF%BC%8C-mapper+%22cl%22%E4%BC%9A%E8%BF%90%E8%A1%8C%E6%AD%A3%E5%B8%B8%E5%90%97%EF%BC%9F">
259劂果圚Shell脚本里讟眮䞀䞪别名并攟圚-mapper之后Streaming䌚正垞运行吗
260䟋劂alias cl='cut -fl'-mapper "cl"䌚运行正垞吗
261</a>
262</li>
263<li>
264<a href="#%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8UNIX+pipes%E5%90%97%EF%BC%9F%E4%BE%8B%E5%A6%82+%E2%80%93mapper+%22cut+%E2%80%93fl+%7C+set+s%2Ffoo%2Fbar%2Fg%22%E7%AE%A1%E7%94%A8%E4%B9%88%EF%BC%9F">
265我可以䜿甚UNIX pipes吗䟋劂 &ndash;mapper "cut &ndash;fl | set s/foo/bar/g"管甚么
266</a>
267</li>
268<li>
269<a href="#%E5%9C%A8streaming%E4%BD%9C%E4%B8%9A%E4%B8%AD%E7%94%A8-file%E9%80%89%E9%A1%B9%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA">圚streaming䜜䞚䞭甚-file选项运行䞀䞪分垃匏的超倧可执行文件䟋劂3.6G时
270我埗到了䞀䞪错误信息&ldquo;No space left on device&rdquo;。劂䜕解决
271</a>
272</li>
273<li>
274<a href="#%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E5%A4%9A%E4%B8%AA%E8%BE%93%E5%85%A5%E7%9B%AE%E5%BD%95%EF%BC%9F">劂䜕讟眮倚䞪蟓入目圕</a>
275</li>
276<li>
277<a href="#%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90gzip%E6%A0%BC%E5%BC%8F%E7%9A%84%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%EF%BC%9F">劂䜕生成gzip栌匏的蟓出文件</a>
278</li>
279<li>
280<a href="#Streaming%E4%B8%AD%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89input%2Foutput+format%EF%BC%9F">Streaming䞭劂䜕自定义input/output format</a>
281</li>
282<li>
283<a href="#Streaming%E5%A6%82%E4%BD%95%E8%A7%A3%E6%9E%90XML%E6%96%87%E6%A1%A3%EF%BC%9F">Streaming劂䜕解析XML文档</a>
284</li>
285<li>
286<a href="#%E5%9C%A8streaming%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%E8%AE%A1%E6%95%B0%E5%99%A8%EF%BC%9F">圚streaming应甚皋序䞭劂䜕曎新计数噚</a>
287</li>
288<li>
289<a href="#%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0streaming%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%8A%B6%E6%80%81%EF%BC%9F">劂䜕曎新streaming应甚皋序的状态</a>
290</li>
291</ul>
292</li>
293</ul>
294</div>
295
296<a name="N10019"></a><a name="Hadoop+Streaming"></a>
297<h2 class="h3">Hadoop Streaming</h2>
298<div class="section">
299<p>
300Hadoop streaming是Hadoop的䞀䞪工具
301    它垮助甚户创建和运行䞀类特殊的map/reduce䜜䞚
302    这些特殊的map/reduce䜜䞚是由䞀些可执行文件或脚本文件充圓mapper或者reducer。䟋劂
303</p>
304<pre class="code">
305$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
306    -input myInputDirs \
307    -output myOutputDir \
308    -mapper /bin/cat \
309    -reducer /bin/wc
310</pre>
311</div>
312
313
314<a name="N10027"></a><a name="Streaming%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86"></a>
315<h2 class="h3">Streaming工䜜原理</h2>
316<div class="section">
317<p>
318圚䞊面的䟋子里mapper和reducer郜是可执行文件它们从标准蟓入读入数据䞀行䞀行读
319并把计算结果发给标准蟓出。Streaming工具䌚创建䞀䞪Map/Reduce䜜䞚
320并把它发送给合适的集矀同时监视这䞪䜜䞚的敎䞪执行过皋。
321</p>
322<p>
323劂果䞀䞪可执行文件被甚于mapper则圚mapper初始化时
324每䞀䞪mapper任务䌚把这䞪可执行文件䜜䞺䞀䞪单独的进皋启劚。
325mapper任务运行时它把蟓入切分成行并把每䞀行提䟛给可执行文件进皋的标准蟓入。
326同时mapper收集可执行文件进皋标准蟓出的内容并把收到的每䞀行内容蜬化成key/value对䜜䞺mapper的蟓出。
327默讀情况䞋䞀行䞭第䞀䞪tab之前的郚分䜜䞺<strong>key</strong>之后的䞍包括tab䜜䞺<strong>value</strong>。
328劂果没有tab敎行䜜䞺key倌value倌䞺null。䞍过这可以定制圚䞋文䞭将䌚讚论劂䜕自定义key和value的切分方匏。
329</p>
330<p>劂果䞀䞪可执行文件被甚于reducer每䞪reducer任务䌚把这䞪可执行文件䜜䞺䞀䞪单独的进皋启劚。
331Reducer任务运行时它把蟓入切分成行并把每䞀行提䟛给可执行文件进皋的标准蟓入。
332同时reducer收集可执行文件进皋标准蟓出的内容并把每䞀行内容蜬化成key/value对䜜䞺reducer的蟓出。
333默讀情况䞋䞀行䞭第䞀䞪tab之前的郚分䜜䞺key之后的䞍包括tab䜜䞺value。圚䞋文䞭将䌚讚论劂䜕自定义key和value的切分方匏。
334</p>
335<p>
336这是Map/Reduce框架和streaming mapper/reducer之闎的基本通信协议。
337</p>
338<p>
339甚户也可以䜿甚java类䜜䞺mapper或者reducer。䞊面的䟋子䞎这里的代码等价
340</p>
341<pre class="code">
342$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
343    -input myInputDirs \
344    -output myOutputDir \
345    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
346    -reducer /bin/wc
347</pre>
348<p>甚户可以讟定<span class="codefrag">stream.non.zero.exit.is.failure</span> 
349<span class="codefrag">true</span> æˆ–<span class="codefrag">false</span> æ¥è¡šæ˜Žstreaming task的返回倌非零时是
350<span class="codefrag">Failure</span> 
351还是<span class="codefrag">Success</span>。默讀情况streaming task返回非零时衚瀺倱莥。
352</p>
353</div>
354
355
356<a name="N10056"></a><a name="%E5%B0%86%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85%E5%88%B0%E6%8F%90%E4%BA%A4%E7%9A%84%E4%BD%9C%E4%B8%9A%E4%B8%AD"></a>
357<h2 class="h3">将文件打包到提亀的䜜䞚䞭</h2>
358<div class="section">
359<p>
360任䜕可执行文件郜可以被指定䞺mapper/reducer。这些可执行文件䞍需芁事先存攟圚集矀䞊
361劂果圚集矀䞊还没有则需芁甚-file选项让framework把可执行文件䜜䞺䜜䞚的䞀郚分䞀起打包提亀。䟋劂
362</p>
363<pre class="code">
364$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
365    -input myInputDirs \
366    -output myOutputDir \
367    -mapper myPythonScript.py \
368    -reducer /bin/wc \
369    -file myPythonScript.py
370</pre>
371<p> 
372䞊面的䟋子描述了䞀䞪甚户把可执行python文件䜜䞺mapper。
373其䞭的选项&ldquo;-file myPythonScirpt.py&rdquo;䜿可执行python文件䜜䞺䜜䞚提亀的䞀郚分被䞊䌠到集矀的机噚䞊。
374</p>
375<p>
376陀了可执行文件倖其他mapper或reducer需芁甚到的蟅助文件比劂字兞配眮文件等也可以甚这种方匏打包䞊䌠。䟋劂
377</p>
378<pre class="code">
379$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
380    -input myInputDirs \
381    -output myOutputDir \
382    -mapper myPythonScript.py \
383    -reducer /bin/wc \
384    -file myPythonScript.py \
385    -file myDictionary.txt
386</pre>
387</div>
388
389
390<a name="N1006E"></a><a name="Streaming%E9%80%89%E9%A1%B9%E4%B8%8E%E7%94%A8%E6%B3%95"></a>
391<h2 class="h3">Streaming选项䞎甚法</h2>
392<div class="section">
393<a name="N10074"></a><a name="%E5%8F%AA%E4%BD%BF%E7%94%A8Mapper%E7%9A%84%E4%BD%9C%E4%B8%9A"></a>
394<h3 class="h4">只䜿甚Mapper的䜜䞚</h3>
395<p>
396有时只需芁map凜数倄理蟓入数据。这时只需把mapred.reduce.tasks讟眮䞺零Map/reduce框架就䞍䌚创建reducer任务mapper任务的蟓出就是敎䞪䜜䞚的最终蟓出。
397</p>
398<p>
399䞺了做到向䞋兌容Hadoop Streaming也支持&ldquo;-reduce None&rdquo;选项它䞎&ldquo;-jobconf mapred.reduce.tasks=0&rdquo;等价。
400</p>
401<a name="N10080"></a><a name="%E4%B8%BA%E4%BD%9C%E4%B8%9A%E6%8C%87%E5%AE%9A%E5%85%B6%E4%BB%96%E6%8F%92%E4%BB%B6"></a>
402<h3 class="h4">䞺䜜䞚指定其他插件</h3>
403<p>
404和其他普通的Map/Reduce䜜䞚䞀样甚户可以䞺streaming䜜䞚指定其他插件
405</p>
406<pre class="code">
407   -inputformat JavaClassName
408   -outputformat JavaClassName
409   -partitioner JavaClassName
410   -combiner JavaClassName
411</pre>
412<p>甚于倄理蟓入栌匏的类芁胜返回Text类型的key/value对。劂果䞍指定蟓入栌匏则默讀䌚䜿甚TextInputFormat。
413因䞺TextInputFormat埗到的key倌是LongWritable类型的其实key倌并䞍是蟓入文件䞭的内容而是value偏移量
414所以key䌚被䞢匃只把value甚管道方匏发给mapper。
415</p>
416<p>
417甚户提䟛的定义蟓出栌匏的类需芁胜借倄理Text类型的key/value对。劂果䞍指定蟓出栌匏则默讀䌚䜿甚TextOutputFormat类。
418</p>
419<a name="N10093"></a><a name="Hadoop+Streaming%E4%B8%AD%E7%9A%84%E5%A4%A7%E6%96%87%E4%BB%B6%E5%92%8C%E6%A1%A3%E6%A1%88"></a>
420<h3 class="h4">Hadoop Streaming䞭的倧文件和档案</h3>
421<p>任务䜿甚-cacheFile和-cacheArchive选项圚集矀䞭分发文件和档案选项的参数是甚户已䞊䌠至HDFS的文件或档案的URI。这些文件和档案圚䞍同的䜜䞚闎猓存。甚户可以通过fs.default.name.config配眮参数的倌埗到文件所圚的host和fs_port。
422</p>
423<p>
424这䞪是䜿甚-cacheFile选项的䟋子
425</p>
426<pre class="code">
427-cacheFile hdfs://host:fs_port/user/testfile.txt#testlink
428</pre>
429<p>圚䞊面的䟋子里urläž­#后面的郚分是建立圚任务圓前工䜜目圕䞋的笊号铟接的名字。这里的任务的圓前工䜜目圕䞋有䞀䞪&ldquo;testlink&rdquo;笊号铟接它指向testfile.txt文件圚本地的拷莝。劂果有倚䞪文件选项可以写成
430</p>
431<pre class="code">
432-cacheFile hdfs://host:fs_port/user/testfile1.txt#testlink1 -cacheFile hdfs://host:fs_port/user/testfile2.txt#testlink2
433</pre>
434<p>
435-cacheArchive选项甚于把jar文件拷莝到任务圓前工䜜目圕并自劚把jar文件解压猩。䟋劂
436</p>
437<pre class="code">
438-cacheArchive hdfs://host:fs_port/user/testfile.jar#testlink3
439</pre>
440<p>
441圚䞊面的䟋子䞭testlink3是圓前工䜜目圕䞋的笊号铟接它指向testfile.jar解压后的目圕。
442</p>
443<p>
444䞋面是䜿甚-cacheArchive选项的及䞀䞪䟋子。其䞭input.txt文件有䞀行内容分别是䞀䞪文件的名字testlink/cache.txt和testlink/cache2.txt。&ldquo;testlink&rdquo;是指向档案目圕jar文件解压后的目圕的笊号铟接这䞪目圕䞋有&ldquo;cache.txt&rdquo;和&ldquo;cache2.txt&rdquo;䞀䞪文件。
445</p>
446<pre class="code">
447$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
448                  -input "/user/me/samples/cachefile/input.txt"  \
449                  -mapper "xargs cat"  \
450                  -reducer "cat"  \
451                  -output "/user/me/samples/cachefile/out" \ 
452                  -cacheArchive 'hdfs://hadoop-nn1.example.com/user/me/samples/cachefile/cachedir.jar#testlink' \ 
453                  -jobconf mapred.map.tasks=1 \
454                  -jobconf mapred.reduce.tasks=1 \
455                  -jobconf mapred.job.name="Experiment"
456
457$ ls test_jar/
458cache.txt  cache2.txt
459
460$ jar cvf cachedir.jar -C test_jar/ .
461added manifest
462adding: cache.txt(in = 30) (out= 29)(deflated 3%)
463adding: cache2.txt(in = 37) (out= 35)(deflated 5%)
464
465$ hadoop dfs -put cachedir.jar samples/cachefile
466
467$ hadoop dfs -cat /user/me/samples/cachefile/input.txt
468testlink/cache.txt
469testlink/cache2.txt
470
471$ cat test_jar/cache.txt
472This is just the cache string
473
474$ cat test_jar/cache2.txt
475This is just the second cache string
476
477$ hadoop dfs -ls /user/me/samples/cachefile/out     
478Found 1 items
479/user/me/samples/cachefile/out/part-00000  &lt;r 3&gt;   69
480
481$ hadoop dfs -cat /user/me/samples/cachefile/out/part-00000
482This is just the cache string   
483This is just the second cache string
484
485</pre>
486<a name="N100BC"></a><a name="%E4%B8%BA%E4%BD%9C%E4%B8%9A%E6%8C%87%E5%AE%9A%E9%99%84%E5%8A%A0%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0"></a>
487<h3 class="h4">䞺䜜䞚指定附加配眮参数</h3>
488<p>
489甚户可以䜿甚&ldquo;-jobconf  &lt;n&gt;=&lt;v&gt;&rdquo;增加䞀些配眮变量。䟋劂
490</p>
491<pre class="code">
492$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
493    -input myInputDirs \
494    -output myOutputDir \
495    -mapper org.apache.hadoop.mapred.lib.IdentityMapper\
496    -reducer /bin/wc \
497    -jobconf mapred.reduce.tasks=2
498</pre>
499<p>
500䞊面的䟋子䞭-jobconf mapred.reduce.tasks=2衚明甚䞀䞪reducer完成䜜䞚。
501</p>
502<p>
503关于jobconf参数的曎倚细节可以参考<a href="http://hadoop.apache.org/core/docs/current/hadoop-default.html">hadoop-default.html</a>
504</p>
505<a name="N100D3"></a><a name="%E5%85%B6%E4%BB%96%E9%80%89%E9%A1%B9"></a>
506<h3 class="h4">其他选项</h3>
507<p>
508Streaming 䜜䞚的其他选项劂䞋衚
509</p>
510<table class="ForrestTable" cellspacing="1" cellpadding="4">
511
512<tr>
513<th colspan="1" rowspan="1">选项</th><th colspan="1" rowspan="1">可选/必须</th><th colspan="1" rowspan="1">描述</th>
514</tr>
515
516<tr>
517<td colspan="1" rowspan="1"> -cluster name </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> åœšæœ¬åœ°Hadoop集矀䞎䞀䞪或倚䞪远皋集矀闎切换</td>
518</tr>
519
520
521<tr>
522<td colspan="1" rowspan="1"> -dfs  host:port or local </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> èŠ†ç›–䜜䞚的HDFS配眮</td>
523</tr>
524
525<tr>
526<td colspan="1" rowspan="1"> -jt host:port or local </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> èŠ†ç›–䜜䞚的JobTracker配眮</td>
527</tr>
528
529<tr>
530<td colspan="1" rowspan="1"> -additionalconfspec specfile </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> ç”šäž€äžªç±»äŒŒäºŽhadoop-site.xml的XML文件保存所有配眮从而䞍需芁甚倚䞪"-jobconf name=value"类型的选项单独䞺每䞪配眮变量赋倌</td>
531</tr>
532
533<tr>
534<td colspan="1" rowspan="1"> -cmdenv   name=value </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> äŒ é€’环境变量给streaming呜什</td>
535</tr>
536
537<tr>
538<td colspan="1" rowspan="1"> -cacheFile fileNameURI </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> æŒ‡å®šäž€äžªäžŠäŒ åˆ°HDFS的文件</td>
539</tr>
540
541<tr>
542<td colspan="1" rowspan="1"> -cacheArchive fileNameURI </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> æŒ‡å®šäž€äžªäžŠäŒ åˆ°HDFS的jar文件这䞪jar文件䌚被自劚解压猩到圓前工䜜目圕䞋</td>
543</tr>
544
545
546<tr>
547<td colspan="1" rowspan="1"> -inputreader JavaClassName </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> äžºäº†å‘䞋兌容指定䞀䞪record reader类而䞍是input format类</td>
548</tr>
549
550<tr>
551<td colspan="1" rowspan="1"> -verbose </td><td colspan="1" rowspan="1"> å¯é€‰ </td><td colspan="1" rowspan="1"> è¯Šç»†èŸ“出 </td>
552</tr>
553
554</table>
555<p>
556䜿甚-cluster &lt;name&gt;实现&ldquo;本地&rdquo;Hadoop和䞀䞪或倚䞪远皋Hadoop集矀闎切换。默讀情况䞋䜿甚hadoop-default.xml和hadoop-site.xml圓䜿甚-cluster &lt;name&gt;选项时䌚䜿甚$HADOOP_HOME/conf/hadoop-&lt;name&gt;.xml。
557</p>
558<p>
559䞋面的选项改变temp目圕
560</p>
561<pre class="code">
562  -jobconf dfs.data.dir=/tmp
563</pre>
564<p>
565䞋面的选项指定其他本地temp目圕
566</p>
567<pre class="code">
568   -jobconf mapred.local.dir=/tmp/local
569   -jobconf mapred.system.dir=/tmp/system
570   -jobconf mapred.temp.dir=/tmp/temp
571</pre>
572<p>
573曎倚有关jobconf的细节请参考<a href="http://wiki.apache.org/hadoop/JobConfFile">http://wiki.apache.org/hadoop/JobConfFile</a>
574
575</p>
576<p>
577圚streaming呜什䞭讟眮环境变量
578</p>
579<pre class="code">
580-cmdenv EXAMPLE_DIR=/home/example/dictionaries/
581</pre>
582</div>
583
584
585<a name="N1018B"></a><a name="%E5%85%B6%E4%BB%96%E4%BE%8B%E5%AD%90"></a>
586<h2 class="h3">其他䟋子</h2>
587<div class="section">
588<a name="N10191"></a><a name="%E4%BD%BF%E7%94%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%B9%E6%B3%95%E5%88%87%E5%88%86%E8%A1%8C%E6%9D%A5%E5%BD%A2%E6%88%90Key%2FValue%E5%AF%B9"></a>
589<h3 class="h4">䜿甚自定义的方法切分行来圢成Key/Value对</h3>
590<p>
591之前已经提到圓Map/Reduce框架从mapper的标准蟓入读取䞀行时它把这䞀行切分䞺key/value对。
592圚默讀情况䞋每行第䞀䞪tab笊之前的郚分䜜䞺key之后的郚分䜜䞺value䞍包括tab笊。
593</p>
594<p>
595䜆是甚户可以自定义可以指定分隔笊是其他字笊而䞍是默讀的tab笊或者指定圚第nn&gt;=1䞪分割笊倄分割而䞍是默讀的第䞀䞪。䟋劂
596</p>
597<pre class="code">
598$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
599    -input myInputDirs \
600    -output myOutputDir \
601    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
602    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
603    -jobconf stream.map.output.field.separator=. \
604    -jobconf stream.num.map.output.key.fields=4
605</pre>
606<p>
607圚䞊面的䟋子&ldquo;-jobconf stream.map.output.field.separator=.&rdquo;指定&ldquo;.&rdquo;䜜䞺map蟓出内容的分隔笊并䞔从圚第四䞪&ldquo;.&rdquo;之前的郚分䜜䞺key之后的郚分䜜䞺value䞍包括这第四䞪&ldquo;.&rdquo;。
608劂果䞀行䞭的&ldquo;.&rdquo;少于四䞪则敎行的内容䜜䞺keyvalue讟䞺空的Text对象就像这样创建了䞀䞪Textnew Text("")。
609</p>
610<p>
611同样甚户可以䜿甚&ldquo;-jobconf stream.reduce.output.field.separator=SEP&rdquo;和&ldquo;-jobconf stream.num.reduce.output.fields=NUM&rdquo;来指定reduce蟓出的行䞭第几䞪分隔笊倄分割key和value。
612</p>
613<a name="N101A7"></a><a name="%E4%B8%80%E4%B8%AA%E5%AE%9E%E7%94%A8%E7%9A%84Partitioner%E7%B1%BB"></a>
614<h3 class="h4">䞀䞪实甚的Partitionerç±» 二次排序-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 选项 </h3>
615<p>
616Hadoop有䞀䞪工具类org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
617它圚应甚皋序䞭埈有甚。Map/reduce框架甚这䞪类切分map的蟓出
618切分是基于key倌的前猀而䞍是敎䞪key。䟋劂
619</p>
620<pre class="code">
621$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
622    -input myInputDirs \
623    -output myOutputDir \
624    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
625    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
626    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
627    -jobconf stream.map.output.field.separator=. \
628    -jobconf stream.num.map.output.key.fields=4 \
629    -jobconf map.output.key.field.separator=. \
630    -jobconf num.key.fields.for.partition=2 \
631    -jobconf mapred.reduce.tasks=12
632</pre>
633<p>
634其䞭<em>-jobconf stream.map.output.field.separator=.</em> å’Œ<em>-jobconf stream.num.map.output.key.fields=4</em>是前文䞭的䟋子。Streaming甚这䞀䞪变量来埗到mapper的key/value对。
635</p>
636<p>
637䞊面的Map/Reduce 䜜䞚䞭map蟓出的key䞀般是由&ldquo;.&rdquo;分割成的四块。䜆是因䞺䜿甚了
638<em>-jobconf num.key.fields.for.partition=2</em> 
639选项所以Map/Reduce框架䜿甚key的前䞀块来切分map的蟓出。其䞭
640<em>-jobconf map.output.key.field.separator=.</em>
641指定了这次切分䜿甚的key的分隔笊。这样可以保证圚所有key/value对䞭
642key倌前䞀䞪块倌盞同的所有key被分到䞀组分配给䞀䞪reducer。
643</p>
644<p>
645
646<em>这种高效的方法等价于指定前䞀块䜜䞺䞻键后䞀块䜜䞺副键。
647䞻键甚于切分块䞻键和副键的组合甚于排序。</em>䞀䞪简单的瀺䟋劂䞋
648</p>
649<p>
650Map的蟓出key</p>
651<pre class="code">
65211.12.1.2
65311.14.2.3
65411.11.4.1
65511.12.1.1
65611.14.2.2
657
658</pre>
659<p>
660切分给3䞪reducer前䞀块的倌甚于切分</p>
661<pre class="code">
66211.11.4.1
663-----------
66411.12.1.2
66511.12.1.1
666-----------
66711.14.2.3
66811.14.2.2
669</pre>
670<p>
671圚每䞪切分后的组内排序四䞪块的倌郜甚于排序
672</p>
673<pre class="code">
67411.11.4.1
675-----------
67611.12.1.1
67711.12.1.2
678-----------
67911.14.2.2
68011.14.2.3
681</pre>
682<a name="N101DF"></a><a name="Hadoop%E8%81%9A%E5%90%88%E5%8A%9F%E8%83%BD%E5%8C%85%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88-reduce+aggregate+%E9%80%89%E9%A1%B9%EF%BC%89"></a>
683<h3 class="h4">Hadoop聚合功胜包的䜿甚-reduce aggregate 选项</h3>
684<p>
685Hadoop有䞀䞪工具包&ldquo;Aggregate&rdquo;
686<a href="https://svn.apache.org/repos/asf/hadoop/core/trunk/src/java/org/apache/hadoop/mapred/lib/aggregate">https://svn.apache.org/repos/asf/hadoop/core/trunk/src/java/org/apache/hadoop/mapred/lib/aggregate</a>。
687&ldquo;Aggregate&rdquo;提䟛䞀䞪特殊的reducer类和䞀䞪特殊的combiner类
688并䞔有䞀系列的&ldquo;聚合噚&rdquo;&ldquo;aggregator&rdquo;䟋劂&ldquo;sum&rdquo;&ldquo;max&rdquo;&ldquo;min&rdquo;等甚于聚合䞀组value的序列。
689甚户可以䜿甚Aggregate定义䞀䞪mapper插件类
690这䞪类甚于䞺mapper蟓入的每䞪key/value对产生&ldquo;可聚合项&rdquo;。
691combiner/reducer利甚适圓的聚合噚聚合这些可聚合项。
692</p>
693<p>
694芁䜿甚Aggregate只需指定&ldquo;-reducer aggregate&rdquo;</p>
695<pre class="code">
696$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
697    -input myInputDirs \
698    -output myOutputDir \
699    -mapper myAggregatorForKeyCount.py \
700    -reducer aggregate \
701    -file myAggregatorForKeyCount.py \
702    -jobconf mapred.reduce.tasks=12
703</pre>
704<p>
705python皋序myAggregatorForKeyCount.py䟋子
706</p>
707<pre class="code">
708#!/usr/bin/python
709
710import sys;
711
712def generateLongCountToken(id):
713    return "LongValueSum:" + id + "\t" + "1"
714
715def main(argv):
716    line = sys.stdin.readline();
717    try:
718        while line:
719            line = line[:-1];
720            fields = line.split("\t");
721            print generateLongCountToken(fields[0]);
722            line = sys.stdin.readline();
723    except "end of file":
724        return None
725if __name__ == "__main__":
726     main(sys.argv)
727</pre>
728<a name="N101FA"></a><a name="%E5%AD%97%E6%AE%B5%E7%9A%84%E9%80%89%E5%8F%96%EF%BC%88%E7%B1%BB%E4%BC%BC%E4%BA%8Eunix%E4%B8%AD%E7%9A%84+%27cut%27+%E5%91%BD%E4%BB%A4%EF%BC%89"></a>
729<h3 class="h4">字段的选取类䌌于unix侭的 'cut' 呜什 </h3>
730<p>
731Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduce垮助甚户高效倄理文本数据
732就像unix侭的&ldquo;cut&rdquo;工具。工具类䞭的map凜数把蟓入的key/value对看䜜字段的列衚。
733甚户可以指定字段的分隔笊默讀是tab
734可以选择字段列衚䞭任意䞀段由列衚䞭䞀䞪或倚䞪字段组成䜜䞺map蟓出的key或者value。
735同样工具类䞭的reduce凜数也把蟓入的key/value对看䜜字段的列衚甚户可以选取任意䞀段䜜䞺reduce蟓出的key或value。䟋劂
736</p>
737<pre class="code">
738$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
739    -input myInputDirs \
740    -output myOutputDir \
741    -mapper org.apache.hadoop.mapred.lib.FieldSelectionMapReduce\
742    -reducer org.apache.hadoop.mapred.lib.FieldSelectionMapReduce\
743    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
744    -jobconf map.output.key.field.separa=. \
745    -jobconf num.key.fields.for.partition=2 \
746    -jobconf mapred.data.field.separator=. \
747    -jobconf map.output.key.value.fields.spec=6,5,1-3:0- \
748    -jobconf reduce.output.key.value.fields.spec=0-2:5- \
749    -jobconf mapred.reduce.tasks=12
750</pre>
751<p>
752选项&ldquo;-jobconf map.output.key.value.fields.spec=6,5,1-3:0-&rdquo;指定了劂䜕䞺map的蟓出选取key和value。Key选取规则和value选取规则由&ldquo;:&rdquo;分割。
753圚这䞪䟋子䞭map蟓出的key由字段6512和3组成。蟓出的value由所有字段组成&ldquo;0-&rdquo;指字段0以及之后所有字段。
754</p>
755<p>
756选项&ldquo;-jobconf reduce.output.key.value.fields.spec=0-2:0-&rdquo;译者泚歀倄应䞺&rdquo;0-2:5-&ldquo;指定劂䜕䞺reduce的蟓出选取value。
757本䟋䞭reduce的蟓出的key将包含字段012对应于原始的字段651。
758reduce蟓出的value将包含起自字段5的所有字段对应于所有的原始字段。
759</p>
760</div>
761
762
763<a name="N1020F"></a><a name="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98"></a>
764<h2 class="h3">垞见问题</h2>
765<div class="section">
766<a name="N10215"></a><a name="%E6%88%91%E8%AF%A5%E6%80%8E%E6%A0%B7%E4%BD%BF%E7%94%A8Hadoop+Streaming%E8%BF%90%E8%A1%8C%E4%B8%80%E7%BB%84%E7%8B%AC%E7%AB%8B%EF%BC%88%E7%9B%B8%E5%85%B3%EF%BC%89%E7%9A%84%E4%BB%BB%E5%8A%A1%E5%91%A2%EF%BC%9F"></a>
767<h3 class="h4">我该怎样䜿甚Hadoop Streaming运行䞀组独立盞关的任务呢</h3>
768<p>
769倚数情况䞋䜠䞍需芁Map Reduce的党郚功胜
770而只需芁运行同䞀皋序的倚䞪实䟋或者䜿甚䞍同数据或者圚盞同数据䞊䜿甚䞍同的参数。
771䜠可以通过Hadoop Streaming来实现。</p>
772<a name="N1021F"></a><a name="%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E5%85%B6%E4%B8%AD%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%80%E4%B8%AAmap%EF%BC%9F"></a>
773<h3 class="h4">劂䜕倄理倚䞪文件其䞭每䞪文件䞀䞪map</h3>
774<p>
775䟋劂这样䞀䞪问题圚集矀䞊压猩zipping䞀些文件䜠可以䜿甚以䞋几种方法</p>
776<ol>
777
778<li>䜿甚Hadoop Streaming和甚户猖写的mapper脚本皋序<ul>
779 
780<li> ç”Ÿæˆäž€äžªæ–‡ä»¶ïŒŒæ–‡ä»¶äž­åŒ…含所有芁压猩的文件圚HDFS䞊的完敎路埄。每䞪map 任务获埗䞀䞪路埄名䜜䞺蟓入。</li>
781 
782<li> åˆ›å»ºäž€äžªmapper脚本皋序实现劂䞋功胜获埗文件名把该文件拷莝到本地压猩该文件并把它发到期望的蟓出目圕。</li>
783
784</ul>
785</li>
786
787<li>䜿甚现有的Hadoop框架<ul>
788   
789<li>圚main凜数䞭添加劂䞋呜什
790<pre class="code">
791       FileOutputFormat.setCompressOutput(conf, true);
792       FileOutputFormat.setOutputCompressorClass(conf, org.apache.hadoop.io.compress.GzipCodec.class);
793       conf.setOutputFormat(NonSplitableTextInputFormat.class);
794       conf.setNumReduceTasks(0);
795</pre>
796</li>
797   
798<li>猖写map凜数
799<pre class="code">
800
801       public void map(WritableComparable key, Writable value,
802                               OutputCollector output,
803                               Reporter reporter) throws IOException {
804            output.collect((Text)value, null);
805       }
806</pre>
807</li>
808 
809<li>泚意蟓出的文件名和原文件名䞍同</li>
810
811</ul>
812</li>
813
814</ol>
815<a name="N1024A"></a><a name="%E5%BA%94%E8%AF%A5%E4%BD%BF%E7%94%A8%E5%A4%9A%E5%B0%91%E4%B8%AAreducer%EF%BC%9F"></a>
816<h3 class="h4">应该䜿甚倚少䞪reducer</h3>
817<p>
818请参考Hadoop Wiki<a href="mapred_tutorial.html#Reducer">Reducer</a>
819
820</p>
821<a name="N10258"></a><a name="%E5%A6%82%E6%9E%9C%E5%9C%A8Shell%E8%84%9A%E6%9C%AC%E9%87%8C%E8%AE%BE%E7%BD%AE%E4%B8%80%E4%B8%AA%E5%88%AB%E5%90%8D%EF%BC%8C%E5%B9%B6%E6%94%BE%E5%9C%A8-mapper%E4%B9%8B%E5%90%8E%EF%BC%8CStreaming%E4%BC%9A%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C%E5%90%97%EF%BC%9F%0A%E4%BE%8B%E5%A6%82%EF%BC%8Calias+cl%3D%27cut+-fl%27%EF%BC%8C-mapper+%22cl%22%E4%BC%9A%E8%BF%90%E8%A1%8C%E6%AD%A3%E5%B8%B8%E5%90%97%EF%BC%9F"></a>
822<h3 class="h4">
823劂果圚Shell脚本里讟眮䞀䞪别名并攟圚-mapper之后Streaming䌚正垞运行吗
824䟋劂alias cl='cut -fl'-mapper "cl"䌚运行正垞吗
825</h3>
826<p>
827脚本里无法䜿甚别名䜆是允讞变量替换䟋劂
828</p>
829<pre class="code">
830$ hadoop dfs -cat samples/student_marks
831alice   50
832bruce   70
833charlie 80
834dan     75
835
836$ c2='cut -f2'; $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
837    -input /user/me/samples/student_marks
838    -mapper \"$c2\" -reducer 'cat' 
839    -output /user/me/samples/student_out
840    -jobconf mapred.job.name='Experiment'
841
842$ hadoop dfs -ls samples/student_out
843Found 1 items/user/me/samples/student_out/part-00000    &lt;r 3&gt;   16
844
845$ hadoop dfs -cat samples/student_out/part-00000
84650
84770
84875
84980
850</pre>
851<a name="N10266"></a><a name="%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8UNIX+pipes%E5%90%97%EF%BC%9F%E4%BE%8B%E5%A6%82+%E2%80%93mapper+%22cut+%E2%80%93fl+%7C+set+s%2Ffoo%2Fbar%2Fg%22%E7%AE%A1%E7%94%A8%E4%B9%88%EF%BC%9F"></a>
852<h3 class="h4">
853我可以䜿甚UNIX pipes吗䟋劂 &ndash;mapper "cut &ndash;fl | set s/foo/bar/g"管甚么
854</h3>
855<p>
856现圚䞍支持而䞔䌚给出错误信息&ldquo;java.io.IOException: Broken pipe&rdquo;。这或讞是䞀䞪bug需芁进䞀步研究。
857</p>
858<a name="N10270"></a><a name="%E5%9C%A8streaming%E4%BD%9C%E4%B8%9A%E4%B8%AD%E7%94%A8-file%E9%80%89%E9%A1%B9%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA"></a>
859<h3 class="h4">圚streaming䜜䞚䞭甚-file选项运行䞀䞪分垃匏的超倧可执行文件䟋劂3.6G时
860我埗到了䞀䞪错误信息&ldquo;No space left on device&rdquo;。劂䜕解决
861</h3>
862<p>
863配眮变量stream.tmpdir指定了䞀䞪目圕圚这䞪目圕䞋芁进行打jar包的操䜜。stream.tmpdir的默讀倌是/tmp䜠需芁将这䞪倌讟眮䞺䞀䞪有曎倧空闎的目圕
864</p>
865<pre class="code">
866-jobconf stream.tmpdir=/export/bigspace/...
867</pre>
868<a name="N10281"></a><a name="%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E5%A4%9A%E4%B8%AA%E8%BE%93%E5%85%A5%E7%9B%AE%E5%BD%95%EF%BC%9F"></a>
869<h3 class="h4">劂䜕讟眮倚䞪蟓入目圕</h3>
870<p>
871可以䜿甚倚䞪-input选项讟眮倚䞪蟓入目圕
872</p>
873<pre class="code">
874 hadoop jar hadoop-streaming.jar -input '/user/foo/dir1' -input '/user/foo/dir2'
875</pre>
876<a name="N1028E"></a><a name="%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90gzip%E6%A0%BC%E5%BC%8F%E7%9A%84%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%EF%BC%9F"></a>
877<h3 class="h4">劂䜕生成gzip栌匏的蟓出文件</h3>
878<p>
879陀了纯文本栌匏的蟓出䜠还可以生成gzip文件栌匏的蟓出䜠只需讟眮streaming䜜䞚䞭的选项&lsquo;-jobconf mapred.output.compress=true -jobconf mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCode&rsquo;。
880</p>
881<a name="N10298"></a><a name="Streaming%E4%B8%AD%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89input%2Foutput+format%EF%BC%9F"></a>
882<h3 class="h4">Streaming䞭劂䜕自定义input/output format</h3>
883<p>
884至少圚Hadoop 0.14版本以前䞍支持倚䞪jar文件。所以圓指定自定义的类时䜠芁把他们和原有的streaming jar打包圚䞀起并甚这䞪自定义的jar包替换默讀的hadoop streaming jar包。
885</p>
886<a name="N102A2"></a><a name="Streaming%E5%A6%82%E4%BD%95%E8%A7%A3%E6%9E%90XML%E6%96%87%E6%A1%A3%EF%BC%9F"></a>
887<h3 class="h4">Streaming劂䜕解析XML文档</h3>
888<p>
889䜠可以䜿甚StreamXmlRecordReader来解析XML文档。
890</p>
891<pre class="code">
892hadoop jar hadoop-streaming.jar -inputreader "StreamXmlRecord,begin=BEGIN_STRING,end=END_STRING" ..... (rest of the command)
893</pre>
894<p>
895Map任务䌚把BEGIN_STRING和END_STRING之闎的郚分看䜜䞀条记圕。
896</p>
897<a name="N102B3"></a><a name="%E5%9C%A8streaming%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%E8%AE%A1%E6%95%B0%E5%99%A8%EF%BC%9F"></a>
898<h3 class="h4">圚streaming应甚皋序䞭劂䜕曎新计数噚</h3>
899<p>
900streaming进皋胜借䜿甚stderr发出计数噚信息。
901<span class="codefrag">reporter:counter:&lt;group&gt;,&lt;counter&gt;,&lt;amount&gt;</span>
902应该被发送到stderr来曎新计数噚。
903</p>
904<a name="N102C0"></a><a name="%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0streaming%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%8A%B6%E6%80%81%EF%BC%9F"></a>
905<h3 class="h4">劂䜕曎新streaming应甚皋序的状态</h3>
906<p>
907streaming进皋胜借䜿甚stderr发出状态信息。
908<span class="codefrag">reporter:status:&lt;message&gt;</span> èŠè¢«å‘送到stderr来讟眮状态。
909</p>
910</div>
911
912</div>
913<!--+
914    |end content
915    +-->
916<div class="clearboth">&nbsp;</div>
917</div>
918<div id="footer">
919<!--+
920    |start bottomstrip
921    +-->
922<div class="lastmodified">
923<script type="text/javascript"><!--
924document.write("Last Published: " + document.lastModified);
925//  --></script>
926</div>
927<div class="copyright">
928        Copyright &copy;
929         2007 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
930</div>
931<!--+
932    |end bottomstrip
933    +-->
934</div>
935</body>
936</html>
Note: See TracBrowser for help on using the repository browser.