4

Hadoop を使用して、生ログから例外をフェッチして解析したいと考えています。一部の例外 (複数の行にまたがる) が 2 つの異なる分割、つまり 2 つの異なるマッパーの一部になるという問題が発生します。

この問題を回避するアイデアがあります。メソッドをオーバーライドしgetSplits()て、すべての分割に少し冗長なデータを持たせることができます。このソリューションは、私にとってはコストが高すぎると思います。

では、この問題に対するより良い解決策はありますか?

4

3 に答える 3

0

すべての解決策をありがとう。私にとっては便利だと思います

特に上記のコメントに注意してください

「レコードが InputSplit 境界にまたがる場合、レコード リーダーがこれを処理するので、これについて心配する必要はありません。」

次に、LineRecordReader がデータ フォームの分割を読み取る方法について、ソース コードを調べます。次に、実際には、LineRecordReader には InputSplit 境界にまたがるレコードを読み取るためのロジックが既にあることがわかりました。これにより、ブロックのサイズ制限により、分割の下部にある行レコードが常に 2 つの異なる分割に分割されます。だから私がする必要があるのは、LineRecordReaderが分割境界にまたがるデータサイズを追加することだと思います。

今私の解決策は次のとおりです。LineRecordReader のメソッド「nextKeyValue()」をオーバーライドします。

public boolean nextKeyValue() throws IOException {
if (key == null) {
  key = new LongWritable();
}
key.set(pos);
if (value == null) {
  value = new Text();
}
int newSize = 0;
while (pos < end) {
  newSize = in.readLine(value, maxLineLength,
                        Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
                                 maxLineLength));

行「while (pos < end)」を「while (pos < end + {param})」に変更</p>

{param} は、readRecorder が分割境界を越えて読み取る冗長データのサイズを意味します。

于 2013-11-14T03:24:54.380 に答える