1

次の使用例:

.gz 圧縮で約 500GB のサイズのデータ​​に対してハイブ クエリを実行します。

select count(distinct c1), c2 from t1 group by c2;

このクエリの結果、最大 2800 のマップ ジョブと最大 400 のリデュース ジョブが生成されます。

160GB のインスタンス ストレージごとに 20 個のインスタンスを持つ Hadoop クラスターをセットアップすると、ジョブはマップ 97% で停止し、進行状況が 21% 減少し、マップ 94% で進行状況が 19% 減少し、その後はまったく進行しなくなります。これは、HDFS のディスク容量が使用限界に達しているためだと思います。その日のうちに例外メッセージを提供できるかもしれません。

しかし、処理されているデータの入力サイズに応じて、必要な HDFS ディスク容量を事前に大まかに計算する方法はありますか? 入力データは .gz 形式で保存されることに注意してください。

アップデート

MapReduce ジョブがノードのローカル ストレージのみを使用し、DFS を使用しない理由を知っている人はいますか?

DFS 使用の概要 http://img27.imageshack.us/img27/5805/dfsusageoverview.png

DFS 使用の詳細 http://img542.imageshack.us/img542/5026/dfsusagedetail.png

マッパーの 1 人からの例外:

at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:550)
        at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:143)
        ... 8 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.io.IOException: Spill failed
        at org.apache.hadoop.hive.ql.exec.ReduceSinkOperator.processOp(ReduceSinkOperator.java:304)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.forward(GroupByOperator.java:959)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.flush(GroupByOperator.java:926)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.processHashAggr(GroupByOperator.java:779)
        at org.apache.hadoop.hive.ql.exec.GroupByOperator.processOp(GroupByOperator.java:722)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:84)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:83)
        at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:533)
        ... 9 more
Caused by: java.io.IOException: Spill failed
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1045)
        at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:599)
        at org.apache.hadoop.hive.ql.exec.ReduceSinkOperator.processOp(ReduceSinkOperator.java:289)
        ... 24 more

Caused by: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for output/s
pill15.out
        at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127)
        at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:121)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1408)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$1800(MapTask.java:869)
        at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1360)
4

1 に答える 1

3

以下は、Cloudera ブログからのメモです。

各ファイルのデフォルトのレプリケーション係数は 3 で、中間シャッフル ファイル用に約 25% のディスク領域を残す必要があります。したがって、HDFS に保存するデータの生のサイズの 4 倍が必要です。ただし、ファイルが非圧縮で保存されることはめったになく、ファイルの内容と圧縮アルゴリズムに応じて、HDFS に保存されたテキスト ファイルの平均圧縮率は最大 10 ~ 20 です。したがって、実際に必要な raw ディスク容量は、圧縮されていない元のサイズの約 30 ~ 50% にすぎません。

私が何かを追加する可能性がある場合、スペースが実際に制限されている場合は、中間出力 (マッパーとリデューサーの間) を圧縮して中間シャッフル ファイルを削減することを検討する必要があります。たとえば、Gzip 圧縮を使用して、次の方法でこれを行うことができます。

conf.set(“mapred.compress.map.output”, “true”)
conf.set(“mapred.output.compression.type”, “BLOCK”);
conf.set(“mapred.map.output.compression.codec”, “org.apache.hadoop.io.compress.GzipCodec”);
于 2013-01-16T15:06:03.190 に答える