2016-03-03 50 views
1

任何機構都可以解釋我在Hadoop中索引過程的含義。 它是否像我們在RDBMS中執行的傳統數據索引那樣,因此在Hadoop中我們使用相同的類比來索引數據塊並將塊的物理地址存儲在某些數據結構中。 因此,它將成爲羣集中的一個額外空間。Hadoop中的索引過程

圍繞這個話題搜索,但沒有得到任何滿意和詳細的東西。 任何指針都會有所幫助。

在此先感謝

回答

0

我們可以找出創建索引2不同的粒度級別:基於指數上的文件URI或索引基於InputSplit。我們來看兩個不同的數據集示例。

索引

this第一示例中,2個文件數據中的在25個塊設置配合,並且已被確定爲7個不同InputSplits。您正在尋找的目標(灰色突出顯示)在文件#1(塊#2,#8和#13)和文件#2(塊#17)上可用

使用基於文件的索引,您將結束與2個文件(在這裏完整的數據集),這意味着您的索引查詢將相當於一個完整的掃描查詢 使用基於InputSplit的索引,您將最終有7個可用的4個InputSplits。性能應該肯定比全面掃描查詢要好 索引

我們以second爲例。這次,相同的數據集已經按您想索引的列進行排序。您正在查找的目標(灰色突出顯示)現在可在文件#1(塊#1,#2,#3和#4)上找到。

使用基於文件的索引,你最終會與您的數據只有1文件中設置 使用基於InputSplit索引,你將最終獲得1個InputSplit 7可用 對於這個特定的研究,我決定使用自定義InputSplit基於指數。我認爲這種方法應該在實現所需的努力,性能優化帶來的附加價值以及預期適用性之間取得很好的平衡,無論數據分佈如何。

1

Hadoop將數據存儲在文件中,並且不對它們編制索引。爲了找到一些東西,我們必須運行一個MapReduce作業來處理所有的數據。對於數據庫來說數據太大的Hadoop非常有效。對於非常大的數據集,再生索引的成本非常高,您無法輕鬆索引更改的數據。

但是,我們可以在HDFS中使用兩種類型的索引。基於文件的索引&基於InputSplit的索引。 讓我們假設我們有2個文件存儲在HDFS中進行處理。第一個是500 MB,第二個是250 MB。因此,我們將在第一個文件中有4個InputSplits,每個在第2個文件中有3個InputSplits。 我們可以爲上述案例應用兩種索引 - 1.使用基於文件的索引,最終將包含2個文件(此處爲完整數據集),這意味着您的索引查詢將等同於完整掃描查詢 2 。使用基於InputSplit的索引,您最終將得到4個InputSplits。性能應該比完整掃描查詢更好。

現在,爲了實現InputSplits指數,我們需要執行以下步驟:

  1. 構建指數從完整的數據集 - 這可以通過編寫MapReduce工作來提取我們要索引值achived,並將其與InputSplit MD5散列一起輸出。
  2. 得到InputSplit(個),你正在尋找的索引值 - 的MapReduce程序的輸出將減少文件(包含基於InputSplits指數),這將被存儲在HDFS
  3. 執行對索引InputSplits實際的MapReduce工作只要。 - 這可以通過Hadoop完成,因爲它可以使用FileInputFormat.class檢索要使用的InputSplit的數量。我們將創建自己的IndexFileInputFormat類,擴展默認的FileInputFormat.class,並覆蓋getSplits()方法。您必須閱讀您在上一步創建的文件,將所有索引的InputSplits添加到列表中,然後將該列表與超類返回的列表進行比較。您只會返回在您的索引中找到的InputSplits到JobTracker。
  4. 在Driver類中,我們現在使用這個IndexFileInputFormat類。我們需要設置爲InputFormatClass使用 - 要使用我們的自定義IndexFileInputFormat在Driver類中,我們需要提供 job.setInputFormatClass(IndexFileInputFormat.class);

代碼示例和其他詳細信息請參閱本 -

https://hadoopi.wordpress.com/2013/05/24/indexing-on-mapreduce-2/