Hadoop 上的 Oozie 作业 运行 问题 - /user/history/done_intermediate 上的权限
Issue with Oozie job running on Hadoop - Permissions on /user/history/done_intermediate
首先介绍一下背景。
我有一个测试 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[Whosebug] 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 搜索,似乎当作业历史服务器未 运行ning 或无法检测到作业的中间目录时会发生这种情况。
在历史目录上执行 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
我想这没问题。理论上,根据 CDH 文档,mapred
用户应该是历史文件夹的所有者。
然而,当我检查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 用户没有权限写入 /users
HDFS 中的文件夹,所以这似乎不是正确的解决方案。
是否有一些配置可以避免历史文件夹中 centos
和 mapred
之间的用户冲突?
提前致谢
长话短说:这个特定的 作业历史记录日志收集的 HDFS 权限问题 可能有不同的根本原因...
- 系统帐户
mapred
无法通过 "Group Mapping" 规则解析
(默认配置 => 将 Hadoop 用户名映射到本地 Linux 用户NameNode 主机,并检索它们的 Linux 组——但反过来 Linux users/groups 可能绑定到 AD、OpenLDAP 等)
- 系统帐户
mapred
可以解析,但不是所需 hadoop
系统组的成员 (...)
hdfs:///user/history/
子目录中的权限由于某些未知原因而变得混乱——例如"sticky bit" 从 t
切换到 T
,恕不另行通知
post 中描述了类似的问题:historyserver not able to read log after enabling kerberos (诊断为原因 #2)
PS:我提到 "sticky bit" 翻转 (原因 #3) 是出于个人经验。顺便说一句,仍然对导致这种变化的原因感到困惑。
首先介绍一下背景。 我有一个测试 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[Whosebug] 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 搜索,似乎当作业历史服务器未 运行ning 或无法检测到作业的中间目录时会发生这种情况。
在历史目录上执行 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
我想这没问题。理论上,根据 CDH 文档,mapred
用户应该是历史文件夹的所有者。
然而,当我检查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 用户没有权限写入 /users
HDFS 中的文件夹,所以这似乎不是正确的解决方案。
是否有一些配置可以避免历史文件夹中 centos
和 mapred
之间的用户冲突?
提前致谢
长话短说:这个特定的 作业历史记录日志收集的 HDFS 权限问题 可能有不同的根本原因...
- 系统帐户
mapred
无法通过 "Group Mapping" 规则解析
(默认配置 => 将 Hadoop 用户名映射到本地 Linux 用户NameNode 主机,并检索它们的 Linux 组——但反过来 Linux users/groups 可能绑定到 AD、OpenLDAP 等) - 系统帐户
mapred
可以解析,但不是所需hadoop
系统组的成员 (...) hdfs:///user/history/
子目录中的权限由于某些未知原因而变得混乱——例如"sticky bit" 从t
切换到T
,恕不另行通知
post 中描述了类似的问题:historyserver not able to read log after enabling kerberos (诊断为原因 #2)
PS:我提到 "sticky bit" 翻转 (原因 #3) 是出于个人经验。顺便说一句,仍然对导致这种变化的原因感到困惑。