0

5 億行と 58 の変数を持つ大規模なデータセットがあります。他の 58 変数を使用して計算される 59 番目の変数の 1 つを使用して、データセットを並べ替える必要があります。変数はたまたま小数点以下 4 桁の浮動小数点数です。

次の 2 つの方法があります。

  1. 通常のマージソート
  2. 59 番目の変数を計算しているときに、特定の範囲の変数を特定のノードに送信し始めます。これらのノードの範囲をソートし、データを完全にソートしたらレデューサーでそれらを結合します。これで、どのデータセットをマージする場所もわかりました。基本的には追記になります。

どちらがより良いアプローチで、その理由は何ですか?

4

2 に答える 2

0

すべての行に対して二次的な並べ替えを行わずに、合計の並べ替え順序を探していると仮定します。通常、時間と空間の間にはトレードオフがあり、Hadoop では、時間に対して最適化された製品 (TeraData Hadoop で使用するためにデータベースをメモリに配置する機能があります)

あなたが言及した 2 つの可能なアプローチのうち、Hadoop インフラストラクチャ内で機能するのは 1 つだけだと思います。数値 2、Hadoop は1 つのジョブを実行するために多くのノードを活用するため、並べ替えの実装は少し難しくなります。また、分散並べ替えはプログラミング モデルの中心であるため、通常、MR の「シャッフルと並べ替え」フェーズで並べ替えを処理する必要があります。 .

59番目の変数が生成された時点で、その変数の分布をサンプリングして、フレームワークを介して送信し、前述のようにマージできるようにする必要があります。x の変数分布に値の 80% が含まれている場合を考えてみましょう。これにより、データの 80% が、ほとんどの作業を行う 1 つのレデューサーに送信される可能性があります。もちろん、これは、いくつかのキーがソートおよびシャッフル フェーズでグループ化されることを前提としています。キー配布をサンプリングして負荷を均等に分散するようにパーティショナーを設定するのは、プログラマ次第です。

一方、メモリ内でソートする場合は、reduce 中に同じことを達成できますが、ソートは現在ソートを実行しているノードで使用可能なメモリの量と同程度であり、すぐに消滅するため、固有のスケーラビリティの問題があります。メモリに収まらなかった残りのデータを探すために HDFS を使用し始めるとき。また、サンプリングの問題を無視した場合、すべてのキーと値のペアが均等に分散され、データ内のメモリ容量を理解していない限り、メモリが不足する可能性があります。

于 2013-06-04T21:34:56.533 に答える