Pig效能優化

2021-06-18 07:11:20 字數 2280 閱讀 1945

mapreduce job的很大一部分開銷在於磁碟io和資料的網路傳輸,如果能盡早的去除無用的資料,減少資料量,會提公升pig的效能。

使用filter可以去除資料中無用的行(record),盡早的filter掉無用的資料,可以減少資料量,提公升pig效能。

使用foreach generate可以去除資料中無用的列(column),減少資料量,提公升pig效能。

combiner可以對map的結果進行combine,減少shuffle的資料量。

在pig中實現udf時,應該盡可能地實現algebraic介面(實現algebraic介面的function可以對中間結果執行多次而不影響最終結 果,比如count, sum等都是algebraic function),這樣的udf就可能進行combine,條件如下:

如果在group之後的foreach語句中,所有投影都是針對分組(group)的列的表示式,或者是algebraic udf的表示式時,就可以使用combiner(表示式包括sum,count,distinct或者其他數學表示式等)。

當進行join時,最後乙個表不會放入記憶體,而是以stream的方式進行處理,所以最好把最大的乙個表放置到join語句的最後。

pig實現了以下三種定製的join以進一步優化。

當進行join的乙個表比較大,而其他的表都很小(能夠放入記憶體)時,replicated join會非常高效。

replicated join會把所有的小表放置在記憶體當中,然後在map中讀取大表中的資料記錄,和記憶體中儲存的小表的資料進行join,得到join結果,無需reduce。

可以在join時使用 using 'replicated'語句來觸發replicated join,大表放置在最左端,其餘小表(可以有多個)放置在右端。

當進行join的兩個表中,乙個表資料記錄針對key的分布極其不均衡的時候,簡單的使用hash來分配reduce端的key時,可能導致某些reducer上的資料量特別大,降低整個集群的效能。

skewed join可以首先對左邊的表的key統計其分布,然後決定reduce端的key的分布,盡量使得reduce端的資料分布比較均衡。

可以在join時使用using 'skewed'語句來觸發skewed join,需要進行統計的表(亦即key可能分布不均衡的表)放置在左端。

當進行join的兩個表都已經是有序的時,可以使用merge join。

join時,首先對右端的表進行一次取樣,對取樣的資料建立索引,記錄(key, 檔名, 偏移[offset])。然後進行map,讀取join左邊的表,對於每一條資料記錄,根據前一步計算好的索引來查詢資料,進行join。

可以在join時使用using 'merge'語句來觸發merge join,需要建立索引的表放置在右端。

另外,在進行join之前,首先過濾掉key為null的資料記錄可以減少join的資料量。

通過壓縮map/reduce之間的資料,以及job之間需要傳輸的資料,可以顯著的減少需要儲存在硬碟上的和需要傳輸的資料,提公升pig的效能。

通過設定mapred.compress.map.output = true可以對map的結果進行壓縮,壓縮的方法可以通過下面的語句來進行設 置:mapred.map.output.compression.codec = org.apache.hadoop.io.compress.gzipcodec / com.hadoop.compression.lzo.lzopcodec。

gzip的壓縮效率比較高,但是比較消耗cpu,所以通常情況下可以使用lzo來進行壓縮。

通過設定pig.tmpfilecompression = true可以對job之間的資料進行壓縮,壓縮的方法可以通過pig.tmpfilecompres sion.codec = org.apache.hadoop.io.compress.gzipcodec / com.hadoop.compression.lzo.lzopcodec來進行設定。

可以通過parallel = n 來設定reduce的併發數(map的併發數不可以設定),可以啟動reduce的操作包括:

cogroup, cross, distinct, group, join (inner), join (outer), 和 order by。

需要注意的是,parallel並不是越大越好,這需要根據集群的配置來確定,比較合理的parallel數 = 集群節點數*mapred.tasktracker.reduce.tasks.maximum。後者預設為2。

參考文獻:

[1] pig performance and efficency

[2] alan gates. programming pig.

[3] pig cookbook.

Pig優化之路之巧用Macro

部署好了hadoop集群後,安裝完畢hive,pig.後乙個大資料的美好入口就建立了。我們可以用hive來做基於結構化 的資料分析,用pig來做資料清洗,資料探勘等工作。特別在實踐中,感覺pig很不錯,沒有hive的嬌貴,又比粗糙的mapreduce來的精巧,很稱手。新年正好涉及以前的程式調整,藉此...

Pig對於資料傾斜Join的優化原理

pig對於資料傾斜join的優化原理 1 對資料抽樣 2 根據樣本資料,估計出某個key的所有的記錄數以及所佔的總記憶體,pig.skewedjoin.reduce.memusage 控制reduce消耗記憶體比例,再計算出某個key所需要的reduce個數,以及reduce的總數。3 將結果存乙個...

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...