2013-03-31 30 views
3

我有一個豬腳本,運行一個非常耗時的UDF。豬似乎將UDF設置爲作爲地圖作業運行而不是減少作業。結果,創建一個次優的少量映射器來運行這項工作。我知道我可以使用setDefaultParallel以及PigLatin中的PARALELL x命令設置用於豬的縮減器的默認數量,以設置給定生產線的縮減器的數量。但是,我如何設置mappers的數量呢?通過定義我自己的InputSplit大小,我已經看到有關增加映射器數量的文章,但我想明確地將映射器的數量設置爲主機數量*內核數量,文件大小與它無關。豬:強制UDF發生在減速器或設定的映射器數量

如果我無法控制mappers的數量,是否有強迫我的UDF作爲reducer出現,因爲我可以控制這些?

回答

4
  1. 沒有,你可以不指定映射器的數量明確,只是因爲Hadoop的不工作的方式。創建的映射器的數量大致爲total input size/input split size,但如果您有大量小文件(由於HDFS的工作原理而不鼓勵使用),則映射器可能會偏斜。所以基本上,Pig不會讓你這樣做,因爲Hadoop根據定義沒有這個選項。
  2. 不可以。也因爲「它不以那種方式工作」。豬編譯&爲你優化事情,輸出是一個MR工作流。當下一個版本的豬出現時,任何用於強制UDF進入減速器的竅門都可以輕鬆改變。如果你覺得你真的需要在Reducer中使用UDF,你可以創建一個自定義MR作業jar,在其中實現一個drop-through mapper,然後在reducer中完成你的工作。你可以用MAPREDUCE指令從豬身上調用。但是,解決方案聽起來不對,您可能會誤解某些內容。你可以看看是什麼迫使豬減少得到大的想法 - 一個DISTINCT,LIMITORDER將永遠這樣做,GROUP通常也會做。 A JOIN通常會同時得到一個映射器和一個reducer。正如你所看到的,強制減少的操作是利用Hadoop某些固有特性的操作(例如ORDER處於減少狀態,因爲reducer輸入被排序)。沒有簡單的方法可以偷偷在那裏使用UDF,因爲沒有UDF類型(eval,filter,load,store)可以輕鬆地與reducer一起使用。
+0

啊,那太臭了......哦,謝謝。 – Manny

0

您可以通過使用「mapred.max.split.size」來產生更多數量的映射器。分割適用於某些輸入格式和壓縮格式。例如,GZ輸入不可拆分。 Pig允許將較小的輸入文件組合在一起。下面是如何combine small files

0

由於目前豬版的,這一招總是對我的作品,在嵌套FOREACH的生成使用DISTINCT,LIMIT後,訂單始終運行作爲還原劑, 用於例如,

A = FOREACH (GROUP DATA BY some_unique_field/all fields){ 
    LIMIT DATA.field 1; 
    GENERATE udf.func(fields); 
} 

這些也會刪除數據中的所有重複行。

相關問題