在Hadoop安裝目錄中你會(huì)找到包含Hadoop樣例程序的JAR文件,你可以用它來(lái)試用Hadoop。在你執(zhí)行這些樣例程序以前,你應(yīng)該保證你的安裝是完全的和你的執(zhí)行時(shí)環(huán)境的設(shè)置是正確的。我們?cè)谇懊嫘」?jié)中提到,check_basic_env.sh腳本能夠幫助你校驗(yàn)安裝,如果安裝有任何錯(cuò)誤,它會(huì)提示你改正。
hadoop-0.19.0-examples.jar文件包含著數(shù)個(gè)可以直接運(yùn)行的樣例程序。我們?cè)趫D標(biāo)1-4中列出包含在這個(gè)JAR文件的樣例程序。
圖表 1?4 hadoop-0.19.0-examples.jar文件中的樣例程序
程序 | 描述 |
aggregatewordcount | 計(jì)算輸入文件中文字個(gè)數(shù)的基于聚合的MapReduce程序。 |
aggregatewordhist | 生成輸入文件中文字個(gè)數(shù)的統(tǒng)計(jì)圖的基于聚合的MapReduce程序。 |
grep | 計(jì)算輸入文件中匹配正則表達(dá)式的文字個(gè)數(shù)的MapReduce程序。 |
join | 合并排序的平均分割的數(shù)據(jù)集的作業(yè)。 |
multifilewc | 計(jì)算幾個(gè)文件的文字個(gè)數(shù)的作業(yè)。 |
pentomino | 解決五格拼版問(wèn)題的分塊分層的MapReduce程序。 |
pi | 使用蒙地卡羅法計(jì)算PI的MapReduce程序。 |
randomtextwriter | 在一個(gè)節(jié)點(diǎn)上寫(xiě)10G隨機(jī)文本的MapReduce程序。 |
randomwriter | 在每個(gè)節(jié)點(diǎn)上寫(xiě)10G隨機(jī)數(shù)據(jù)的MapReduce程序。 |
sleep | 在每個(gè)Map和Reduce作業(yè)中休憩的程序。 |
sort | 排序隨機(jī)寫(xiě)入器生成的數(shù)據(jù)的MapReduce程序。 |
sudoku | 一個(gè)九宮格游戲的解決方案。 |
wordcount | 在輸入文件中統(tǒng)計(jì)文字個(gè)數(shù)的統(tǒng)計(jì)器。 |
PI計(jì)算器樣例程序通過(guò)蒙地卡羅法計(jì)算PI值。網(wǎng)址http://www.chem.unl.edu/zeng/joy/mclab/mcintro.html提供了關(guān)于這個(gè)算法的技術(shù)討論。抽樣數(shù)量是正方形內(nèi)隨機(jī)集合的點(diǎn)數(shù)。抽樣數(shù)越多,PI值的計(jì)算就越精確。為了程序的簡(jiǎn)單性,我們只用很少的操作粗略的計(jì)算出PI的值。
PI程序使用了兩個(gè)整形參數(shù)。Map作業(yè)數(shù)量和每個(gè)Map作業(yè)中的抽樣數(shù)量。計(jì)算中的總共的抽樣數(shù)量是Map作業(yè)的數(shù)量乘以每個(gè)Map作業(yè)中的抽樣數(shù)量。
Map作業(yè)在1乘1的矩形面積內(nèi)產(chǎn)生隨機(jī)的點(diǎn)。對(duì)于其中的每個(gè)抽樣如果滿足X2+Y2 <=1, 那么這個(gè)點(diǎn)就在圓的里面。否則,這個(gè)點(diǎn)就在圓的外面。Map作業(yè)輸出鍵值為1或者0,1代表在直徑為1的圓內(nèi),0代表在直徑為1的圓外,映射的數(shù)據(jù)值均為1,Reduce任務(wù)計(jì)算圓內(nèi)點(diǎn)的數(shù)量和圓外點(diǎn)的數(shù)量。這兩個(gè)數(shù)量的比例就是極限值PI.
在這個(gè)樣例程序中,為了使程序執(zhí)行得更快和有更少的輸出,你會(huì)選擇2個(gè)Map作業(yè),每個(gè)作業(yè)有10個(gè)抽樣,一共有20個(gè)抽樣。
如果你想執(zhí)行這個(gè)程序,你需要改變你的工作目錄去HADOOP_HOME(通過(guò) cd ${HADOOP_HOME}),然后,鍵入命令如下:
jason@cloud9:~/src/hadoop-0.19.0$ hadoop jar hadoop-0.19.0-examples.jar pi 2 10
bin/hadoop jar命令提交作業(yè)到集群中。它通過(guò)三個(gè)步驟處理命令行參數(shù),每一個(gè)步驟處理命令行參數(shù)中的一部分。我們會(huì)在第5章會(huì)看到處理參數(shù)的細(xì)節(jié)。但是現(xiàn)在,我們只需要知道hadoop_0.19.0-examples.jar文件包含此應(yīng)用程序的主類,而且這個(gè)類接受3個(gè)參數(shù)。
列表1-3就是此應(yīng)用程序的輸出。
列表 1-3 樣例PI程序的輸出
Number of Maps = 2 Samples per Map = 10
Wrote input for Map #0
Wrote input for Map #1
Starting Job
jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
mapred.FileInputFormat: Total input paths to process : 2
mapred.FileInputFormat: Total input paths to process : 2
mapred.JobClient: Running job: job_local_0001
mapred.FileInputFormat: Total input paths to process : 2
mapred.FileInputFormat: Total input paths to process : 2
mapred.MapTask: numReduceTasks: 1
mapred.MapTask: io.sort.mb = 100
mapred.MapTask: data buffer = 79691776/99614720
mapred.MapTask: record buffer = 262144/327680
mapred.JobClient: map 0% reduce 0%
mapred.MapTask: Starting flush of map output
mapred.MapTask: bufstart = 0; bufend = 32; bufvoid = 99614720
mapred.MapTask: kvstart = 0; kvend = 2; length = 327680
mapred.LocalJobRunner: Generated 1 samples
mapred.MapTask: Index: (0, 38, 38)
mapred.MapTask: Finished spill 0
mapred.LocalJobRunner: Generated 1 samples.
mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
mapred.TaskRunner: Saved output of task 'attempt_local_0001_m_000000_0' ?
to file:/home/jason/src/hadoop-0.19.0/test-mini-mr/outmapred.
MapTask: numReduceTasks: 1
mapred.MapTask: io.sort.mb = 100
mapred.JobClient: map 0% reduce 0%
mapred.LocalJobRunner: Generated 1 samples
mapred.MapTask: data buffer = 79691776/99614720
mapred.MapTask: record buffer = 262144/327680
mapred.MapTask: Starting flush of map output
mapred.MapTask: bufstart = 0; bufend = 32; bufvoid = 99614720
mapred.MapTask: kvstart = 0; kvend = 2; length = 327680
mapred.JobClient: map 100% reduce 0%
mapred.MapTask: Index: (0, 38, 38)
mapred.MapTask: Finished spill 0
mapred.LocalJobRunner: Generated 1 samples.
mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
mapred.TaskRunner: Saved output of task 'attempt_local_0001_m_000001_0' ?
to file:/home/jason/src/hadoop-0.19.0/test-mini-mr/out
mapred.ReduceTask: Initiating final on-disk merge with 2 files
mapred.Merger: Merging 2 sorted segments
mapred.Merger: Down to the last merge-pass, with 2 segments left of ?
total size: 76 bytes
mapred.LocalJobRunner: reduce > reduce
mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
mapred.TaskRunner: Saved output of task 'attempt_local_0001_r_000000_0' ?
to file:/home/jason/src/hadoop-0.19.0/test-mini-mr/out
mapred.JobClient: Job complete: job_local_0001
mapred.JobClient: Counters: 11
mapred.JobClient: File Systems
mapred.JobClient: Local bytes read=314895
mapred.JobClient: Local bytes written=359635
mapred.JobClient: Map-Reduce Framework
mapred.JobClient: Reduce input groups=2
mapred.JobClient: Combine output records=0
mapred.JobClient: Map input records=2
mapred.JobClient: Reduce output records=0
mapred.JobClient: Map output bytes=64
mapred.JobClient: Map input bytes=48
mapred.JobClient: Combine input records=0
mapred.JobClient: Map output records=4
mapred.JobClient: Reduce input records=4
Job Finished in 2.322 seconds
Estimated value of PI is 3.8
請(qǐng)注意Hadoop項(xiàng)目使用阿帕奇基金的log4j包來(lái)處理日志。缺省情況下,框架的輸出日志是以時(shí)間戳開(kāi)始的,后面跟著日志級(jí)別和產(chǎn)生消息的類名。除此之外,缺省情況下只有INFO和更高級(jí)別日志消息才會(huì)被打印出來(lái)。為了簡(jiǎn)介,我已經(jīng)從輸出中移除了時(shí)間戳和日志級(jí)別。
在日志中,你最感興趣的就是日志輸出的最后一行,它說(shuō)” 計(jì)算的PI值是…”。這意味著你的Hadoop安裝是成功的,它能夠正確的執(zhí)行你的應(yīng)用程序。
下面我們將一步一步的詳細(xì)查看列表2-3的輸出,這能幫助你理解這個(gè)樣例程序是怎么工作的,甚至可以找到程序是否出現(xiàn)錯(cuò)誤。
第一段日志是在Hadoop初始化PI計(jì)算器程序時(shí)輸出的,我們可以看到,你的輸入是2個(gè)Map作業(yè)和每個(gè)Map作業(yè)有10個(gè)抽樣。
Number of Maps = 2 Samples per Map = 10
Wrote input for Map #0
Wrote input for Map #1
然后,框架程序啟動(dòng)并且接管控制流,它進(jìn)行輸入分割(把輸入分成不相干的部分稱為輸入分割)。
你可以從下面一行中獲得作業(yè)ID,你能使用作業(yè)ID在作業(yè)控制工具中找到此作業(yè)。
Running job: job_local_0001
通過(guò)下面一行我們可以得知,一共有兩個(gè)輸入文件和兩個(gè)輸入分割。
jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
mapred.FileInputFormat: Total input paths to process : 2
mapred.FileInputFormat: Total input paths to process : 2
mapred.JobClient: Running job: job_local_0001
mapred.FileInputFormat: Total input paths to process : 2
mapred.FileInputFormat: Total input paths to process : 2
映射作業(yè)的輸出會(huì)被劃分為不同的輸出塊,每一個(gè)輸出塊都是排序的,這個(gè)過(guò)程被稱為混淆過(guò)程。包含每一個(gè)排序的輸出塊的文件成為輸出塊。對(duì)于每一個(gè)Reduce作業(yè),框架會(huì)從Map作業(yè)的輸出中得到輸出塊,然后合并并且排序這些輸出塊得到排序塊,這個(gè)過(guò)程成為排序過(guò)程。
在列表2-3的下一部分,我們可以看到Map作業(yè)的混淆過(guò)程執(zhí)行的詳細(xì)信息??蚣塬@得所有Map作業(yè)的輸出記錄,然后把這些輸出輸入給唯一的一個(gè)Reduce作業(yè)(numReduceTasks:1)。如果你指定了多個(gè)Reduce作業(yè),對(duì)于每一個(gè)Reduce作業(yè)你就會(huì)看到一個(gè)類似Finished spill N的日志。剩下的日志是用來(lái)記錄輸出緩沖,我們并不關(guān)注這些。
下面,你會(huì)看到:
mapred.MapTask: numReduceTasks: 1
...
mapred.MapTask: Finished spill 0
mapred.LocalJobRunner: Generated 1 samples.
mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' ?
done.mapred.TaskRunner: Saved output of task ?
'attempt_local_0001_m_000000_0' ?
to file:/home/jason/src/hadoop-0.19.0/test-mini-mr/out
Generated 1 samples是Map作業(yè)的最終狀態(tài)的輸出。Hadoop框架告訴你,第一個(gè)Map作業(yè)通過(guò)作業(yè)’attempt_local_0001_m_000000_0”完成的,而且輸出已經(jīng)保存到缺省的文件系統(tǒng)file:/home/Jason/src/hadoop-0.19.0/test-mini-mr/out。
下面一部分是排序過(guò)程的輸出:
mapred.ReduceTask: Initiating final on-disk merge with 2 files
mapred.Merger: Merging 2 sorted segments
mapred.Merger: Down to the last merge-pass, with 2 segments left of ?
total size: 76 bytes
根據(jù)命令行參數(shù),列表2-3運(yùn)行的程序中有2個(gè)Map作業(yè)和一個(gè)Reduce作業(yè)。因?yàn)閮H僅存在一個(gè)Reduce作業(yè),所有的Map作業(yè)的輸出會(huì)被組織成為一個(gè)排序的排序塊。但是,兩個(gè)Map作業(yè)會(huì)產(chǎn)生兩個(gè)輸出塊進(jìn)入排序階段。每一個(gè)Reduce作業(yè)會(huì)在輸出目錄下產(chǎn)生一個(gè)名字為part-ON的輸出文件,N是Reduce作業(yè)以0開(kāi)始的遞增的序數(shù)。通常來(lái)說(shuō),名字的數(shù)字部分是5位數(shù)字構(gòu)成的,如果不夠5位數(shù)以0補(bǔ)齊。
日志輸出的下一部分說(shuō)明了唯一的Reduce任務(wù)的執(zhí)行情況:
mapred.LocalJobRunner: reduce > reduce
mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
mapred.TaskRunner: Saved output of task 'attempt_local_0001_r_000000_0' to ?
file:/home/jason/src/hadoop-0.19.0/test-mini-mr/out
我們可以看出,樣例程序把Reduce作業(yè)的輸出寫(xiě)入文件attempt_local_0001_4_000000_0,然后,把它重命名為part-00000,保存在作業(yè)的輸出目錄中。
下面的日志的輸出提供了詳細(xì)的作業(yè)完成信息。
mapred.JobClient: Job complete: job_local_0001
mapred.JobClient: Counters: 11
mapred.JobClient: File Systems
mapred.JobClient: Local bytes read=314895
mapred.JobClient: Local bytes written=359635
mapred.JobClient: Map-Reduce Framework
mapred.JobClient: Reduce input groups=2
mapred.JobClient: Combine output records=0
mapred.JobClient: Map input records=2
mapred.JobClient: Reduce output records=0
mapred.JobClient: Map output bytes=64
mapred.JobClient: Map input bytes=48
mapred.JobClient: Combine input records=0
mapred.JobClient: Map output records=4
mapred.JobClient: Reduce input records=4
最后的兩行日志并不是框架打印的,而是由PiEstimator程序代碼打印的。
Job Finished in 2.322 seconds
Estimated value of PI is 3.8
Hadoop框架提供了用來(lái)測(cè)試分布式文件系統(tǒng)和運(yùn)行在分布式文件系統(tǒng)的MapReduce作業(yè)的樣例程序,這些測(cè)試程序被包含在hadoop-0.19.0-test.jar文件中。圖標(biāo)1-5是這些測(cè)試程序的列表和他們提供的功能:
圖表 1?5 hadoop-0.19.0-tests.jar文件中的測(cè)試程序
測(cè)試 | 描述 |
DFSCIOTest | 測(cè)試libhdfs中的分布式I/O的基準(zhǔn)。Libhdfs是一個(gè)為C/C++應(yīng)用程序提供HDFS文件服務(wù)的共享庫(kù)。 |
DistributedFSCheck | 文件系統(tǒng)一致性的分布式檢查。 |
TestDFSIO | 分布式的I/O基準(zhǔn)。 |
clustertestdfs | 對(duì)分布式文件系統(tǒng)的偽分布式測(cè)試。 |
dfsthroughput | 測(cè)量HDFS的吞吐量。 |
filebench | SequenceFileInputFormat和SequenceFileOutputFormat的基準(zhǔn),這包含BLOCK壓縮,RECORD壓縮和非壓縮的情況。TextInputFormat和TextOutputFormat的基準(zhǔn),包括壓縮和非壓縮的情況。 |
loadgen | 通用的MapReduce加載產(chǎn)生器。 |
mapredtest | MapReduce作業(yè)的測(cè)試和檢測(cè)。 |
mrbench | 創(chuàng)建大量小作業(yè)的MapReduce基準(zhǔn)。 |
nnbench | NameNode的性能基準(zhǔn)。 |
testarrayfile | 對(duì)有鍵值對(duì)的文本文件的測(cè)試。 |
testbigmapoutput | 這是一個(gè)MapReduce作業(yè),它用來(lái)處理不可分割的大文件來(lái)產(chǎn)生一個(gè)標(biāo)志MapReduce作業(yè)。 |
testfilesystem | 文件系統(tǒng)讀寫(xiě)測(cè)試。 |
testipc | Hadoop核心的進(jìn)程間交互測(cè)試。 |
testmapredsort | 用于校驗(yàn)MapReduce框架的排序的程序。 |
testrpc | 對(duì)遠(yuǎn)程過(guò)程調(diào)用的測(cè)試。 |
testsequencefile | 對(duì)包含二進(jìn)制鍵值對(duì)的文本文件的測(cè)試。 |
testsequencefileinputformat | 對(duì)序列文件輸入格式的測(cè)試。 |
testsetfile | 對(duì)包含二進(jìn)制鍵值對(duì)文本文件的測(cè)試。 |
testtextinputformat | 對(duì)文本輸入格式的測(cè)試。 |
threadedmapbench | 對(duì)比輸出一個(gè)排序塊的Map作業(yè)和輸出多個(gè)排序塊的Map作業(yè)的性能。 |
聯(lián)系客服