1. 程式人生 > >基於hadoop搜尋引擎實踐——二級索引檔案(五)

基於hadoop搜尋引擎實踐——二級索引檔案(五)

基於hadoop搜尋引擎——二級索引檔案     一般生成的倒排表檔案會比原始檔暫用空間大,主要是倒排表檔案所記錄的資訊比較詳細。它記錄了所有的索引詞記錄(TERM_RECORD)資訊,對於常見的關鍵詞(TERM),其MULTI_INFO可能包含幾萬甚至幾十萬個SINGLE_INFO.     由於倒排表檔案很大。系統難以將其在同一時刻全部裝入記憶體;另外一面,使用者在查詢時只會用到幾個TERM及其對應的MULTI_INFO。為了提高查詢速度,將倒排檔案以Hash表的方式儲存在記憶體中,這樣在接受查詢TERM的請求時,可以快速返回對應的MULTI_INFO,因此,本系統將倒排表檔案劃分成若干個字表檔案(每個子表文件包含一部分TERM_RECORD),並建立一個描述TERM和其所在子表文件位置的對應關係的索引檔案(索引詞表)。 1.分割倒排索引檔案     為了保證資料分佈的均衡性,在分隔倒排表檔案時,精良保證字表檔案的大小相差不多。為了達到這一目標,利用MapReduce程式設計模型具有的2階段性,完成對倒排表檔案的分割。      MR程式對資料的處理過程包括Map和Reduce兩個階段。在Map階段結束後,通過分割槽(Partition)過程,Mapper發射出來的資料,Partitioner分配至各個Reducer處理。預設情況下,Partitioner將具有相同的key的<key,value>對傳送至同一個Reduce函式處理。分割倒排表檔案演算法的設計思路是改寫分散式系統提供的Partitioner函式,令其在洗牌過程中將資料均勻分佈給各個Reducer函式,而不是根據key的情況進行分發。Partitiner演算法程式碼如下:
    public class SplitFilePartitioner<K, V> extends Partitioner<K, V> {
    public static int lastID = 0;
    @Override
    public int getPartition(K key, V value, int partitionNum) {
        this.lastID++;
        lastID = (this.lastID % partitionNum);
        return lastID;
    }
}


2.生成二級索引檔案     分割後的倒排字表檔案中都互不重複地儲存了倒排檔案的部分資訊。然而,在執行一個查詢TERM的命令時,系統並不知道"TERM_RECORD"儲存在哪個字表中。因此,需要建立一個索引檔案,該檔案儲存每個TERM與其所在字表(包括在字表中位置)的對映關係,具體格式定義如下:     (1)索引檔案(INDEX_FILE)由若干詞及其索引資訊組成。每個詞及其索引資訊是由一個索引詞(TERM)和該詞的索引資訊(INDEX_INFO)組成的,其中TERM和INDEX_INFO之間用空格隔開。索引詞記錄按照順序最佳的方式存放,之間用製表符分隔,表示格式如下:     TERM+'\t'+INDEX_INFO+'\n';     (2)每個詞的索引資訊(INDEX_INFO)由子表編號(TABLE_ID),這條索引記錄相在該子表中德偏移量(OFFSET)組成,其間用空格隔開。表示如下:     INDEX_INFO=TABLE_ID+空格+OFFSET     程式碼如下:    
public static class TokenIndexMapper extends
            Mapper<LongWritable, Text, Text, Text> {

        @Override
        protected void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            String line = value.toString();
            FileSplit split = (FileSplit) context.getInputSplit();
            context.write(new Text(line.split("\t")[0]), new Text(split
                    .getPath().toString() + " " + key.get()));
        }
    }

    public static class TokenIndexReducer extends
            Reducer<Text, Text, Text, Text> {
        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context)
                throws IOException, InterruptedException {
            boolean flag = true;
            while (values.iterator().hasNext()) {
                if (flag) {
                    context.write(key, values.iterator().next());
                    flag = false;
                }else{
                    values.iterator().next();
                }
            }
        }
    }

    在經過過濾原始檔資料,建立倒排表檔案,生成二級索引檔案等一系列工作之後,整個系統的核心離線工作部分就全部完成了。此後,每當從前臺接收到一個TERM查詢時,本系統首先從索引檔案(INDEX_FILE)中找出這個TERM儲存在什麼子表的位置(INDEX_INFO);然後開啟對應的子表文件並定位相應的位置,讀出這個TERM及其對應的MULTI_INFO;最後分析MULTI_INFO中每個SINGLE_INFO的資訊,從過濾後的原始檔(FlITERED_SOURCE_FILE)中找出相應的帖子資訊返回即可。 參考文獻: 1.劉鵬,hadoop實戰,電子工業出版社,2011.9

