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

  1. Read the chained cause: verify the file at the reported path exists and is readable by the Presto user
  2. 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
  3. Fix HDFS permissions/quota or cluster connectivity problems
  4. 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

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


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/8a4d2c70dbd9ef31. Report an issue: GitHub.