HDFS上传文件出错: Permission denied: user=user, access=WRITE, inode="/test":hdfs:supergroup:drwxr-xr-x

本文介绍在使用Java API上传文件到HDFS时遇到的权限错误问题及两种解决方案。一是通过修改文件夹所有者和权限,二是直接在代码中指定用户为HDFS超级用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

在将本地文件上传到HDFS时出错。上传的代码如下:

public static void writeToHdfs() throws Exception{

        //String hdfsPath = "hdfs://master:8020/test1/test.txt";//hdfs位置
        String localPath = "D:\\test.txt";//本地磁盘位置

        Configuration configuration = new Configuration();
        //configuration.set("fs.defaultFS", "hdfs://10.10.2.101:9000");
        FileSystem fs = FileSystem.get(new URI("hdfs://master:8020"), configuration);
        FSDataOutputStream out = fs.create(new Path("/test/test.txt"));//创建一个输出流

        InputStream in = new FileInputStream(new File(localPath));//从本地读取文件
        IOUtils.copyBytes(in, out, 100, true);
        System.out.println("上传over");
    }

{

     如果将hdfs的地址和端口写错,还会出现下面的报错信息:

     (注意要和core-site.xml中的fs.defaultFS的value一致)

     RPC response exceeds maximum data length; Host Details : local host is: "DESKTOP-40GENV7/2.0.1.21"; destination host is: "master":9000;

 }

出现的错误:

使用指令"sudo -u hdfs hdfs dfs -ls /"查看文件夹的权限看到如下结果

可以看出test文件夹的所有者是hdfs,hdfs相当于一个超级用户,

解决方案1:

使用指令"sudo -u hdfs hadoop fs -chown root /test",把test文件夹的用户改成root(或者自己的用户名)。

另外还需要指令"sudo -u hdfs hdfs dfs -chmod 777 /test",开放文件夹的读写权限。

参考:https://blog.youkuaiyun.com/g11d111/article/details/72902112

          https://blog.youkuaiyun.com/wzygis/article/details/46966235

解决方案2:

从代码入手,将代码修改成:

FileSystem fs = FileSystem.get(new URI("hdfs://master:8020"), configuration,"hdfs");

在FileSystem.get()函数里添加上user:"hdfs"。搞定,不用像方案1里去修改权限了

<think>好的,我现在要解决用户在使用HDFS命令时遇到的权限问题。用户执行了`hdfs dfs -mkdir /test_dir`,但得到了错误提示:“mkdir: Permission denied: user=sk22019, access=WRITE, inode="/":myhdp:supergroup:drwxr-xr-x”。我需要分析这个问题,并给出解决方案。 首先,我需要理解错误信息。错误显示用户sk22019在根目录“/”下没有写入权限。根目录的所有者是myhdp,所属组是supergroup,权限是drwxr-xr-x,也就是所有者有读、写、执行权限,同组用户和其他用户只有读和执行权限。用户sk22019不属于supergroup,因此无法在根目录下创建新目录。 接下来,我需要考虑可能的解决方案。常见的方法包括: 1. **使用超级用户权限执行命令**:如果用户有管理员权限,可以通过sudo或su切换到HDFS超级用户(如hdfs)来执行命令。例如:`sudo -u hdfs hdfs dfs -mkdir /test_dir`。这可以绕过权限限制,因为hdfs用户通常拥有所有权限。 2. **修改根目录权限**:直接更改根目录的权限,允许其他用户写入。但这样做可能存在安全风险,因为根目录开放写权限可能导致未经授权的用户随意创建或删除文件。命令示例:`hdfs dfs -chmod 777 /`。不过,这种方法不推荐在生产环境中使用。 3. **在用户有权限的目录下创建**:建议用户在具有写入权限的目录(如其主目录)下创建子目录。例如:`hdfs dfs -mkdir /user/sk22019/test_dir`。这避免了修改系统级目录权限的需求,更加安全。 4. **将用户添加到supergroup组**:如果用户sk22019被添加到supergroup组中,由于根目录的组权限是r-x,用户可能仍然无法写入,除非权限更改为rwx。但原权限是drwxr-xr-x,组用户也没有写权限,所以即使加入组,可能仍然需要更改组权限,这可能不太实际。 需要进一步验证这些方法的可行性。例如,检查用户是否有权使用sudo切换到hdfs用户。此外,修改根目录权限的风险需要向用户说明,避免系统安全问题。 总结下来,最安全和推荐的方法是第一种和第三种。建议用户优先尝试使用超级用户权限或在有权限的目录下创建文件夹。如果用户坚持要在根目录创建,则需谨慎修改权限,并了解潜在风险。</think>您在使用HDFS命令时遇到的权限问题可以通过以下步骤分析和解决: --- ### **错误原因分析** 错误信息 `mkdir: Permission denied: user=sk22019, access=WRITE, inode="/":myhdp:supergroup:drwxr-xr-x` 表明: 1. **用户身份**:当前操作的用户是 `sk22019`。 2. **目标路径权限**: - 根目录 `/` 的所有者为 `myhdp`,所属组为 `supergroup`。 - 权限为 `drwxr-xr-x`(即所有者有读、写、执行权限,同组和其他用户仅有读、执行权限)。 3. **权限不足**:用户 `sk22019` 不属于 `supergroup` 组,且在根目录下没有写入权限(`WRITE`)。 --- ### **解决方案** 根据具体场景选择以下方法: #### **方法 1:使用超级用户权限操作** 若需在根目录直接创建目录,可通过HDFS超级用户(如 `hdfs`)执行命令: ```bash sudo -u hdfs hdfs dfs -mkdir /test_dir ``` - **原理**:`hdfs` 用户通常拥有HDFS的完全权限。 - **注意**:需确保当前用户有 `sudo` 权限。 #### **方法 2:修改根目录权限(谨慎使用)** 临时放宽根目录权限(需管理员权限): ```bash hdfs dfs -chmod 777 / hdfs dfs -mkdir /test_dir hdfs dfs -chmod 755 / # 恢复权限 ``` - **风险**:开放根目录写权限可能导致安全问题,**不推荐生产环境使用**。 #### **方法 3:在用户有权限的目录下创建** 在用户主目录(如 `/user/sk22019`)下操作: ```bash hdfs dfs -mkdir /user/sk22019/test_dir ``` - **优势**:无需权限变更,安全性高。 - **前提**:需确保用户主目录存在且可写。 --- ### **补充说明** - **检查用户所属组**:通过 `groups sk22019` 确认用户是否属于 `supergroup`。 - **权限模型**:HDFS权限与Linux类似,遵循 `[所有者][组][其他用户]` 的读写执行控制。 建议优先选择 **方法1** 或 **方法3**,避免直接修改根目录权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值