相關推薦

基於hadoop搜尋引擎實踐——二級索引檔案

基於hadoop搜尋引擎——二級索引檔案     一般生成的倒排表檔案會比原始檔暫用空間大,主要是倒排表檔案所記錄的資訊比較詳細。它記錄了所有的索引詞記錄(TERM_RECORD)資訊,對於常見的關鍵詞(TERM),其MULTI_INFO可能包含幾萬甚至幾十萬個SINGLE_INFO.     由於倒排表檔

時序資料庫 Apache-IoTDB 原始碼解析之檔案索引

上一章聊到 TsFile 的檔案組成,以及資料塊的詳細介紹。詳情請見: 時序資料庫 Apache-IoTDB 原始碼解析之檔案資料塊(四) 打一波廣告,歡迎大家訪問IoTDB 倉庫,求一波 Star。 這一章主要想聊聊: TsFile索引塊的組成 索引塊的查詢過程 索引塊目前在做的改進項 索引塊 索

hadoop入門筆記MapReduce Shuffle簡介

單位 海量數據 並行處理 詳細 但是 信息 不能 utf 適合 1. MapReduce 定義   Hadoop 中的 MapReduce是一個使用簡單的軟件框架,基於它寫出來的應用程序能夠運行在由上千個商用機器組成的大型集群上,並以一種可靠容錯式並行處理TB級別的數據集

黑盒測試實踐——每日例會記錄

瀏覽器插件 執行 系統 web 編寫測試用例 自動化 即將 spa 自動化測試 2017.11.29例會內容 1.今天,由於臨近交作業時間,組長首先在群內對各組人員即將上交的作業資料進行了匯總 編寫軟件需求規格說明書小組:系統需求規格說明書 編寫測試用例小組:測試用例設計說

基於FPGA的CNN算法移植尋找誌同道合的人

尋找 現在 cnn算法 基於 負責 車輛 pga nbsp 算法 如果現在有人對這個車輛檢測項目感興趣,你負責算法,我負責FPGA硬件。 。。。。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。。

hadoop生態系統學習之路hbase的簡單使用

最近,參與了公司的一個大資料介面平臺的開發,具體的處理過程是這樣的。我們公司負責資料的入庫,也就是一個etl過程,使用MR將資料入到hive裡面,然後同步到impala,然後此介面平臺提供查詢介面,前臺會將sql語句以引數傳過來,然後介面平臺通過呼叫impala

C++基於物件的程式設計基本概念總結-繼承

19.繼承(1) 類與類之間的關係has-A,包含關係,用以描述一個類由多個“部件類”構成,實現has-A關係用類的成員屬性表示,即一個類的成員屬性是另一個已經定義好的類。use-A,一個類使用另一個類,通過類之間的成員函式相互聯絡,定義友元或者通過傳遞引數的方式來實現。is

使用Python處理聲音檔案:繪製立體聲音樂左右聲道頻譜

說明:1、需要首先安裝Python擴充套件庫scipy。2、本文程式碼只適用於未壓縮的WAV聲音

基於PyTorch的深度學習入門教程——訓練神經網路分類器

前言本文參考PyTorch官網的教程,分為五個基本模組來介紹PyTorch。為了避免文章過長,這五個模組分別在五篇博文中介紹。本文是關於Part4的內容。Part4:訓練一個神經網路分類器前面已經介紹了

