prestodb/presto · critical · PrestoException

NATIVE_EXECUTION_BINARY_NOT_EXIST

NATIVE_EXECUTION_BINARY_NOT_EXIST

Error message

File doesn't exist %s

What it means

NativeExecutionProcess.resolveProcessWorkingPath() resolves a configured process path to an absolute path (relative paths are resolved against the process working directory). If the resolved file does not exist, it logs and throws PrestoException NATIVE_EXECUTION_BINARY_NOT_EXIST so native process startup fails fast with a clear message instead of an obscure exec failure.

Source

Thrown at presto-spark-base/src/main/java/com/facebook/presto/spark/execution/nativeprocess/NativeExecutionProcess.java:114

                workerConfigFile(configBasePath),
                workerNodeConfigFile(configBasePath),
                workerCatalogDir(configBasePath));
    }

    @Override
    protected String resolveProcessWorkingPath(String path)
    {
        File absolutePath = new File(path);
        // In the case of SparkEnv is not initialed (e.g. unit test), we just use current location instead of calling SparkFiles.getRootDirectory() to avoid error.
        String rootDirectory = SparkEnv$.MODULE$.get() != null ? SparkFiles.getRootDirectory() : ".";
        File workingDir = new File(rootDirectory);
        if (!absolutePath.isAbsolute()) {
            absolutePath = new File(workingDir, path);
        }

        if (!absolutePath.exists()) {
            log.error(format("File doesn't exist %s", absolutePath.getAbsolutePath()));
            throw new PrestoException(NATIVE_EXECUTION_BINARY_NOT_EXIST, format("File doesn't exist %s", absolutePath.getAbsolutePath()));
        }

        return absolutePath.getAbsolutePath();
    }

    protected void updateWorkerProperties()
    {
        // Update memory properties
        updateWorkerMemoryProperties();

        // The reason we have to pick and assign the port per worker is in our prod environment,
        // there is no port isolation among all the containers running on the same host, so we have
        // to pick unique port per worker to avoid port collision. This config will be passed down to
        // the native execution process eventually for process initialization.
        workerProperty.getSystemConfig()
                .update(NativeExecutionSystemConfig.HTTP_SERVER_HTTP_PORT, String.valueOf(getPort()));

        // Update the temp storage configs for spilling and broadcast join.

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Verify the path printed in the error message exists on the node and fix the configuration value
  2. Distribute the native binary via spark.files / spark.archives so it lands in SparkFiles.getRootDirectory()
  3. Make the configured path absolute if you intend it to bypass the working-dir resolution
  4. Check node-local cleanup policies are not deleting the native binary directory

Example fix

// before
--native-binary=presto_native  # relative, not present in working dir
// after
--native-binary=/opt/presto/bin/presto_native  # absolute, verified to exist
Defensive patterns

Strategy: validation

Validate before calling

File binary = new File(nativeBinaryPath);
if (!binary.isAbsolute()) binary = new File(workingDir, nativeBinaryPath);
if (!binary.exists()) {
    throw new IllegalStateException("Native binary missing: " + binary.getAbsolutePath());
}

Try / catch

try {
    processFactory.createNativeExecutionProcess(...);
} catch (PrestoException e) {
    if (e.getErrorCode().getName().equals("NATIVE_EXECUTION_BINARY_NOT_EXIST")) {
        // fix path config or re-distribute binary
    }
}

Prevention

When it happens

Trigger: A native binary/resource path passed to NativeExecutionProcess (e.g., the native worker binary path) resolves via resolveProcessWorkingPath to a File whose exists() is false — thrown at NativeExecutionProcess.java:114.

Common situations: Wrong native.binary-path config value, binary not shipped/spark-added to the working directory on this node, typo in path, binary deleted by cleanup between jobs, or running outside Spark where SparkFiles root differs from expectation.

Related errors


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