prestodb/presto · error · PrestoException
HUDI_CANNOT_OPEN_SPLIT
HUDI_CANNOT_OPEN_SPLIT
Error message
Error opening Hudi split ${path} (offset=${start}, length=${length}): ${e.getMessage()} What it means
The Parquet page source could not be opened for a Hudi split. If the failure is not already a PrestoException, createParquetPageSource wraps it in HUDI_CANNOT_OPEN_SPLIT with the file path, split offset, and length so the exact file and byte range are identified.
Source
Thrown at presto-hudi/src/main/java/com/facebook/presto/hudi/HudiParquetPageSources.java:205
internalFields.add(constructField(prestoType, messageColumnIO.getChild(parquetField.getName())));
}
}
return new ParquetPageSource(parquetReader, prestoTypes.build(), internalFields.build(), namesBuilder.build(), new RuntimeStats());
}
catch (Exception e) {
try {
if (dataSource != null) {
dataSource.close();
}
}
catch (IOException ignored) {
}
if (e instanceof PrestoException) {
throw (PrestoException) e;
}
String message = format("Error opening Hudi split %s (offset=%s, length=%s): %s", path, start, length, e.getMessage());
throw new PrestoException(HUDI_CANNOT_OPEN_SPLIT, message, e);
}
}
private static TupleDomain<ColumnDescriptor> getParquetTupleDomain(Map<List<String>, RichColumnDescriptor> descriptorsByPath, TupleDomain<HudiColumnHandle> effectivePredicate)
{
if (effectivePredicate.isNone()) {
return TupleDomain.none();
}
ImmutableMap.Builder<ColumnDescriptor, Domain> predicate = ImmutableMap.builder();
effectivePredicate.getDomains().get().forEach((columnHandle, domain) -> {
String baseType = columnHandle.getHiveType().getTypeSignature().getBase();
// skip looking up predicates for complex types as Parquet only stores stats for primitives
if (!baseType.equals(StandardTypes.MAP) && !baseType.equals(StandardTypes.ARRAY) && !baseType.equals(StandardTypes.ROW)) {
RichColumnDescriptor descriptor = descriptorsByPath.get(ImmutableList.of(columnHandle.getName()));
if (descriptor != null) {
predicate.put(descriptor, domain);
}View on GitHub (pinned to 55bb57d202)
Solutions
- Read the chained cause: verify the file at the reported path exists and is readable by the Presto user
- If the file was deleted by cleaning/compaction, rewind to a consistent snapshot or re-trigger the query; align Hudi clean retention with query duration
- Fix HDFS permissions/quota or cluster connectivity problems
- Validate the Parquet file (footer readable, not truncated); restore or rewrite corrupted files from a good commit
Example fix
// ensure clean retention covers long queries (Hudi writer config) // before hoodie.cleaner.commits.retained=10 // after hoodie.cleaner.commits.retained=100
Defensive patterns
Strategy: retry
Validate before calling
// Pre-flight: ensure the split's file exists and is readable before opening
Path path = split.getPath();
FileSystem fs = path.getFileSystem(conf);
if (!fs.exists(path)) {
throw new IllegalStateException("File for split missing: " + path);
}
if (!fs.open(path).getPos() >= 0) { /* readable */ } Try / catch
try {
return parquetPageSource(split);
} catch (PrestoException e) {
if (isHudiErrorCode(e, "HUDI_CANNOT_OPEN_SPLIT") && isTransient(e.getCause())) {
return withRetry(3, backoff(), () -> parquetPageSource(split));
}
throw e;
} Prevention
- Set Hudi cleaner retention well above max query duration
- Grant the Presto service user read access to table data paths
- Monitor HDFS for under-replicated/missing files the scheduler may reference
- Validate file integrity after failed/aborted writer commits
When it happens
Trigger: IOException/RuntimeException while opening a Parquet base file for a split: file not found (missing or cleaned file), HDFS read failure, permission denied, or a corrupt/short Parquet footer.
Common situations: Hudi cleaning/compaction deleted a file still referenced by an old split, missing HDFS permissions for the Presto user, NameNode/network problems, truncated files from failed writes.
Related errors
- HUDI_CANNOT_OPEN_SPLIT
- UncheckedIOException
- PARQUET_IO_READ_ERROR
- PARQUET_IO_READ_ERROR
- HIVE_FILESYSTEM_ERROR
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/8a4d2c70dbd9ef31.
Report an issue: GitHub.