前言
Pig最早是雅虎公司的一個基於Hadoop的並行處理架構,后來Yahoo將Pig捐獻給Apache的一個項目,由Apache來負責維護,Pig是一個基於 Hadoop的大規模數據分析平台。
Pig為復雜的海量數據並行計算提供了一個簡 易的操作和編程接口,這一點和FaceBook開源的Hive一樣簡潔,清晰,易上手!
一、Pig概述
Pig包括 兩部分
1:用於描述數據流的語言,稱為 Pig Latin (拉丁豬,個人翻譯)
2:用於運行PigLatin程序的 執行環境 。一個是 本地 的單JVM執行環境,一個就是在 hadoop集群上 的分布式執行環境。
Pig Latin程序是由一系列的" 操作"(operation)或"變換"(transformation)組成 。每個操作或變換對輸入進行 數據處理 ,然后產生 輸出的結果 。這些操作整體上描述了一個 數據流 ,Pig執行的環境把數據流翻譯為可執行的內部表示,並運行它。在Pig的內部,這些變換和操作被轉換成一系列的MapReducer,但是我們一般情況下並不知道這些轉換是怎么進行的, 我們的主要的精力就花在數據上,而不是執行的細節上面。
1-2 作用
那么雅虎公司主要使用Pig來干什么呢?
1)吸收和分析用戶的行為日志數據(點擊流分析、搜索內容分析等),改進匹配和排名算法,以提高檢索和廣告業務的質量。
2)構建和更新search index。對於web-crawler抓取了的內容是一個流數據的形式,這包括去冗余、鏈接分析、內容分類、基於點擊次數的受歡迎程度計算(PageRank)、最后建立倒排表。
3)處理半結構化數據訂閱(data seeds)服務。包括:deduplcaitin(去冗余),geographic location resolution,以及 named entity recognition.
1-3 優勢與不足
MapReducer能夠讓我們自己定義 連續執行的map和reduce函數 ,但是數據處理往往需要很多的MapReducer過程才能實現,所以將數據處理要求改寫成MapReducer模式是很 復雜的 。和MapReducer相比,Pig提供了更加 豐富的數據結構 ,一般都是 多值 和 嵌套 的數據結構。Pig還提供了一套更強大的 數據交換操作 ,包括了MapReducer中被忽視的" join "操作
使用Pig來操作hadoop處理海量數據,是非常簡單的,如果沒有Pig,我們就得手寫MapReduce代碼,這可是一件非常繁瑣的事,因為MapReduce的任務職責非常明確,清洗數據得一個job,處理得一個job,過濾得一個job,統計得一個job,排序得一個job,每次只要改動很小的一個地方,就得重新編譯整個job,然后打成jar提交到Hadoop集群上運行,是非常繁瑣的,調試還很困難。
但是,Pig並不適合處理所有的“數據處理”任務。和MapReducer一樣,它是為數據 批處理 而設計的,如果想執行的查詢只涉及一個大型數據集的一小部分數據,Pig的實現不是很好, 因為它要掃描整個數據集或其中的很大一部分。
二、Pig與Hive 誰才是未來?
2-1 背景
SQL
結構化查詢語言(SQL)是程序員的最佳伴侶,主要用於處理和提取數據。大數據改變了數據處理和可視化的方式。但是SQL嚴格的關系數據庫模式和聲明特性依然是數據分析的標桿。盡管SQL市場廣闊,但是大數據也對SQL的功能和性能提出了挑戰。
Pig
Apache Pig適合有SQL背景的程序員學習,其有以下兩個特點:
1.放寬了對數據存儲的要求
2.可以操作大型數據集
除了上述特點,它還有很好的可擴展性和性能優化。 Apache Pig允許開發人員跟蹤多個查詢方法,從而降低了數據的重復檢索。它支持復合數據類型(Map、Tuple、Bag),支持常見的數據操作,例如篩選、排序和Join。Apache Pig的這些特性得到了世界各地用戶的認可。
Hive
盡管Apache Pig性能優異,但是它要求程序員要掌握SQL之外的知識。Hive和SQL非常相似,雖然Hive查詢語言(HQL)有一定的局限性,但它仍然是非常好用的。Hive為MapReduce提供了很好的開源實現。它在分布式處理數據方面表現很好,不像SQL需要嚴格遵守模式。
數據的提取、處理和分析沒有一個萬全之策,需要綜合多種因素來選擇,例如數據存儲方法,編程語言結構以及預期的結果。下面我們就來對比一下Pig、Hive和SQL,看看它們各自都適合什么樣的場景。
2-2 Pig工作原理
Apache PIG提供一套高級語言平台,用於對結構化與非結構化數據集進行操作與分析。這種語言被稱為Pig Latin,其屬於一種腳本形式,可直接立足於PIG shell執行或者通過Pig Server進行觸發。用戶所創建的腳本會在初始階段由Pig Latin處理引擎進行語義有效性解析,而后被轉換為包含整體執行初始邏輯的定向非循環圖(簡稱DAG)。
另外,這套處理引擎亦可接受DAG並在內部執行計划優化——具體優化方式包括PIG程序方法以及惰性計算。
為了理解這一優化機制的原理,我們假定用戶編寫了一套腳本,該腳本對兩套數據集進行一項連接操作,而后是一條過濾標准。PIG優化器能夠驗證過濾操作是否能夠在連接之前進行,從而保證連接負載最小化。如果可以,則其將據此進行邏輯規划設計。如此一來,用戶即可專注於最終結果,而非將精力分散在性能保障身上。
只有在經過完全優化的邏輯規划准備就緒之后,編譯才會生效。其負責生成物理規划,即為最終駐留於HDFS中的數據分配與之交互的執行引擎。
2-3 Hive工作原理
Apache Hive在本質上屬於一套數據倉儲平台,用於同存儲在HDFS或者HBase內的大規模結構化數據集進行交互。Hive查詢語言在這一點上類似於SQL,二者都能夠與Hadoop實現良好集成。而Pig則不同,其執行流程為純聲明性,因此適合供數據科學家用於實現數據呈現與分析。
在與Hive進行交互時,用戶可以直接通過Hive命令行界面直接接入,或者與Hiveserver交互。任何提交查詢都會首先由該驅動程序占用,而后由編譯器進行語法及語義驗證。另外,Hive metastore負責保存全部與Hive相關數據的模式/映射關系,其在驗證查詢中信息語義方面扮演着重要角色。
該驅動立足於語義之上執行優化,同時負責准備執行規划並將其提交至HQL查詢引擎。這套引擎依賴於實際執行引擎(例如MapReduce與Spark等)。任何對模式的成功修改都會通過HQL處理引擎被更新至metastore當中。
2-4 總結
Hive更適合於數據倉庫的任務,Hive主要用於靜態的結構以及需要經常分析的工作。Hive與SQL相似促使 其成為Hadoop與其他BI工具結合的理想交集。而且很多企業都需要對歷史數據進行分析,Hive就是一款分析歷史數據的利器。但是Hive只有在結構化數據的情況下才能大顯神威。Hive的軟肋是實時分析,如果想要進行實時分析,可以采用HBase。
Pig賦予開發人員在大數據集領域更多的靈活性,並允許開發簡潔的腳本用於轉換數據流以便嵌入到較大的 應用程序。並且Apache Pig適用於非結構化的數據集,可以充分利用SQL。Pig無需構建MapReduce任務,如果你有SQL學習的背景,那么入門會非常快。
Pig相比Hive相對輕量,它主要的優勢是相比於直接使用Hadoop Java APIs可大幅削減代碼量。正因為如此,Pig仍然是吸引大量的軟件開發人員。
所以二者皆提供出色的靈活性以及可擴展性,用於實現各類定制化功能。另外,二者也擁有自己的明確角色定位,因此其具體優劣完全取決於您在項目當中的實際要求。