java - 为什么 UnixSystem().getUsername() 返回 null(Docker 中的 OpenJDK 17)

标签 java hadoop parquet java-17

以下代码适用于 OSX

var hadoopInputFile  = org.apache.parquet.hadoop.util.HadoopInputFile.fromPath(parquetPath, new Configuration())

但在 Linux 上不行:

failure to login: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name
    at jdk.security.auth/com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:67)
    at jdk.security.auth/com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:134)
    at java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:726)
    at java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:665)
    at java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:663)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
    at java.base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:663)
    at java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:574)
    at org.apache.hadoop.security.UserGroupInformation$HadoopLoginContext.login(UserGroupInformation.java:2065)
    at org.apache.hadoop.security.UserGroupInformation.doSubjectLogin(UserGroupInformation.java:1975)
    at org.apache.hadoop.security.UserGroupInformation.createLoginUser(UserGroupInformation.java:719)
    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:669)
    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:579)
    at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:3746)
    at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:3736)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3520)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:288)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:524)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365)
    at org.apache.parquet.hadoop.util.HadoopInputFile.fromPath(HadoopInputFile.java:38)
...

我发现new com.sun.security.auth.module.UnixSystem().getUsername()返回null但它不应该

有什么想法如何修复或解决它吗?

UPD
由于这是在 docker 容器内发生的
Dockerfile:

FROM maven:3.8.5-openjdk-17 AS tests
ENV WORKDIR="/application"
WORKDIR ${WORKDIR}
COPY . $WORKDIR/

运行命令:

      docker run
        --user 0:1001
        --volume $(command -v docker):/usr/bin/docker
        --volume /var/run/docker.sock:/var/run/docker.sock
        --volume $(pwd):/path/to/project/application
        app_tag bash -c
        "umask 002;
        mvn --settings ./.m2-settings.xml package"

更新2
我发现 id 给出 uid=1001 gid=1001 groups=1001
whoami - whoami:找不到用户 ID 1001 的名称

目前的解决方法是添加到 Dockerfile

RUN groupadd -g 1001 sysadmin
RUN useradd appadmin -u 1001 -g 1001 -m -s /bin/bash

最佳答案

添加到 Dockerfile 解决了问题

RUN groupadd -g 1001 sysadmin
RUN useradd appadmin -u 1001 -g 1001 -m -s /bin/bash

关于java - 为什么 UnixSystem().getUsername() 返回 null(Docker 中的 OpenJDK 17),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75009659/

相关文章:

java - 用 Java 解析 CSV 文件的一部分

java - 如何在 Java 中将一种日期格式转换为另一种日期格式?

java - Maven 找不到 org.junit,即使它在依赖项中

performance - 在 Hadoop 中提高 MapReduce 作业性能的技巧

hadoop - 为什么不建议将 RAID 用于 Hadoop HDFS 设置?

python - 为什么 Dask 读取 parquet 文件的速度比 Pandas 读取相同 parquet 文件的速度慢很多?

hadoop - Hive parquet snappy 压缩不起作用

hadoop - 无法在oozie中运行sqoop作业(没有枚举常量com.cloudera.sqoop.SqoopOptions.FileLayout.ParquetFile)

java - 陷入无限循环。不明白为什么?

hadoop - Hive 2.1.1版本是否支持数据库重命名?