Hadoop學習筆記 8

2021-07-31 23:25:11 字數 3054 閱讀 3829

倒排索引是文件檢索系統中最常用資料結構。根據單詞反過來查在文件中出現的頻率,而不是根據文件來,所以稱倒排索引(inverted index)。結構如下:

這張索引表中, 每個單詞都對應著一系列的出現該單詞的文件,權表示該單詞在該文件中出現的次數。現在我們假定輸入的是以下的檔案清單:

t1 : hello world hello china

t2 : hello hadoop

t3 : bye world bye hadoop bye bye

輸入這些檔案,我們最終將會得到這樣的索引檔案:

bye    t3:4;

china    t1:1;

hadoop    t2:1;t3:1;

hello    t1:2;t2:1;

world    t1:1;t3:1;

接下來,我們就是要想辦法利用hadoop來把這個輸入,變成輸出。從上一章中,其實也就是分析如何將hadoop中的步驟個性化,讓其工作。整個步驟中,最主要的還是map和reduce過程,其它的都可稱之為配角,所以我們先來分析下map和reduce的過程將會是怎樣?

首先是map的過程。map的輸入是文字輸入,一條條的行記錄進入。輸出呢?應該包含:單詞、所在檔案、單詞數。 map的輸入是key-value。 那這三個資訊誰是key,誰是value呢? 數量是需要累計的,單詞數肯定在value裡,單詞在key中,檔案呢?不同檔案內的相同單詞也不能累加的,所以這個檔案應該在key中。這樣key中就應該包含兩個值:單詞和檔案,value則是預設的數量1,用於後面reduce來進行合併。

所以map後的結果應該是這樣的:

key value

hello;t1 1

hello:t1 1

world:t1 1

china:t1 1

hello:t2 1 …

即然這個key是復合的,所以常歸的型別已經不能滿足我們的要求了,所以得設定乙個復合健。復合健的寫法在上一章中描述到了。所以這裡我們就直接上**:

public

static

class mytype implements writablecomparable

private string word;

public string getword()

public

void setword(string value)

private string filepath;

public string getfilepath()

public

void setfilepath(string value)

@override

public

void write(dataoutput out) throws ioexception

@override

public

void readfields(datainput in) throws ioexception

@override

public

int compareto(mytype arg0) }

有了這個復合健的定義後,這個map函式就好寫了:

public

static

public

void map(object key, text value, context context)

throws interruptedexception, ioexception }

} 注意:第13行,路徑是全路徑的,為了看起來方便,我們把目錄替換掉,直接取檔名。

有了map,接下來就可以考慮recude了,以及在map之後的combine。map的輸出的key型別是mytype,所以reduce以及combine的輸入就必須是mytype了。

如果直接將map的結果送到reduce後,發現還需要做大量的工作來將key中的單詞再重排一下。所以我們考慮在reduce前加乙個combine,先將數量進行一輪合併。

這個combine將會輸入下面的值:

key value

bye    t3:4;

china    t1:1;

hadoop    t2:1;

hadoop    t3:1;

hello    t1:2;

hello    t2:1;

world    t1:1;

world    t3:1;

**如下:

public

static

class invertedindexcombiner extends

reducer

context.write(key, new text(key.getfilepath()+ ":" + sum)); }

} 有了上面combine後的結果,再進行reduce就容易了,只需要將value結果進行合併處理:

public

static

class invertedindexreducer extends

reducer

result.set(filelist);

context.write(new text(key.getword()), result); }

}經過這個reduce處理,就得到了下面的結果:

bye    t3:4;

china    t1:1;

hadoop    t2:1;t3:1;

hello    t1:2;t2:1;

world    t1:1;t3:1;

最後,mapreduce函式都寫完後,就可以掛在job中執行了。

public

static

void main(string args) throws ioexception,

interruptedexception, classnotfoundexception

注:這裡為了除錯方便,我們把in和out都寫死,不用傳入執行引數了,並且,每次執行前,判斷out資料夾是否存在,如果存在則刪除。

8 hadoop學習筆記02

一 hdfs架構 主從結構 1 namenode nn 名稱節點 a 檔案的名稱 b 檔案的目錄結構 c 檔案的屬性 許可權 副本數 建立時間 d 乙個檔案被對於切割哪些資料塊 包含副本數的塊 對應分布在哪些datanode blockmap塊對映 nn是不會持久這種對映關係的。是通過集群的啟動和執...

Hadoop學習筆記 Hadoop初識

序言 資訊化發展到當今,網際網路的資料量是不斷地增加,那麼如何很好的處理以及利用這些資料可能是未來的乙個發展方向,這也之所以產生了各種平台的雲計算。對於網際網路而言,大資料量可分為兩種 第 一 大訪問量請求 第 二 大資料量處理。大訪問量請求這個事應用端應該思考的問題,如何很好的處理大的訪問量,如何...

Hadoop學習筆記

hadoop介紹 hadoop是google雲計算框架的開源實現,是乙個分布式儲存和分布式計算的框架,主要包括hdfs和mapreduce的實現。hdfs hdfs由乙個namenode和多個datanode組成,其中namenode相當於系統的元資料存放地,它是hadoop系統的神經中樞,而多個d...