基於GDAL庫,讀取.grd檔案以海洋地形資料為例C++版

技術背景   海洋地形資料主要是通過美國全球地形起伏資料(GMT)獲得,資料格式為grd(GSBG)二進位制資料,開啟軟體通過是Surfer軟體,surfer軟體可進行資料的編輯處理,以及進一步的視覺化表達等功能操作;由於Surfer軟體不支援二次開發,沒有提供相應的SDK供開發者進行使用,所以這一切只能通

王權富貴書評:《21個專案玩轉深度學習基於TensorFlow的實踐詳解》何之源著

這本書只有例子。例子還屬於那種不完整的。 推薦:-*                                  &nb

10億條long型資料外部排序的檔案分割實踐及優化過程JAVA

 一、題目     生成10億個long隨機數正整數,把它寫入一個檔案裡。然後實現一個函式 fetch(int k,int n)。(fetch函式的輸出結果是這10億個正整數中從小到大中第k個開始(不包含第k個)往後取n個數。)     給定記憶體為2G(一開始為1G)。

基於GDAL庫,讀取.nc檔案以海洋表溫資料為例

  對於做海洋資料處理的同學,會經常遇到nc格式的檔案,nc檔案的格式全稱是NetCDF,具體的詳細解釋請查詢官網【https://www.unidata.ucar.edu/software/netcdf/docs/index.html】,一般從全球大洋資料庫裡面下載的溫鹽、風場及雲量等資料,基本上是nc檔案

如何用Tensorflow訓練模型成pb檔案——基於原始圖片的讀取

簡介 為何要生成pb檔案,大家應該有所瞭解吧,這裡是提供Android的呼叫,即將Tensorflow訓練好了的模型結構和引數移植到Android手機上。 訓練 讀取原始圖片過程,將其ratio=0.2為校驗樣本,0.8的比重為訓練樣本。設定圖片寬w

Webservice實踐基於CXF的服務端開發

本節將實踐目前最流行的第二種web service 釋出和除錯框架  CXF Apache CXF 是一個開放原始碼框架,提供了用於方便地構建和開發 Web 服務的可靠基礎架構。它允許建立高效能和可擴

C++實踐C++實現認證演算法:基於SHA-512的HMAC

基於SHA-512的HMAC演算法 SHA是使用最廣泛的Hash函式。其家族有SHA-1,SHA-2(包括SHA-256/SHA-384/SHA-512)。SHA1與SHA2都使用了同樣的迭代結構和模算術與二元邏輯操作。在本實驗中,我們採用SHA-512。

基於PyTorch的深度學習入門教程——PyTorch重點綜合實踐

前言 PyTorch提供了兩個主要特性: (1) 一個n維的Tensor,與numpy相似但是支援GPU運算。 (2) 搭建和訓練神經網路的自動微分功能。 我們將會使用一個全連線的ReLU網路作為例項。該網路有一個隱含層,使用梯度下降來訓練,目標是最小化

基於Solr的Hbase二級索引

關於Hbase二級索引 HBase 是一個列存資料庫,每行資料只有一個主鍵RowKey,無法依據指定列的資料進行檢索。查詢時需要通過RowKey進行檢索,然後檢視指定列的資料是什麼,效率低下。在實際應用中,我們經常需要根據指定列進行檢索,或者幾個列進行組合檢索,這就提出

如何用Tensorflow訓練模型成pb檔案——基於tfrecord的讀取

簡介 上一篇介紹了基於原始圖片的讀取,這一篇介紹基於TFRecord的讀取。TFRecord是TensorFlow提供的資料讀取格式,效率高。這裡不介紹TFRecord的製作過程,網上有很多,假設你已經瞭解了。 訓練 定義網路結構,與上一篇相似,不多說了,

hadoop路徑讀取檔案的萬用字元

一、萬用字元 萬用字元 註解 * 代表0到多個字元 ? 代表單一字元 [ ab ] 代表字元型別,匹配{a,b}中的一個字元 [ ^ab ]