若是是MapReduce如何實現一個WordCount的?node
MapReduce程序執行分爲兩個主要階段:爲mapping和reducing,每一個階段均定義爲一個數據處理函數,分別被稱爲mapper和reducer。shell
運行邏輯數據庫
在mapping階段,MapReduce獲取輸入數據並將數據單元裝入mapper。apache
在reducing階段,reducer處理來自mapper的全部輸出,並給出最終結果。編程
簡而言之網絡
mapper意味着將輸入進行過濾與轉換,使reducer能夠完成聚合。架構
mapping、reducing、partitioning和shuffling在Hadoop都是什麼玩意?他們是如何的無縫的工做在一塊兒的?app
爲了使他們無縫的工做在一塊兒,咱們須要在通用結構上達成一致。負載均衡
MapReduce的數據原語是?框架
MapReduce使用列表和鍵/值對做爲其主要的數據原語,鍵與值一般爲整數或字符串,但也能夠是可忽略的假值,或者是複雜的對象類型。
map和reduce函數必須遵循如下對鍵和值類型的約束?
在MapReduce框架中編寫應用程序就是定製化mapper和reducer的過程。
完整的數據流是?
輸入 |
輸出 |
|
map |
<k1, v1> |
list(<k2, v2>) |
reduce |
<k2, list(v2)> |
list(<k3, v3>) |
1、應用的輸入必須爲一個鍵/值對的列表list(<k1, k2>)。
用於處理多個文件的輸入格式一般爲list(<String filename, String file_content>)。
用於處理日誌文件這種大文件輸入格式爲list(<Integer line_number, String log_event>)
2、含有鍵/值對的列表被拆分,進而經過調用mapper的map函數對每一個單獨的鍵/值對<k1,v1>進行處理。在這裏,鍵k1常常被mapper所忽略。mapper轉換每一個<k1, v1>對並將之放入<k2, v2>對的列表中。這種轉換的細節很大程度上決定了MapReduce程序的行爲,值得注意的是,處理鍵/值對能夠採用任意的順序。並且,這種轉換必須是封閉的,使得輸出僅依賴於一個單獨的鍵/值對。
對2進行解釋
對於單詞統計,<String filename, String file_content>被輸入mapper,而其中的filename被忽略。mapper能夠輸出一個<String word, Integer count>的列表。咱們發現計數值將在後續階段聚合,是否能夠提早合併?好比不是輸出3次<"foo", 1>而是輸出1次<"foo", 3>,能夠看到,前者更容易編程,後者會得到性能上的優化。
3、全部的mapper的輸出 (在概念上) 被聚合到一個包含<k2, v2>對的巨大列表中。全部共享相同k2的對被組織在一塊兒造成一個新的鍵/值對<k2, list<v2>>。框架讓reducer來分別處理每個被聚合起來的<k2, list(v2)>。
對3進行解釋
一個文檔的map輸出的列表中可能出現三次<"foo", 1>,而另外一個文檔的map輸出列表可能出現兩次<"foo", 1>。reducer所看到的聚合的對爲<"foo", list(1, 1, 1, 1, 1)>。在單詞統計中,reducer的輸出爲<"foo", 5>,表示"foo"在文檔集合中總計出現的次數。每個reducer負責不一樣的單詞。MapReduce框架自動搜索全部的<k3, v3>並將之寫入文件。
基於MapReduce重寫單詞統計程序:
map(String filename, String document) {
List<String> T = tokenize(document);
for each token in T {
emit((String)token, (Integer)1);
}
}
reduce(String token, List<Integer> values) {
Integer sum = 0;
for each value in values {
sum = sum + value;
}
emit((String)token, (Integer)sum)
}
Hadoop的開發平臺和生產平臺是什麼?
Linux是Hadoop公認的開發和生產平臺。其餘,呵呵...
Hadoop須要Java支持?
固然,Java1.6或更高版本。
Hadoop 1.X的穩定版本是?
1.0.3和1.0.4目前我用過這兩個版本,2.X沒用過...
如何配置Hadoop與Java的鏈接,使得在運行hadoop時,它能夠自動找到Java組件?
在$HADOOP_PREFIX/conf/hadoop-env.sh中, 輸入export JAVA_HOME=/...
爲何不用HADOOP_HOME,由於它廢棄了。
Hadoop腳本有哪些?
在不啓動hadoop時,也可使用該腳本。由於它是shell腳本。
在bin目錄下,執行bin/hadoop獲得:
Usage:hadoop [--config confdir] COMMAND |
|
這裏COMMAND爲下列其中一個 |
|
namenode -format |
格式化DFS文件系統 |
secondarynamenode |
運行DFS的secondarynamenode |
namenode |
運行DFS的namenode |
datanode |
運行DFS的datanode |
dfsadmin |
運行DFS的admin客戶端 |
fsck |
運行DFS的文件系統檢查工具 |
fs |
運行普通文件系統用戶客戶端 |
balancer |
集羣負載均衡工具 |
jobtracker |
運行MapReduce的jobTracker節點 |
pipes |
運行一個Pipes做業 |
tasktracker |
運行MapReduce的tasktracker |
job |
處理MapReduce做業 |
version |
打印版本 |
jar |
運行一個jar文件 |
distcp <srcurl> <desturl> |
遞歸地複製文件或者目錄 |
archive -archiveName NAME <src>* <dest> |
生成一個Hadoop檔案 |
daemonlog或CLASSNAME |
獲取或設置每一個daemon的log級別 運行名爲CLASSNAME的類大多數命令會在使用w/o參數時打出幫助信息 |
Hadoop歷史
Lucene、Nutch和Hadoop的關係
Hadoop開始時時Nutch的一個子項目,而Nutch又是Apache Lucene的一個子項目。這3個項目都是Doug Cutting所創立的,每一個項目在邏輯上都是前一個項目的演進。
Lucene是什麼?
Lucene是一個功能全面的文本索引和查詢庫。給定一個文本集合,開發者就可使用Lucene引擎方便地在文檔上添加搜索功能。桌面搜索、企業搜索,以及許多領域特定的搜索引擎使用都是Lucene。
Nutch是什麼?
做爲Luncene的擴展,Nutch的目標可謂雄心勃勃,它試圖以Lucene爲核心創建一個完整的Web搜索引擎。Nutch爲HTML提供瞭解析器,還具備網頁抓取工具、連接圖形數據庫和其餘網絡搜索引擎的額外組件。Doug Cutting所設想的Nutch是開放與民主的,能夠替代Google等商業產品的壟斷技術。
網絡搜索引擎與基本的文檔搜索引擎的區別是?
除了增長了像抓取器和解析器這樣的組件,他倆最大區別就在於規模。
Nutch團隊想要打破Google等商業產品的壟斷技術,都面臨哪些困難?
首先:Lucene的目標是索引數百萬的文檔,而Nutch應該可以處理十億的網頁,並且不能帶來過分的操做開銷,這在量級上已經不能相提並論。
其次:Nutch得運行在由商用硬件組成的分佈式集羣上,Nutch團隊面臨的挑戰是解決軟件可擴展性問題,即要在Nutch中創建一個層,來負責分佈式處理、冗餘、自動故障恢復和負載均衡。
以上這些挑戰絕非易事。
Doug Cutting此時在幹啥捏?
2004年左右,Google發表了兩篇論文來論述Google文件系統(GFS)和MapReduce框架。Google稱使用了這兩項技術來擴展本身的搜索系統。Doug Cutting當即看到了這些技術能夠適用於Nutch,接着他的團隊實現了一個新的框架,將Nutch移植上去。這種新的實現立刻提高了Nutch可擴展性。它開始可以處理幾億個網頁,並可以運行在幾十個節點的集羣上。
Doug認識到設計一個專門的項目能夠充實兩種網絡擴展所需的技術,因而就有了Hadoop。
雅虎挺給力哈。
雅虎在2006年1月聘請Doug,讓他和一個專項團隊一塊兒改進Hadoop,並將其做爲一個開源項目。兩年後Hadoop成爲Apache的頂級項目。後來,在2008年2月19日,雅虎宣佈其索引網頁的生產系統採用了在10000多個核的Linux集羣上運行的Hadoop。
資源
Hadoop的官方網站:http://hadoop.apache.org/.
Google文件系統和MapReduce的原始論文很值得一讀,能夠了解它們的底層設計和架構:
The Google File System
MapReduce: Simplified Data Processing on Large Clusters
原本有連接,可是失效了。童鞋本身搜搜吧。