CRITICAL FIX for Parquet 78-byte EOF error!
Root Cause Analysis:
- Hadoop's FSDataOutputStream tracks position with an internal counter
- It does NOT call SeaweedOutputStream.getPos() by default
- When Parquet writes data and calls getPos() to record column chunk offsets,
it gets FSDataOutputStream's counter, not SeaweedOutputStream's actual position
- This creates a 78-byte mismatch between recorded offsets and actual file size
- Result: EOFException when reading (tries to read beyond file end)
The Fix:
- Override getPos() in the anonymous FSDataOutputStream subclass
- Delegate to SeaweedOutputStream.getPos() which returns 'position + buffer.position()'
- This ensures Parquet gets the correct position when recording metadata
- Column chunk offsets in footer will now match actual data positions
This should fix the consistent 78-byte discrepancy we've been seeing across
all Parquet file writes (regardless of file size: 684, 693, 1275 bytes, etc.)
Added comprehensive logging to identify why Parquet files fail with
'EOFException: Still have: 78 bytes left'.
Key additions:
1. SeaweedHadoopOutputStream constructor logging with 🔧 marker
- Shows when output streams are created
- Logs path, position, bufferSize, replication
2. totalBytesWritten counter in SeaweedOutputStream
- Tracks cumulative bytes written via write() calls
- Helps identify if Parquet wrote 762 bytes but only 684 reached chunks
3. Enhanced close() logging with 🔒 and ✅ markers
- Shows totalBytesWritten vs position vs buffer.position()
- If totalBytesWritten=762 but position=684, write submission failed
- If buffer.position()=78 at close, buffer wasn't flushed
Expected scenarios in next run:
A) Stream never created → No 🔧 log for .parquet files
B) Write failed → totalBytesWritten=762 but position=684
C) Buffer not flushed → buffer.position()=78 at close
D) All correct → totalBytesWritten=position=684, but Parquet expects 762
This will pinpoint whether the issue is in:
- Stream creation/lifecycle
- Write submission
- Buffer flushing
- Or Parquet's internal state