Hadoop を使用して、生ログから例外をフェッチして解析したいと考えています。一部の例外 (複数の行にまたがる) が 2 つの異なる分割、つまり 2 つの異なるマッパーの一部になるという問題が発生します。
この問題を回避するアイデアがあります。メソッドをオーバーライドしgetSplits()
て、すべての分割に少し冗長なデータを持たせることができます。このソリューションは、私にとってはコストが高すぎると思います。
では、この問題に対するより良い解決策はありますか?
すべての解決策をありがとう。私にとっては便利だと思います
特に上記のコメントに注意してください
「レコードが 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 が分割境界を越えて読み取る冗長データのサイズを意味します。