Pig - 地图缩减模式下的权限被拒绝

Posted

技术标签:

【中文标题】Pig - 地图缩减模式下的权限被拒绝【英文标题】:Pig - Permission denied in map reduce mode 【发布时间】:2013-09-26 22:02:19 【问题描述】:

我正在尝试使用 PigStorage 从 hdfs 加载 csv 文件,限制输出 bt 一条记录并转储。

我的 hdfs 快照:

我在从属机器上运行一个 2 节点集群,其中包含 1 个主节点(NN 和 Sec NN)和 1 个数据节点和作业跟踪器。

我的猪脚本在数据节点上运行。

使用根用户

grunt> x= load '/user/hadoop/input/myfile.csv' using PigStorage(',') as (colA:chararray);
grunt> y = limit x 1;                                                                                 
grunt> dump y;

控制台日志:

> HadoopVersion   PigVersion      UserId  StartedAt               FinishedAt    
> Features
> 1.0.4           0.11.1          root    2013-09-26 17:35:18     2013-09-26 17:35:47     LIMIT
> 
> Failed!
> 
> Failed Jobs: JobId   Alias   Feature Message Outputs
> job_201309190323_0019   x,y             Message: Job failed! Error -
> JobCleanup Task Failure, Task: task_201309190323_0019_m_000002

我收到权限被拒绝错误并且日志是

org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=hadoop, access=EXECUTE, inode="hadoop-root":root:supergroup:rwx------

这表示当用户“hadoop”试图在文件夹“hadoop-root”上执行时权限被拒绝。

但是我当前的用户是我运行 pig 的 root 并且我的 namenode 正在运行用户 hadoop(我希望是超级用户)

**为什么日志显示的是 user=hadoop 而不是 root。我是不是做错了什么**

hdfs 快照:

    [hadoop@hadoop-master ~]$ hadoop fs -ls /
    Warning: $HADOOP_HOME is deprecated.

    Found 2 items
    drwx------   - hadoop supergroup          0 2013-09-26 17:29 /tmp
    drwxr-xr-x   - hadoop supergroup          0 2013-09-26 14:20 /user
----------------------------------------------------------------------------------------
    [root@hadoop-master hadoop]# hadoop fs -ls /user
    Warning: $HADOOP_HOME is deprecated.

    Found 2 items
    drwxr-xr-x   - hadoop supergroup          0 2013-09-26 14:19 /user/hadoop
    drwxr-xr-x   - root   root                0 2013-09-26 14:33 /user/root
----------------------------------------------------------------------------------------    
    [hadoop@hadoop-master ~]$ hadoop fs -ls /tmp
    Warning: $HADOOP_HOME is deprecated.

    Found 15 items
    drwx------   - hadoop supergroup          0 2013-09-19 01:43 /tmp/hadoop-hadoop
    drwx------   - root   supergroup          0 2013-09-19 03:25 /tmp/hadoop-root
    drwxr-xr-x   - hadoop supergroup          0 2013-09-26 17:29 /tmp/temp-1036150440
    drwxr-xr-x   - root   supergroup          0 2013-09-26 17:27 /tmp/temp-1270545146
    drwx------   - root   supergroup          0 2013-09-26 14:51 /tmp/temp-1286962351
    drwx------   - hadoop supergroup          0 2013-09-26 14:12 /tmp/temp-1477800537
    drwx------   - hadoop supergroup          0 2013-09-26 15:25 /tmp/temp-1503376062
    drwx------   - root   supergroup          0 2013-09-26 14:09 /tmp/temp-282162612
    drwx------   - root   supergroup          0 2013-09-26 17:22 /tmp/temp-758240893
    drwx------   - root   supergroup          0 2013-09-26 15:00 /tmp/temp1153649785
    drwx------   - root   supergroup          0 2013-09-26 13:35 /tmp/temp1294190837
    drwx------   - root   supergroup          0 2013-09-26 13:42 /tmp/temp1469783962
    drwx------   - root   supergroup          0 2013-09-26 14:45 /tmp/temp2087720556
    drwx------   - hadoop supergroup          0 2013-09-26 14:29 /tmp/temp2116374858
    drwx------   - root   supergroup          0 2013-09-26 16:55 /tmp/temp299188455

我什至尝试关闭权限检查(我的两个节点上的 core-site.xml 中的 dfs.permissions),如提到的Permission denied at hdfs 重新启动了我所有的 hadoop 服务。但仍然没有运气。

根据日志,我试过做

hadoop fs -chmod -R 777 /tmp

我发现 hadoop-root(根据上述日志没有权限)将位于 hdfs 的 /tmp 目录下。

但是更改权限后我得到了不同的异常。

Message: java.io.IOException: The ownership/permissions on the staging directory hdfs://hadoop-master:9000/tmp/hadoop-root/mapred/staging/root/.staging is not as expected. It is owned by root and permissions are rwxrwxrwx. The directory must be owned by the submitter root or by root and permissions must be rwx------

所以,我将权限恢复为 hadoop fs -chmod -R 700 /tmp,现在同样的旧权限被拒绝异常又回来了。

你能帮忙吗?

【问题讨论】:

对上述问题有什么帮助吗? 尝试将输入文件复制到 HDFS,然后在您的 pig 代码中从 HDFS 访问它。让我们知道进展如何。 嗯..我在 HDFS 本​​身中有输入文件并使用 pig 加载相同的文件。 【参考方案1】:

我终于可以解决这个问题了。

我在 HDFS 中有我的 /tmp 文件,但没有适当的权限。当我的 hdfs 中已有一些文件时,我尝试将权限更改为 1777(粘性位)。但这不起作用。

作为一个试验和错误,我使用 -copyToLocal 将我的 hdfs 备份到我的本地文件系统并删除了我的所有文件,包括 /tmp 文件夹。

这次我用适当的权限重新创建了 /tmp 目录。

hadoop fs -chmod 1777 /tmp

然后我使用 -put 命令将所有文件再次复制到 hdfs 中。

这一次,我在第一篇文章中的猪脚本效果很好。

我检查了 /tmp/hadoop-root/mapred/staging 的权限,它设置为应有的值。

drwxrwxrwx

希望这对遇到同样问题的人有所帮助。

干杯

【讨论】:

您可以使用 setfacl 命令为特定用户设置特定文件夹的权限。【参考方案2】:
sudo su - hdfs

一旦你以 'hdfs' 用户身份运行,那么你应该能够运行

hadoop fs -chmod -R 777 /tmp

然后应更改所有文件权限。

【讨论】:

以上是关于Pig - 地图缩减模式下的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

登录不了高德地图显示访问被拒绝使用代理权限

用户模式权限被拒绝绑定到套接字

MacOS Catalina 读写挂载无法在单用户或恢复模式下挂载,权限被拒绝

对象“sysobjects”、数据库“mssqlsystemresource”、模式“sys”的 SELECT 权限被拒绝

Firebase 规则 - 权限被拒绝

使用服务帐户凭据模式的 Firebase 分发 android 应用程序的权限被拒绝