apache的Hadoop項目提供一類api可以通過java工程操作hdfs中的文件,包括:文件打開,讀寫,刪除等、目錄的創建,刪除,讀取目錄中所有文件等。
1、到http://hadoop.apache.org/releases.html下載Hadoop,解壓後把所有jar加入項目的lib里
2、程序處理步驟: 1)得到Configuration對象,2)得到FileSystem對象,3)進行文件操作,簡單示例如下:
/**
*
*/
package org.jrs.wlh;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* @PutMeger.java
* java操作hdfs 往 hdfs中上傳數據
* @version $Revision$</br>
* update: $Date$
*/
public class PutMeger {
public static void main(String[] args) throws IOException {
String[] str = new String[]{"E:\\hadoop\\UploadFileClient.java","hdfs://master:9000/user/hadoop/inccnt.java"};
Configuration conf = new Configuration();
FileSystem fileS= FileSystem.get(conf);
FileSystem localFile = FileSystem.getLocal(conf); //得到一個本地的FileSystem對象
Path input = new Path(str[0]); //設定文件輸入保存路徑
Path out = new Path(str[1]); //文件到hdfs輸出路徑
try{
FileStatus[] inputFile = localFile.listStatus(input); //listStatus得到輸入文件路徑的文件列表
FSDataOutputStream outStream = fileS.create(out); //創建輸出流
for (int i = 0; i < inputFile.length; i++) {
System.out.println(inputFile[i].getPath().getName());
FSDataInputStream in = localFile.open(inputFile[i].getPath());
byte buffer[] = new byte[1024];
int bytesRead = 0;
while((bytesRead = in.read(buffer))>0){ //按照位元組讀取數據
System.out.println(buffer);
outStream.write(buffer,0,bytesRead);
}
in.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
2. Hadoop實戰的作品目錄
第一部分Hadoop——一種分布式編程框架
第1章Hadoop簡介2
1.1為什麼寫《Hadoop 實戰》3
1.2什麼是Hadoop3
1.3了解分布式系統和Hadoop4
1.4比較SQL資料庫和Hadoop5
1.5理解MapRece6
1.5.1動手擴展一個簡單程序7
1.5.2相同程序在MapRece中的擴展9
1.6用Hadoop統計單詞——運行第一個程序11
1.7Hadoop歷史15
1.8小結16
1.9資源16
第2章初識Hadoop17
2.1Hadoop的構造模塊17
2.1.1NameNode17
2.1.2DataNode18
2.1.3Secondary NameNode19
2.1.4JobTracker19
2.1.5TaskTracker19
2.2為Hadoop集群安裝SSH21
2.2.1定義一個公共賬號21
2.2.2驗證SSH安裝21
2.2.3生成SSH密鑰對21
2.2.4將公鑰分布並登錄驗證22
2.3運行Hadoop22
2.3.1本地(單機)模式23
2.3.2偽分布模式24
2.3.3全分布模式25
2.4基於Web的集群用戶界面28
2.5小結30
第3章Hadoop組件31
3.1HDFS文件操作31
3.1.1基本文件命令32
3.1.2編程讀寫HDFS35
3.2剖析MapRece程序37
3.2.1Hadoop數據類型39
3.2.2Mapper40
3.2.3Recer41
3.2.4Partitioner:重定向Mapper輸出41
3.2.5Combiner:本地rece43
3.2.6預定義mapper和Recer類的單詞計數43
3.3讀和寫43
3.3.1InputFormat44
3.3.2OutputFormat49
3.4小結50
第二部分實戰
第4章編寫MapRece基礎程序52
4.1獲得專利數據集52
4.1.1專利引用數據53
4.1.2專利描述數據54
4.2構建MapRece程序的基礎模板55
4.3計數60
4.4適應Hadoop API的改變64
4.5Hadoop的Streaming67
4.5.1通過Unix命令使用Streaming68
4.5.2通過腳本使用Streaming69
4.5.3用Streaming處理鍵/值對72
4.5.4通過Aggregate包使用Streaming75
4.6使用combiner提升性能80
4.7溫故知新83
4.8小結84
4.9更多資源84
第5章高階MapRece85
5.1鏈接MapRece作業85
5.1.1順序鏈接MapRece作業85
5.1.2具有復雜依賴的MapRece鏈接86
5.1.3預處理和後處理階段的鏈接86
5.2聯結不同來源的數據89
5.2.1Rece側的聯結90
5.2.2基於DistributedCache的復制聯結98
5.2.3半聯結:map側過濾後在rece側聯結101
5.3創建一個Bloom filter102
5.3.1Bloom filter做了什麼102
5.3.2實現一個Bloom filter104
5.3.3Hadoop 0.20以上版本的Bloom filter110
5.4溫故知新110
5.5小結111
5.6更多資源112
第6章編程實踐113
6.1開發MapRece程序113
6.1.1本地模式114
6.1.2偽分布模式118
6.2生產集群上的監視和調試123
6.2.1計數器123
6.2.2跳過壞記錄125
6.2.3用IsolationRunner重新運行出錯的任務128
6.3性能調優129
6.3.1通過combiner來減少網路流量129
6.3.2減少輸入數據量129
6.3.3使用壓縮129
6.3.4重用JVM132
6.3.5根據猜測執行來運行132
6.3.6代碼重構與演算法重寫133
6.4小結134
第7章細則手冊135
7.1向任務傳遞作業定製的參數135
7.2探查任務特定信息137
7.3劃分為多個輸出文件138
7.4以資料庫作為輸入輸出143
7.5保持輸出的順序145
7.6小結146
第8章管理Hadoop147
8.1為實際應用設置特定參數值147
8.2系統體檢149
8.3許可權設置151
8.4配額管理151
8.5啟用回收站152
8.6刪減DataNode152
8.7增加DataNode153
8.8管理NameNode和SNN153
8.9恢復失效的NameNode155
8.10感知網路布局和機架的設計156
8.11多用戶作業的調度157
8.11.1多個JobTracker158
8.11.2公平調度器158
8.12小結160
第三部分Hadoop也瘋狂
第9章在雲上運行Hadoop162
9.1Amazon Web Services簡介162
9.2安裝AWS163
9.2.1獲得AWS身份認證憑據164
9.2.2獲得命令行工具166
9.2.3准備SSH密鑰對168
9.3在EC2上安裝Hadoop169
9.3.1配置安全參數169
9.3.2配置集群類型169
9.4在EC2上運行MapRece程序171
9.4.1將代碼轉移到Hadoop集群上171
9.4.2訪問Hadoop集群上的數據172
9.5清空和關閉EC2實例175
9.6Amazon Elastic MapRece和其他AWS服務176
9.6.1Amazon Elastic MapRece176
9.6.2AWS導入/導出177
9.7小結177
第10章用Pig編程178
10.1像Pig一樣思考178
10.1.1數據流語言179
10.1.2數據類型179
10.1.3用戶定義函數179
10.2安裝Pig179
10.3運行Pig180
10.4通過Grunt學習Pig Latin182
10.5談談Pig Latin186
10.5.1數據類型和schema186
10.5.2表達式和函數187
10.5.3關系型運算符189
10.5.4執行優化196
10.6用戶定義函數196
10.6.1使用UDF196
10.6.2編寫UDF197
10.7腳本199
10.7.1注釋199
10.7.2參數替換200
10.7.3多查詢執行201
10.8Pig實戰——計算相似專利的例子201
10.9小結206
第11章Hive及Hadoop群207
11.1Hive207
11.1.1安裝與配置Hive208
11.1.2查詢的示例210
11.1.3深入HiveQL213
11.1.4Hive小結221
11.2其他Hadoop相關的部分221
11.2.1HBase221
11.2.2ZooKeeper221
11.2.3Cascading221
11.2.4Cloudera222
11.2.5Katta222
11.2.6CloudBase222
11.2.7Aster Data和Greenplum222
11.2.8Hama和Mahout223
11.3小結223
第12章案例研究224
12.1轉換《紐約時報》1100萬個庫存圖片文檔224
12.2挖掘中國移動的數據225
12.3在StumbleUpon推薦最佳網站229
12.3.1分布式StumbleUpon的開端230
12.3.2HBase和StumbleUpon230
12.3.3StumbleUpon上的更多Hadoop應用236
12.4搭建面向企業查詢的分析系統——IBM的ES2項目238
12.4.1ES2系統結構240
12.4.2ES2爬蟲241
12.4.3ES2分析242
12.4.4小結249
12.4.5參考文獻250
附錄AHDFS文件命令251
3. spark和hadoop的區別
直接比較Hadoop和Spark有難度,因為它們處理的許多任務都一樣,但是在一些方面又並不相互重疊。
比如說,Spark沒有文件管理功能,因而必須依賴Hadoop分布式文件系統(HDFS)或另外某種解決方案。
Hadoop框架的主要模塊包括如下:
Hadoop Common
Hadoop分布式文件系統(HDFS)
Hadoop YARN
Hadoop MapRece
雖然上述四個模塊構成了Hadoop的核心,不過還有其他幾個模塊。這些模塊包括:Ambari、Avro、Cassandra、Hive、 Pig、Oozie、Flume和Sqoop,它們進一步增強和擴展了Hadoop的功能。
Spark確實速度很快(最多比Hadoop MapRece快100倍)。Spark還可以執行批量處理,然而它真正擅長的是處理流工作負載、互動式查詢和機器學習。
相比MapRece基於磁碟的批量處理引擎,Spark賴以成名之處是其數據實時處理功能。Spark與Hadoop及其模塊兼容。實際上,在Hadoop的項目頁面上,Spark就被列為是一個模塊。
Spark有自己的頁面,因為雖然它可以通過YARN(另一種資源協調者)在Hadoop集群中運行,但是它也有一種獨立模式。它可以作為 Hadoop模塊來運行,也可以作為獨立解決方案來運行。
MapRece和Spark的主要區別在於,MapRece使用持久存儲,而Spark使用彈性分布式數據集(RDDS)。
性能
Spark之所以如此快速,原因在於它在內存中處理一切數據。沒錯,它還可以使用磁碟來處理未全部裝入到內存中的數據。
Spark的內存處理為來自多個來源的數據提供了近乎實時分析的功能:營銷活動、機器學習、物聯網感測器、日誌監控、安全分析和社交媒體網站。另 外,MapRece使用批量處理,其實從來就不是為驚人的速度設計的。它的初衷是不斷收集來自網站的信息,不需要這些數據具有實時性或近乎實時性。
易用性
支持Scala(原生語言)、Java、Python和Spark SQL。Spark SQL非常類似於SQL 92,所以幾乎不需要經歷一番學習,馬上可以上手。
Spark還有一種交互模式,那樣開發人員和用戶都可以獲得查詢和其他操作的即時反饋。MapRece沒有交互模式,不過有了Hive和Pig等附加模塊,採用者使用MapRece來得容易一點。
成本
「Spark已證明在數據多達PB的情況下也輕松自如。它被用於在數量只有十分之一的機器上,對100TB數據進行排序的速度比Hadoop MapRece快3倍。」這一成績讓Spark成為2014年Daytona GraySort基準。
兼容性
MapRece和Spark相互兼容;MapRece通過JDBC和ODC兼容諸多數據源、文件格式和商業智能工具,Spark具有與MapRece同樣的兼容性。
數據處理
MapRece是一種批量處理引擎。MapRece以順序步驟來操作,先從集群讀取數據,然後對數據執行操作,將結果寫回到集群,從集群讀 取更新後的數據,執行下一個數據操作,將那些結果寫回到結果,依次類推。Spark執行類似的操作,不過是在內存中一步執行。它從集群讀取數據後,對數據 執行操作,然後寫回到集群。
Spark還包括自己的圖形計算庫GraphX。GraphX讓用戶可以查看與圖形和集合同樣的數據。用戶還可以使用彈性分布式數據集(RDD),改變和聯合圖形,容錯部分作了討論。
容錯
至於容錯,MapRece和Spark從兩個不同的方向來解決問題。MapRece使用TaskTracker節點,它為 JobTracker節點提供了心跳(heartbeat)。如果沒有心跳,那麼JobTracker節點重新調度所有將執行的操作和正在進行的操作,交 給另一個TaskTracker節點。這種方法在提供容錯性方面很有效,可是會大大延長某些操作(即便只有一個故障)的完成時間。
Spark使用彈性分布式數據集(RDD),它們是容錯集合,裡面的數據元素可執行並行操作。RDD可以引用外部存儲系統中的數據集,比如共享式文件系統、HDFS、HBase,或者提供Hadoop InputFormat的任何數據源。Spark可以用Hadoop支持的任何存儲源創建RDD,包括本地文件系統,或前面所列的其中一種文件系統。
RDD擁有五個主要屬性:
分區列表
計算每個分片的函數
依賴其他RDD的項目列表
面向鍵值RDD的分區程序(比如說RDD是散列分區),這是可選屬性
計算每個分片的首選位置的列表(比如HDFS文件的數據塊位置),這是可選屬性
RDD可能具有持久性,以便將數據集緩存在內存中。這樣一來,以後的操作大大加快,最多達10倍。Spark的緩存具有容錯性,原因在於如果RDD的任何分區丟失,就會使用原始轉換,自動重新計算。
可擴展性
按照定義,MapRece和Spark都可以使用HDFS來擴展。那麼,Hadoop集群能變得多大呢?
據稱雅虎有一套42000個節點組成的Hadoop集群,可以說擴展無極限。最大的已知Spark集群是8000個節點,不過隨著大數據增多,預計集群規模也會隨之變大,以便繼續滿足吞吐量方面的預期。
安全
Hadoop支持Kerberos身份驗證,這管理起來有麻煩。然而,第三方廠商讓企業組織能夠充分利用活動目錄Kerberos和LDAP用於身份驗證。同樣那些第三方廠商還為傳輸中數據和靜態數據提供數據加密。
Hadoop分布式文件系統支持訪問控制列表(ACL)和傳統的文件許可權模式。Hadoop為任務提交中的用戶控制提供了服務級授權(Service Level Authorization),這確保客戶擁有正確的許可權。
Spark的安全性弱一點,目前只支持通過共享密鑰(密碼驗證)的身份驗證。Spark在安全方面帶來的好處是,如果你在HDFS上運行Spark,它可以使用HDFS ACL和文件級許可權。此外,Spark可以在YARN上運行,因而能夠使用Kerberos身份驗證。
總結
Spark與MapRece是一種相互共生的關系。Hadoop提供了Spark所沒有的功能特性,比如分布式文件系統,而Spark 為需要它的那些數據集提供了實時內存處理。完美的大數據場景正是設計人員當初預想的那樣:讓Hadoop和Spark在同一個團隊裡面協同運行。
然後看這篇文章:Link
註:對下面這一段持保留意見:
此外我們這里還要講到的是一個關於spark的重要誤區—「spark是基於內存的技術」。它不是基於內存的技術;spark是一個管道式的執行引擎,而且在shuffle的過程中會將數據寫入磁碟(比如說,如果我們想針對某個欄位做聚合操作)、如果內存不夠的話也一樣會內存溢出(但是內存可以調整)。因此,spark之所以比MapRece快主要是因為它是管道式處理方式而不是有些人說的「基於內存的優化」。當然,spark在內存中做了緩存來提高性能,但這不是spark真正工作快的原因。
現在,我們再來完整比對一下:
1. MapRece可以被Spark Core替換?是的,它會隨著時間的推移被替代,而且這種替代是合理的。但是spark目前還不是特別成熟能完全替代MapRece。此外,也沒有人會完全放棄MapRece,除非所有依賴MapRece的工具都有可替代方案。比如說,想要在pig上運行的腳本能在spark上執行還是有些工作要做的。
(註:Pig是一種數據流語言,用來快速輕松的處理巨大的數據,雅虎推出的,現在正在走下坡路。Pig可以非常方便的處理HDFS和HBase的數據,和Hive一樣,Pig可以非常高效的處理其需要做的,通過直接操作Pig查詢可以節省大量的勞動和時間。當你想在你的數據上做一些轉換,並且不想編寫MapRece jobs就可以用Pig.)
2. Hive可以被Spark SQL替換?是的,這又是對的。但是我們需要理解的是Spark SQL對於spark本身來說還是比較年輕的,大概要年輕1.5倍。相對於比較成熟的Hive來說它只能算是玩具了吧,我將在一年半到兩年之內再回頭來看Spark SQL.。如果我們還記得的話,兩到三年前Impala就號稱要終結Hive,但是截止到目前兩種技術也還是共存狀態,Impala並沒有終結Hive。在這里對於Spark SQL來說也是一樣的。
3. Storm可以被Spark Streaming替換?是的,可以替換。只不過平心而論storm並不是Hadoop生態系統中的一員,因為它是完全獨立的工具。他們的計算模型並不太形同,所以我不認為storm會消失,反而仍會作為一個商業產品。
4. Mahout可以被MLib替換?公平的講,Machout已經失去了市場,而且從過去的幾年來看它正在快速失去市場。對於這個工具,我們可以說這里是Spark真正可以替換Hadoop生態系統中的地方。 (註:同意!Spark的ML非常好用!要好好學!)
因此,總的來說,這篇文章的結論是:
1.不要被大數據供應商的包裝所愚弄。他們大量推進的是市場而不是最終的真理。Hadoop最開始是被設計為可擴展的框架,而且其中很多部分是可替換的:可以將HDFS替換為Tachyon(現在新的名字是Alluxio),可以將YARN替換為Mesos,可以將MapRece替換為Tez並且在Tez之上可以運行Hive。這將會是Hadoop技術棧的可選方案或者完全替代方案?倘若我們放棄的MR(MapRece)而使用Tez,那麼它還會是Hadoop嗎?
2. Spark不能為我們提供完整的技術棧。它允許我們將它的功能集成到我們的Hadoop集群中並且從中獲益,而不用完全脫離我們老的集群方案。
3. Spark還不夠成熟。我認為在過三到四年我們就不會再叫「Hadoop棧」而是叫它「大數據棧」或者類似的稱呼。因為在大數據棧中我們有很廣泛的選擇可以選出不同的開源產品來組合在一起形成一個單獨的技術棧使用。
4. 如何使用Python為Hadoop編寫一個簡單的MapRece程序
在這個實例中,我將會向大家介紹如何使用Python 為 Hadoop編寫一個簡單的MapRece
程序。
盡管Hadoop 框架是使用Java編寫的但是我們仍然需要使用像C++、Python等語言來實現Hadoop程序。盡管Hadoop官方網站給的示常式序是使用Jython編寫並打包成Jar文件,這樣顯然造成了不便,其實,不一定非要這樣來實現,我們可以使用Python與Hadoop 關聯進行編程,看看位於/src/examples/python/wordCount.py 的例子,你將了解到我在說什麼。
我們想要做什麼?
我們將編寫一個簡單的 MapRece 程序,使用的是C-Python,而不是Jython編寫後打包成jar包的程序。
我們的這個例子將模仿 WordCount 並使用Python來實現,例子通過讀取文本文件來統計出單詞的出現次數。結果也以文本形式輸出,每一行包含一個單詞和單詞出現的次數,兩者中間使用製表符來想間隔。
先決條件
編寫這個程序之前,你學要架設好Hadoop 集群,這樣才能不會在後期工作抓瞎。如果你沒有架設好,那麼在後面有個簡明教程來教你在Ubuntu linux 上搭建(同樣適用於其他發行版linux、unix)
如何使用Hadoop Distributed File System (HDFS)在Ubuntu Linux 建立單節點的 Hadoop 集群
如何使用Hadoop Distributed File System (HDFS)在Ubuntu Linux 建立多節點的 Hadoop 集群
Python的MapRece代碼
使用Python編寫MapRece代碼的技巧就在於我們使用了 HadoopStreaming 來幫助我們在Map 和 Rece間傳遞數據通過STDIN (標准輸入)和STDOUT (標准輸出).我們僅僅使用Python的sys.stdin來輸入數據,使用sys.stdout輸出數據,這樣做是因為HadoopStreaming會幫我們辦好其他事。這是真的,別不相信!
Map: mapper.py
將下列的代碼保存在/home/hadoop/mapper.py中,他將從STDIN讀取數據並將單詞成行分隔開,生成一個列表映射單詞與發生次數的關系:
注意:要確保這個腳本有足夠許可權(chmod +x /home/hadoop/mapper.py)。
#!/usr/bin/env python
import sys
# input comes from STDIN (standard input)
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
for word in words:
# write the results to STDOUT (standard output);
# what we output here will be the input for the
# Rece step, i.e. the input for recer.py
#
# tab-delimited; the trivial word count is 1
print '%s\\t%s' % (word, 1)在這個腳本中,並不計算出單詞出現的總數,它將輸出 "<word> 1" 迅速地,盡管<word>可能會在輸入中出現多次,計算是留給後來的Rece步驟(或叫做程序)來實現。當然你可以改變下編碼風格,完全尊重你的習慣。
Rece: recer.py
將代碼存儲在/home/hadoop/recer.py 中,這個腳本的作用是從mapper.py 的STDIN中讀取結果,然後計算每個單詞出現次數的總和,並輸出結果到STDOUT。
同樣,要注意腳本許可權:chmod +x /home/hadoop/recer.py
#!/usr/bin/env python
from operator import itemgetter
import sys
# maps words to their counts
word2count = {}
# input comes from STDIN
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# parse the input we got from mapper.py
word, count = line.split('\\t', 1)
# convert count (currently a string) to int
try:
count = int(count)
word2count[word] = word2count.get(word, 0) + count
except ValueError:
# count was not a number, so silently
# ignore/discard this line
pass
# sort the words lexigraphically;
#
# this step is NOT required, we just do it so that our
# final output will look more like the official Hadoop
# word count examples
sorted_word2count = sorted(word2count.items(), key=itemgetter(0))
# write the results to STDOUT (standard output)
for word, count in sorted_word2count:
print '%s\\t%s'% (word, count)
測試你的代碼(cat data | map | sort | rece)
我建議你在運行MapRece job測試前嘗試手工測試你的mapper.py 和 recer.py腳本,以免得不到任何返回結果
這里有一些建議,關於如何測試你的Map和Rece的功能:
——————————————————————————————————————————————
\r\n
# very basic test
hadoop@ubuntu:~$ echo "foo foo quux labs foo bar quux" | /home/hadoop/mapper.py
foo 1
foo 1
quux 1
labs 1
foo 1
bar 1
——————————————————————————————————————————————
hadoop@ubuntu:~$ echo "foo foo quux labs foo bar quux" | /home/hadoop/mapper.py | sort | /home/hadoop/recer.py
bar 1
foo 3
labs 1
——————————————————————————————————————————————
# using one of the ebooks as example input
# (see below on where to get the ebooks)
hadoop@ubuntu:~$ cat /tmp/gutenberg/20417-8.txt | /home/hadoop/mapper.py
The 1
Project 1
Gutenberg 1
EBook 1
of 1
[...]
(you get the idea)
quux 2
quux 1
——————————————————————————————————————————————
在Hadoop平台上運行Python腳本
為了這個例子,我們將需要三種電子書:
The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson\r\n
The Notebooks of Leonardo Da Vinci\r\n
Ulysses by James Joyce
下載他們,並使用us-ascii編碼存儲 解壓後的文件,保存在臨時目錄,比如/tmp/gutenberg.
hadoop@ubuntu:~$ ls -l /tmp/gutenberg/
total 3592
-rw-r--r-- 1 hadoop hadoop 674425 2007-01-22 12:56 20417-8.txt
-rw-r--r-- 1 hadoop hadoop 1423808 2006-08-03 16:36 7ldvc10.txt
-rw-r--r-- 1 hadoop hadoop 1561677 2004-11-26 09:48 ulyss12.txt
hadoop@ubuntu:~$
復制本地數據到HDFS
在我們運行MapRece job 前,我們需要將本地的文件復制到HDFS中:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -FromLocal /tmp/gutenberg gutenberg
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls
Found 1 items
/user/hadoop/gutenberg <dir>
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls gutenberg
Found 3 items
/user/hadoop/gutenberg/20417-8.txt <r 1> 674425
/user/hadoop/gutenberg/7ldvc10.txt <r 1> 1423808
/user/hadoop/gutenberg/ulyss12.txt <r 1> 1561677
執行 MapRece job
現在,一切准備就緒,我們將在運行Python MapRece job 在Hadoop集群上。像我上面所說的,我們使用的是
HadoopStreaming 幫助我們傳遞數據在Map和Rece間並通過STDIN和STDOUT,進行標准化輸入輸出。
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-mapper /home/hadoop/mapper.py -recer /home/hadoop/recer.py -input gutenberg/*
-output gutenberg-output
在運行中,如果你想更改Hadoop的一些設置,如增加Rece任務的數量,你可以使用「-jobconf」選項:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-jobconf mapred.rece.tasks=16 -mapper ...
一個重要的備忘是關於Hadoop does not honor mapred.map.tasks
這個任務將會讀取HDFS目錄下的gutenberg並處理他們,將結果存儲在獨立的結果文件中,並存儲在HDFS目錄下的
gutenberg-output目錄。
之前執行的結果如下:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar
-mapper /home/hadoop/mapper.py -recer /home/hadoop/recer.py -input gutenberg/*
-output gutenberg-output
additionalConfSpec_:null
null=@@@userJobConfProps_.get(stream.shipped.hadoopstreaming
packageJobJar: [/usr/local/hadoop-datastore/hadoop-hadoop/hadoop-unjar54543/]
[] /tmp/streamjob54544.jar tmpDir=null
[...] INFO mapred.FileInputFormat: Total input paths to process : 7
[...] INFO streaming.StreamJob: getLocalDirs(): [/usr/local/hadoop-datastore/hadoop-hadoop/mapred/local]
[...] INFO streaming.StreamJob: Running job: job_200803031615_0021
[...]
[...] INFO streaming.StreamJob: map 0% rece 0%
[...] INFO streaming.StreamJob: map 43% rece 0%
[...] INFO streaming.StreamJob: map 86% rece 0%
[...] INFO streaming.StreamJob: map 100% rece 0%
[...] INFO streaming.StreamJob: map 100% rece 33%
[...] INFO streaming.StreamJob: map 100% rece 70%
[...] INFO streaming.StreamJob: map 100% rece 77%
[...] INFO streaming.StreamJob: map 100% rece 100%
[...] INFO streaming.StreamJob: Job complete: job_200803031615_0021
[...] INFO streaming.StreamJob: Output: gutenberg-output hadoop@ubuntu:/usr/local/hadoop$
正如你所見到的上面的輸出結果,Hadoop 同時還提供了一個基本的WEB介面顯示統計結果和信息。
當Hadoop集群在執行時,你可以使用瀏覽器訪問 http://localhost:50030/ ,如圖:
檢查結果是否輸出並存儲在HDFS目錄下的gutenberg-output中:
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls gutenberg-output
Found 1 items
/user/hadoop/gutenberg-output/part-00000 <r 1> 903193 2007-09-21 13:00
hadoop@ubuntu:/usr/local/hadoop$
可以使用dfs -cat 命令檢查文件目錄
hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -cat gutenberg-output/part-00000
"(Lo)cra" 1
"1490 1
"1498," 1
"35" 1
"40," 1
"A 2
"AS-IS". 2
"A_ 1
"Absoluti 1
[...]
hadoop@ubuntu:/usr/local/hadoop$
注意比輸出,上面結果的(")符號不是Hadoop插入的。
轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