在文章開始以前,咱們仍是簡單來回顧下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包,並使用索引存儲
下面給出,散仙的測試的腳本:
前端
---註冊依賴相關的包 github
REGISTER /home/search/nsconvent/spig/20150112/lucenepig/pigudf.jar; web
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; 編程
--聲明別名引用(注意只能無參的引用,帶參數的在反射時候,會出現異常) json
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裏,這樣以來就很是方便快捷了。 本文就到此結束,有任何疑問的朋友,均可以直接在微信公衆號裏留言諮詢,公衆號的二維碼在文末可以看到,你們用手機騷一下,就能直接關注,好了,不扯了,趕忙回家,在尼瑪不走,苦逼的就沒地鐵了!!!