apache/hadoop · error · IOException

There is no primary group for UGI " + this

Error message

There is no primary group for UGI " + this

What it means

getPrimaryGroupName returns the first entry of the user's resolved group set; if group resolution returned an empty set (mapping returned nothing - not that the user genuinely belongs to zero groups), it throws IOException('There is no primary group for UGI ...'). POSIX users always have a primary group, so empty means resolution failed upstream.

Source

Thrown at hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/UserGroupInformation.java:1657

      groups = new TestingGroups(groups);
    }
    // add the user groups
    ((TestingGroups) groups).setUserGroups(ugi.getShortUserName(), userGroups);
    return ugi;
  }
  
  /**
   * Get the user's login name.
   * @return the user's name up to the first '/' or '@'.
   */
  public String getShortUserName() {
    return user.getShortName();
  }

  public String getPrimaryGroupName() throws IOException {
    Set<String> groupsSet = getGroupsSet();
    if (groupsSet.isEmpty()) {
      throw new IOException("There is no primary group for UGI " + this);
    }
    return groupsSet.iterator().next();
  }

  /**
   * Get the user's full principal name.
   * @return the user's full principal name.
   */
  @InterfaceAudience.Public
  @InterfaceStability.Evolving
  public String getUserName() {
    return user.getName();
  }

  /**
   * Add a TokenIdentifier to this UGI. The TokenIdentifier has typically been
   * authenticated by the RPC layer as belonging to the user represented by this
   * UGI.

View on GitHub (pinned to 2add963021)

Solutions

  1. On the resolving node, run `id <user>` to confirm the OS can resolve groups for that user
  2. Check hadoop.security.group.mapping provider config (class, LDAP URL, bind user, search base)
  3. Ensure the user actually exists in the group source (LDAP/AD) and has at least one group
  4. If lookups are intermittent, fix the underlying mapping/timeout issue rather than catching the IOException
Defensive patterns

Strategy: try-catch

Validate before calling

Set<String> groups = ugi.getGroupsSet();
if (groups.isEmpty()) {
  throw new IllegalStateException(
      "no groups resolved for " + ugi.getUserName()
          + " - check group mapping before calling getPrimaryGroupName");
}
String primary = ugi.getPrimaryGroupName();

Try / catch

try {
  return ugi.getPrimaryGroupName();
} catch (IOException e) {
  if (e.getMessage() != null
      && e.getMessage().contains("no primary group")) {
    // group resolution failed upstream - surface a config/OS diagnostic
    LOG.error("group resolution empty for {}", ugi.getUserName());
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling ugi.getPrimaryGroupName() when getGroupsSet() is empty: shell-based mapping silently returned EMPTY_GROUPS_SET after failed `groups`/`id` lookups, LDAP mapping found no memberships, or the user does not exist on the node doing the resolution.

Common situations: HDFS NameNode calling getPrimaryGroupName for permission checks on a user unknown to the node; group mapping provider misconfigured (wrong LDAP bind/base); user exists in Kerberos but not in UNIX/LDAP groups; sssd outage.

Related errors


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/84b68d19500d7435. Report an issue: GitHub.