在Hadoop上运行Oozie作业的问题 - / user / history / done_intermediate上的权限

时间:2016-08-12 16:57:42

标签: hadoop hdfs oozie

首先是一点背景。 我有一个测试CDH集群,有两个节点。我正在尝试执行Oozie作业,下载文件,使用SPARK处理它,然后在Solr中对其进行索引。

群集配置为使用Kerberos身份验证。 CDH版本是5.7.1

当我尝试使用Oozie运行作业时,使用以下命令:

oozie job --oozie https://host:11443/oozie/ -run --config oozieExample/job.properties

失败,出现以下异常:

2016-08-12 12:29:40,415 WARN org.apache.oozie.action.hadoop.JavaActionExecutor: SERVER[it4364-cdh01.novalocal] USER[centos] GROUP[-] TOKEN[] APP[stackOverflow] JOB[0000012-160808110839555-oozie-clou-W] ACTION[0000012-160808110839555-oozie-clou-W@Download_Current_Data] Exception in check(). Message[JA017: Could not lookup launched hadoop Job ID [job_1470672690566_0027] which was associated with  action [0000012-160808110839555-oozie-clou-W@Download_Current_Data].  Failing this action!]
org.apache.oozie.action.ActionExecutorException: JA017: Could not lookup launched hadoop Job ID [job_1470672690566_0027] which was associated with  action [0000012-160808110839555-oozie-clou-W@Download_Current_Data].  Failing this action!
        at org.apache.oozie.action.hadoop.JavaActionExecutor.check(JavaActionExecutor.java:1277)
        at org.apache.oozie.command.wf.ActionCheckXCommand.execute(ActionCheckXCommand.java:182)
        at org.apache.oozie.command.wf.ActionCheckXCommand.execute(ActionCheckXCommand.java:56)
        at org.apache.oozie.command.XCommand.call(XCommand.java:286)
        at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:175)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

通过快速Google搜索,似乎在作业历史记录服务器未运行时发生这种情况,或者无法检测作业的中间目录。

在历史目录中执行ls命令时,我得到以下内容:

[hdfs@it4364-cdh01 ~]$  hadoop fs -ls /user/history
Found 2 items
drwxrwx---   - mapred hadoop          0 2016-08-12 10:36 /user/history/done
drwxrwxrwt   - mapred hadoop          0 2016-08-12 12:29 /user/history/done_intermediate

我猜这是好的。理论上,mapred用户应该是历史文件夹的所有者,基于CDH文档。

但是,当我检查done_intermediate的内容时:

[hdfs@it4364-cdh01 ~]$  hadoop fs -ls  /user/history/done_intermediate
Found 1 items
drwxrwx---   - centos hadoop          0 2016-08-12 12:29 /user/history/done_intermediate/centos

这意味着用户centos(执行Oozie作业的用户)是该目录的所有者。这会阻止作业历史记录服务器读取文件,将作业标记为已完成,然后Oozie将其标记为失败。日志正好说明了这一点:

<ommited for brevity>
...
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=mapred, access=READ_EXECUTE, inode="/user/history/done_intermediate/centos":centos:hadoop:drwxrwx---
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:281)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:262)
...
<ommited for brevity>

如果我更改历史记录文件夹中所有内容的所有权,则使用hadoop fs -ls -R /user/history历史记录服务器识别该作业并将其标记为已完成。

我尝试以mapred用户身份运行作业,更改作业的.properties文件,但是,这也失败了,因为mapred用户没有权限在HDFS内的/users文件夹上写入,所以这似乎不是正确的解决方案。

是否有一些配置可以避免历史文件夹中centosmapred之间的用户冲突?

提前致谢

1 个答案:

答案 0 :(得分:1)

长话短说:针对作业历史记录日志集合的 HDFS权限问题可能有不同的根本原因......

  1. 系统帐户mapred无法通过“组映射”规则解析(默认配置=&gt;映射NameNode主机上本地Linux用户的Hadoop用户名,并检索其Linux组 - - 但反过来Linux用户/组可能会绑定到AD,OpenLDAP等。)
  2. 系统帐户mapred可以解析,但不是必需的hadoop系统组的成员(...)
  3. hdfs:///user/history/子目录中的权限因某些未知原因而混乱 - 例如“粘贴位”从t切换到T,恕不另行通知
  4. 该帖子中描述了类似的问题:historyserver not able to read log after enabling kerberos (被诊断为原因#2)

    PS:我提到个人经验中的“粘性位”翻转(原因#3)。顺便说一下,仍然对导致这种变化的原因感到困惑。