1

我正在尝试使用 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),正如在 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,现在同样的旧权限被拒绝异常又回来了。

能否请你帮忙。

4

2 回答 2

2

最后我可以解决这个问题。

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

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

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

hadoop fs -chmod 1777 /tmp

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

这次我在第一篇文章中的猪脚本就像魅力一样。

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

drwxrwxrwx

希望这可以帮助任何面临同样问题的人。

干杯

于 2013-09-30T15:54:35.133 回答
0
sudo su - hdfs

一旦您以“hdfs”用户身份运行,那么您应该能够运行

hadoop fs -chmod -R 777 /tmp

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

于 2015-02-03T18:54:02.513 回答