从之前的问题开始......
我有一个Oozie工作流,其中包含一个shell操作,该操作调用失败的Python脚本,但出现以下错误。
IOError: [Errno 13] Permission denied: '/home/test/myfile.txt'
所有Python脚本(hello.py)尝试做的都是打开一个文件。在Hadoop之外执行时,此代码可以正常工作。
if __name__ == '__main__':
print ('Starting script')
filein = '/home/test/myfile.txt'
file = open(filein, 'r')
这是我的Oozie工作流程。
<workflow-app xmlns="uri:oozie:workflow:0.4" name="hello">
<start to="shell-check-hour" />
<action name="shell-check-hour">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>hello.py</exec>
<file>hdfs://localhost:8020/user/test/hello.py</file>
<capture-output />
</shell>
<ok to="end" />
<error to="fail" />
</action>
<kill name="fail">
<message>Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end" />
</workflow-app>
如果我尝试给出文件所在位置的绝对路径,我会被许可拒绝。
filein = '/home/test/myfile.txt'
如果我只尝试文件名,我找不到文件。我不明白这一点,Python脚本和文件位于相同的HDFS位置
filein = 'myfile.txt'
也许我需要修改我的Oozie脚本以将文件添加为参数?
答案 0 :(得分:1)
事实证明我需要对我的Python脚本进行一些修改,以使其能够从HDFS打开文件。以下是打开和读取文件的示例代码
import subprocess
''''''
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/user/test/myfile.txt"], stdout=subprocess.PIPE)
for line in cat.stdout:
print line