UserGroupInformation.getGroups() 代码解读
时间: 2024-03-07 20:48:23 浏览: 144
UserGroupInformation.getGroups() 方法是 Hadoop 中用于获取用户所属用户组信息的方法。在 Hadoop 中,为了实现对文件系统的权限控制,每个文件或目录都有一个所有者和一个或多个用户组。只有该文件或目录的所有者或所属用户组中的成员才有权对其进行读写操作。因此,在执行 Hadoop 任务时,获取用户所属用户组信息是非常重要的。
该方法返回一个字符串数组,包含当前用户所属的所有用户组的名称。具体实现方式是通过操作系统或者 Kerberos 服务器来获取用户所属用户组信息,然后将它们封装成字符串数组返回。
该方法的源代码实现类似于下面的代码:
```java
public static String[] getGroups() {
// 通过操作系统或者 Kerberos 获取用户所属用户组信息
String[] groups = ...;
// 返回字符串数组,包含当前用户所属的所有用户组的名称
return groups;
}
```
需要注意的是,该方法只能在 Hadoop 集群中执行,因为只有在 Hadoop 集群中才有用户组的概念。如果在本地环境中执行该方法,它只会返回当前用户所属的默认用户组。
相关问题
UserGroupInformation.getGroups() 底层实现
UserGroupInformation.getGroups() 方法的底层实现如下:
1. 如果用户已经登录,则直接从缓存中获取用户所属用户组信息,缓存中保存了用户的登录信息(包括用户名、所属用户组等)。如果缓存中没有,则进行第2步。
2. 通过操作系统或者 Kerberos 服务器来获取用户所属用户组信息。具体实现方式如下:
- 如果 Hadoop 集群是基于 Kerberos 认证的,则通过 Kerberos 认证服务器来获取用户所属用户组信息。具体实现方式是向 Kerberos 认证服务器发送一个 TGS 请求,请求包含用户的凭证信息(包括用户名和密码),服务器则返回用户所属用户组信息。
- 如果 Hadoop 集群是基于操作系统认证的,则通过操作系统来获取用户所属用户组信息。具体实现方式是通过 JNI 调用本地操作系统的用户管理 API,获取用户所属的所有用户组信息。
3. 将用户所属用户组信息缓存起来,并返回用户所属的所有用户组信息。
需要注意的是,这里的缓存指的是 Hadoop 的用户登录缓存,它是一个静态的 Map 对象,用于保存用户的登录信息。在 Hadoop 集群中,用户登录后,用户的登录信息会被缓存到这个 Map 对象中,以便后续操作可以直接从缓存中获取用户的登录信息。
报错Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties 23/06/01 20:24:22 INFO SparkContext: Running Spark version 2.0.0 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/map/UnmodifiableMap at org.apache.hadoop.conf.Configuration$DeprecationContext.<init>(Configuration.java:409) at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:448) at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:260) at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:790) at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:760) at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:633) at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2245) at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2245) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2245) at org.apache.spark.SparkContext.<init>(SparkContext.scala:297) at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2256) at org.apache.spark.sql.SparkSession$Builder$$anonfun$8.apply(SparkSession.scala:831) at org.apache.spark.sql.SparkSession$Builder$$anonfun$8.apply(SparkSession.scala:823) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:823) at spark.sparkMysql$.main(sparkToMysql.scala:11) at spark.sparkMysql.main(sparkToMysql.scala) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.UnmodifiableMap at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 18 more Process finished with exi
这个错误是由于缺少commons-collections依赖造成的。你需要将commons-collections添加到你的项目中,可以通过Maven或Gradle来添加。如果你已经添加了commons-collections,那么可能是版本不兼容或者没有正确引用。你可以检查一下你的依赖版本和引用方式是否正确。
阅读全文