在文章開始之前,我們還是簡單來回顧下Pig的的前塵往事:
1,Pig是什麼?
Pig最早是雅虎公司的一個基於Hadoop的並行處理架構,後來Yahoo將Pig捐獻給Apache(一個開源軟件的基金組織)的一個項目,由Apache來負責維護,Pig是一個基於 Hadoop的大規模數據分析平臺,它提供的SQL-like語言叫Pig Latin,該語言的編譯器會把類SQL的數據分析請求轉換爲一系列經過優化處理的MapReduce運算。Pig爲複雜的海量數據並行計算提供了一個簡 易的操作和編程接口,這一點和FaceBook開源的Hive(一個以SQL方式,操作hadoop的一個開源框架)一樣簡潔,清晰,易上手!
2,Pig用來幹什麼?
要回答這個問題,還得迴歸到雅虎當初使用Pig的目的:
1)吸收和分析用戶的行爲日誌數據(點擊流分析、搜索內容分析等),改進匹配和排名算法,以提高檢索和廣告業務的質量。
2)構建和更新search index。對於web-crawler抓取了的內容是一個流數據的形式,這包括去冗餘、鏈接分析、內容分類、基於點擊次數的受歡迎程度計算(PageRank)、最後建立倒排表。
3)處理半結構化數據訂閱(data seeds)服務。包括:deduplcaitin(去冗餘),geographic location resolution,以及 named entity recognition.
3, Pig在Hadoop生態系統中的地位
OK,下面回答正題,散仙最近在做的一個項目也是有關我們站搜索的關鍵詞的點擊率分析,我們的全站的日誌數據,全部記錄在Hadoop上,散仙初步要做的任務以及此任務的意義如下:
(1)找出來自我站搜索的數據
(2)分析關鍵詞在某個時期內的搜索次數
(3)分析關鍵詞在某個時期的點擊次數
(4)通過這些數據,找出一些搜索無點擊,搜索有點擊,搜索點擊少,和少搜索點擊高等的一些邊界關鍵詞
(5)通過分析這些關鍵詞,來評估我們站的搜索質量,給搜索方案的優化,以及改良提供一些參考依據
(6)使用Lucene或Solr索引存儲分析後的數據,並提供靈活強大的檢索方式
具體的使用Pig分析數據過程,散仙在這裏就不細寫了,感興趣的朋友,可以在微信公衆號的後臺留言諮詢,今天主要看下,Pig分析完的數據結果如何存儲到Lucene索引裏,至於爲什麼選擇lucene系列的索引存儲,而不選擇數據庫存儲或直接存儲在HDFS上,最大的原因還是在速度上,散仙前段時間分析的數據是直接存儲在HDFS上,存HDFS上是很好,又能備份,還能容災,但是! 但是查詢,讀取,過濾,轉換就非常麻煩了,速度慢的沒法說,每次都得讀取數據,然後使用JAVA程序計算出最終結果,然後給前端展示,即使數據量並不太大,但中間耗費了較多的時間數據的讀取,傳輸和分析上,所以這次在分析關鍵詞的轉化率時,乾脆就順便研究下,如何使用Pig和Lucene,Solr或者ElasticSearch集成。
Pig或Hive本身能直接將各種格式的文件包括二進制,json,avro,以及bzip,gzip,lzo,snappy,orc等各種壓縮格式存儲在HDFS上或Hbase裏,但是卻不能直接將Lucene索引存儲在HDFS上,至於爲什麼不能直接存儲索引在HDFS上,這個與倒排索引的文件結構的組織方式有一定的關係,感興趣的朋友可以在微信公衆號上留言諮詢,雖說不能直接存儲在HDFS上,但是我們可以間接得通過他們的UDF函數來擴展Pig或Hive,使得他們支持索引存儲,注意這裏雖然實現了索引存儲在HDFS上,但實質卻是,在本地的臨時目錄先生成索引,然後又變相的拷貝到了HDFS上,算是一種折中的算式吧。在Pig裏,需要定義兩個UDF上來完成索引存儲這件事,一個主要是創建索引,另一個是索引輸出,在github上已有大牛實現了,我們需要做的工作:
(1)訪問這個地址下載這個壓縮包。
(2)提取出自己想要的部分,在eclipse工程中,修改定製適合自己環境的的代碼(Lucene版本是否兼容?hadoop版本是否兼容?,Pig版本是否兼容?)。
(3)使用ant重新打包成jar
(4)在pig裏,註冊相關依賴的jar包,並使用索引存儲
下面給出,散仙的測試的腳本:
---註冊依賴相關的包
REGISTER /home/search/nsconvent/spig/20150112/lucenepig/pigudf.jar;
REGISTER /home/search/nsconvent/spig/20150112/lucenepig/lucene-analyzers-common-4.10.2.jar;
REGISTER /home/search/nsconvent/spig/20150112/lucenepig/lucene-core-4.10.2.jar;
REGISTER /home/search/nsconvent/spig/20150112/lucenepig/lucene-queryparser-4.10.2.jar;
--聲明別名引用(注意只能無參的引用,帶參數的在反射時候,會出現異常)
DEFINE LuceneStore com.pig.support.lucene.LuceneStore;
--加載數據
a = load '/tmp/data/20150303/tt.txt' using PigStorage(',') as (lbl:chararray,desc:chararray,score:int); ;
--生成索引並存儲在HDFS上,注意需要配置簡單lucene索引方式(是否存儲?是否索引?)
store a into '/tmp/data/20150303/luceneindex' using LuceneStore('store[true]:tokenize[true]');
至此,我們已成功將索引存儲在HDFS上,別高興太宰,這僅僅是一個開始而已,在這裏大家可能有疑問,存儲在HDFS上的索引是否能夠直接查詢或訪問呢? 答案是肯定的,但不推薦大家直接讀取HDFS上索引,即使了有了Hadoop的塊緩存(Block Cache)提速,性能仍然是比較低的,除非你的集羣機器不缺內存,否則,散仙還是建議大家直接把索引拷貝到本地磁盤再檢索,這樣做暫時比較麻煩,散仙在後面的文章裏會介紹怎麼把pig生成的結果集,直接以Http的方式存儲到Solr或ElasticSearch裏,這樣以來就非常方便快捷了。
本文就到此結束,有任何疑問的朋友,都可以直接在微信公衆號裏留言諮詢,公衆號的二維碼在文末能夠看到,大家用手機騷一下,就能直接關注,好了,不扯了,趕緊回家,在尼瑪不走,苦逼的就沒地鐵了!!!