apache/hadoop · error · IOException
Undefined scheme for " + u
Error message
Undefined scheme for " + u
What it means
NNStorage.checkSchemeConsistency rejects storage URIs whose scheme is null: NameNode storage and journal locations must resolve to a concrete scheme (file, hdfs, qjm), and an entry that parses as a URI-without-scheme is rejected during NNStorage setup. The message echoes the offending URI so the bad config line can be found directly.
Source
Thrown at hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java:377
return sd;
}
}
} catch (IOException ioe) {
LOG.warn("Error converting file to URI", ioe);
}
return null;
}
/**
* Checks the consistency of a URI, in particular if the scheme
* is specified.
* @param u URI whose consistency is being checked.
*/
private static void checkSchemeConsistency(URI u) throws IOException {
String scheme = u.getScheme();
// the URI should have a proper scheme
if(scheme == null) {
throw new IOException("Undefined scheme for " + u);
}
}
/**
* Retrieve current directories of type IMAGE.
* @return Collection of URI representing image directories
* @throws IOException in case of URI processing error
*/
Collection<URI> getImageDirectories() throws IOException {
return getDirectories(NameNodeDirType.IMAGE);
}
/**
* Retrieve current directories of type EDITS.
* @return Collection of URI representing edits directories
* @throws IOException in case of URI processing error
*/
Collection<URI> getEditsDirectories() throws IOException {View on GitHub (pinned to 2add963021)
Solutions
- Copy the URI from the message into the config fix: give it an explicit scheme - file:///abs/path, hdfs://nn:8020/..., qjm://jns/jid.
- Run 'hdfs getconf -confKey dfs.namenode.edits.dir' and dfs.namenode.name.dir equivalents to see the post-substitution value the NN actually parses.
- For local paths, prefer absolute paths starting with '/' so normalization can add the file: scheme for you.
Example fix
// before - empty scheme from a bad substitution
<property>
<name>dfs.namenode.edits.dir</name>
<value>${eds.scheme}:///data/edits</value>
</property>
// after - explicit scheme
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///data/edits</value>
</property> Defensive patterns
Strategy: validation
Validate before calling
// Config lint before first NN start
for (String key : Arrays.asList("dfs.namenode.name.dir", "dfs.namenode.edits.dir",
"dfs.namenode.shared.edits.dir")) {
for (String loc : conf.getTrimmedStrings(key)) {
if (loc == null || loc.isEmpty()) continue;
URI u;
try { u = URI.create(loc); } catch (IllegalArgumentException ex) { u = null; }
boolean ok = u != null && u.getScheme() != null;
if (!ok && !loc.startsWith("/")) {
throw new IllegalArgumentException(key + " entry lacks a scheme and is not an absolute path: " + loc);
}
}
} Type guard
static boolean hasScheme(String location) {
if (location == null || location.isEmpty()) return false;
try {
return URI.create(location).getScheme() != null;
} catch (IllegalArgumentException e) {
return false;
}
} Try / catch
try {
URI u = resolveStorageUri(dir);
NNStorage.checkSchemeConsistency(u);
} catch (IOException e) {
if (e.getMessage() != null && e.getMessage().startsWith("Undefined scheme for")) {
throw new ConfigurationException("Storage URI needs an explicit scheme (file:///, hdfs://, qjm://): " + e.getMessage(), e);
}
throw e;
} Prevention
- Always write storage dirs with explicit schemes in production configs.
- Lint hdfs-site.xml for empty-scheme values (':///' patterns) in CI.
- Prefer absolute '/' paths for local dirs so Hadoop can normalize them to file: itself.
When it happens
Trigger: A dfs.namenode.edits.dir (or name.dir) entry like ':///data/edits' with an empty scheme, or programmatic construction that passes an already-built URI with null scheme into the NN storage setup (e.g. URI.create on a host-only or malformed string).
Common situations: Hand-edited hdfs-site.xml with a stray colon; XML variable substitution resolving to an empty value or scheme-only string; custom tooling building StorageDirectory URIs without normalization.
Related errors
- Incompatible node types: storageType={storageType} but Stora
- cluster Id is incompatible with others.
- namespaceID is incompatible with others.
- BlockPoolSliceStorage.recoverTransitionRead: attempt to load
- URI: {} is not in the expected format
AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22).
Data as JSON: /api/errors/8b4e6c1052dd2ee9.
Report an issue: GitHub.