約10億のデータポイントを持つデータセットがあります。これから抽出したい約4600万の一意のデータポイントがあります。
Hadoopを使用して一意の値を抽出したいのですが、Hadoopで「メモリ不足」とJavaヒープサイズエラーが発生し続けます。同時に、Pythonセット(ハッシュテーブル)を使用して、これを1つのボックスでかなり簡単に実行できます。 、必要に応じて。)
私はこれらの一意の値を抽出するためにかなり単純なアルゴリズムを使用しています。マップ内の10億行を解析し、次のような行を出力しています。
UniqValueCount:I a
UniqValueCount:I a
UniqValueCount:I b
UniqValueCount:I c
UniqValueCount:I c
UniqValueCount:I d
次に、「aggregate」レデューサーを実行して結果を取得します。これは、上記のデータセットでは次のようになります。
I 4
これは小さな値のセットではうまく機能しますが、10億のデータポイント(前述のように4600万のキーがある)に対してこれを実行すると、ジョブは失敗します。
これをAmazonのElasticMapReduceで実行していますが、6つのm2.4xlargeノード(それぞれ最大メモリノードは68.4 GB)を使用しても、ジョブは「メモリ不足」エラーで失敗します。
しかし、1つのm1.large(8 GBのメモリを備えたはるかに小さいボックス)でSetデータ構造(ハッシュテーブル)を持つPythonコードを使用して、一意の値を抽出することができます。4,600万のユニークがそれほど多くのメモリを消費するべきではないため、Hadoopジョブが失敗することに混乱しています。
何がうまくいかない可能性がありますか?UniqValueCountを間違って使用していますか?