面向Hadoop框架的高級語言: Apache Pig
Apache Pig是用來處理大規模數據的高級查詢語言,配合 Hadoop使用,可以在處理海量數據時達到事半功倍的效果,比使用Java,C++等語言編寫大規模數據處理程序的難度要小N倍,實現同樣的效果的代碼 量也小N倍。Apache Pig為大數據集的處理提供了更高層次的抽象,為mapreduce算法(框架)實現了一套類SQL的數據處理腳本語言的shell腳本,在Pig中稱之 為Pig Latin,在這套腳本中我們可以對加載出來的數據進行排序、過濾、求和、分組(group by)、關聯(Joining),Pig也可以由用戶自定義一些函數對數據集進行操作,也就是傳說中的UDF(user-defined functions)。
Pig有兩種運行模式:Loca模式和MapReduce模式。當Pig在Local模式下運行時,Pig只訪問本地一臺主機;當Pig在 MapReduce模式下運行時,它將訪問一個Hadoop集群和HDFS的安裝位置。這時,Pig將自動地對這個集群進行分配和回收。因為Pig系統可 以自動對MapReduce程序進行優化,所以當用戶使用Pig Latin語言進行編程的時候,不必關心程序運行的效率,Pig系統將會自動對程序進行優化,這樣可以大了節省編程時間。Pig的Local模式和 MapReduce模式都有三種運行方式,分別為:Grunt Shell方式、腳本文件方式和嵌入式程序方式。
Pig是一種編程語言,它簡化了Hadoop常見的工作任務。Pig可加載數據、表達轉換數據以及存儲最終結果。Pig內置的操作使得半結構化數據變得有意義(如日志文件)。同時Pig可擴展使用Java中添加的自定義數據類型并支持數據轉換。
Pig在數據類型上的設計理念總結為一句口號:pig吃任何東西,輸入數據可以支持任何格式,pig天生支持那些流行的格式,如制表符分隔的文本文件,用戶也可以增加函數支持其他的數據格式文件,pig不需要元數據或者數據的schma,但如果有也可以利用。
Apache Pig基本架構
Pig的實現5個主要部分構成:
- Pig自己實現的一套框架對輸入、輸出的人機交互部分的實現,就是Pig Latin 。
- Zebra是Pig與HDFS/Hadoop的中間層、Zebra是MapReduce作業編寫的客戶端,Zerbra用結構化的語言實現了對 hadoop物理存儲元數據的管理也是對Hadoop的數據抽象層,Zebra中有2個核心的類 TableStore(寫)/TableLoad(讀)對Hadoop上的數據進行操作。
- Pig中的Streaming主要分為4個組件: 1. Pig Latin 2. 邏輯層(Logical Layer) 3. 物理層(Physical Layer) 4. Streaming具體實現(Implementation),Streaming會創建一個Map/Reduce作業,并把它發送給合適的集群,同時監 視這個作業的在集群環境中的整個執行過程。
- MapReduce在每臺機器上進行分布式計算的框架(算法)。
- HDFS最終存儲數據的部分。
與Hive對比
- Language:在Hive中可以執行 “插入/刪除”等操作,但是Pig中我沒有發現有可以“插入”數據的方法。
- Schemas:Hive中至少還有一個“表”的概念,但是Pig中我認為是基本沒有表的概念,所謂的表建立在Pig Latin腳本中,對與Pig更不要提metadata了。
- Partitions:Pig中沒有表的概念,所以說到分區對于Pig來說基本免談,如果跟Hive說“分區”(Partition)他還是能明白的。
- Server:Hive可以依托于Thrift啟動一個服務器,提供遠程調用。Pig沒有發現有這樣的功能。
- Shell:在Pig 你可以執行一些個 ls 、cat 這樣很經典、很cool的命令,但是在使用Hive的時候我壓根就沒有想過有這樣的需求。
- Web Interface:Hive有,Pig無
- JDBC/ODBC:Pig無,Hive有
Pig的應用場景
- 數據查詢只面向相關技術人員
- 即時性的數據處理需求,這樣可以通過pig很快寫一個腳本開始運行處理,而不需要創建表等相關的事先準備工作。
Pig包括:
- Pig Latin, 類SQL數據處理語言
- 在Hadoop上運行的Pig Latin執行引擎,將pig腳本轉換為map-reduce程序在hadoop集群運行
Pig的優點:
- 編碼簡單
- 對常見的操作充分優化
- 可擴展。自定義UDF
Pig主要用戶
- Yahoo!: 90%以上的MapReduce作業是Pig生成的
- 推ter: 80%以上的MapReduce作業是Pig生成的
- Linkedin: 大部分的MapReduce作業是Pig生成的
- 其他主要用戶: Salesforce, Nokia, AOL, comScore
Pig的主要開發者
- Hortonworks
- 推ter
- Yahoo!
- Cloudera
Pig工具
- Piggybank(Pig官方函數庫)
- Elephant bird: 推ter的Pig函數庫
- DataFu: Linkedin的Pig函數庫
- Ambros: 推ter的Pig作業監控系統
- Mortardata: 基于云的Pig集群管理系統
Pig定位
Pig Latin語言和傳統的數據庫語言很相似,但是Pig Latin更側重于數據查詢。而不是對數據進行修改和刪除等操作。pig語句通常按照如下的格式來編寫。
- 通過LOAD語句從文件系統讀取數據
- 通過一系列”轉換”語句對數據進行處理
- 通過一條STORE語句把處理結果輸出到文件系統中,或者使用DUMP語句把處理結果輸出到屏幕上。
LOAD和STORE語句有嚴格的語法規定。關鍵是靈活使用轉換語句對數據進行處理。
Pig Latin的特性:
- 易于編程。實現簡單的和高度并行的數據分析任務非常容易。
- 自動優化。任務編碼的方式允許系統自動去優化執行過程,從而使用戶能夠專注于邏輯,而非效率。
- 可擴展性,用戶可以輕松編寫自己的函數用于特殊用途的處理。
Pig Latin 程序有一系列的 operation 和 transformation 組成。每個操作或變換對輸入進行數據處理,然后產生輸出結果。這些操作整體上描述了一個數據流。Pig 內部,這些變換操作被轉換成一系列的 MapReduce 作業。Pig 不適合所有的數據處理任務,和 MapReduce 一樣,它是為數據批處理而設計的。如果只想查詢大數據集中的一小部分數據,Pig 的實現不會很好,因為它要掃描整個數據集或絕大部分。
參考資料
- Pig網址:http://pig.apache.org