豚にJOINの代わりにCOGROUPを使用すると、利点はありますか?PIGのCOGROUPに参加する
http://developer.yahoo.com/hadoop/tutorial/module6.htmlは出力の種類の違いについて話しています。しかし、 "出力スキーマ"を無視すると、パフォーマンスに大きな違いはありますか?
豚にJOINの代わりにCOGROUPを使用すると、利点はありますか?PIGのCOGROUPに参加する
http://developer.yahoo.com/hadoop/tutorial/module6.htmlは出力の種類の違いについて話しています。しかし、 "出力スキーマ"を無視すると、パフォーマンスに大きな違いはありますか?
パフォーマンスに大きな違いはありません。私がこれを言うのは、同じデータをレデューサーに送る単一のMapReduceジョブであるということです。両方とも、キーが外部キーである状態ですべてのレコードを転送する必要があります。まったくの場合、COGROUP
は少し速くなるかもしれません。なぜなら、それはヒットを越えてデカルト製品を行わず、それらを別々の袋に入れておくからです。
データセットの1つが小さい場合は、"replicated join"というジョインオプションを使用できます。これにより、2番目のデータセットがすべてのマップタスクに分散され、メインメモリにロードされます。この方法では、マッパーで結合全体を行うことができ、減速器は必要ありません。私の経験では、これは非常に価値があります。なぜなら、結合とコグループのボトルネックは、データセット全体をレジューサーに入れ替えることだからです。私の知る限りCOGROUP
でこれを行うことはできません。
内部的には、joinとcogroupはPigと同じです(ジョインではデカルト結合はありません)。使用したキーワードによって最終結果の形式のみが変わります。結合の結果を「記述」すると、EXPLAIN計画にCOGROUP演算子が表示されます。 – SquareCog
私がデカルト積を意味するのは、外部キーに複数の一致がある場合、より多くのレコードが得られるということです。たとえば、1つのデータセットに3つの "abcde"があり、2つ目のデータセットに4つの "abcde"がある場合、各レコードに一致する12 xレコードが出力されます。一方、COGROUPでは、関係を別々に保ちます。 –