[英]“Beeline command not found” error while executing beeline command from python script (called from oozie shell action)
我有一個 python 腳本,我想使用 oozie 來安排它。 我正在使用 Oozie shell 操作來調用腳本。 腳本中有一個直線命令。 當我運行 oozie 工作流時,我收到錯誤"sh: beeline: command not found" 。 如果我從邊緣節點手動運行此腳本或僅運行直線命令,它運行得非常好。 我的數據平台是 Hortonworks 2.6。 下面是我的工作流程。xml 和 python 腳本:
工作流程.xml
<workflow-app xmlns="uri:oozie:workflow:0.3" name="hive2-wf">
<credentials>
<credential name='hcat-creds' type='hcat'>
<property>
<name>hcat.metastore.uri</name>
<value>thrift://host:9083</value>
</property>
<property>
<name>hcat.metastore.principal</name>
<value>hive/_HOST@SOLON.PRD</value>
</property>
</credential>
</credentials>
<start to="python-node"/>
<action name="python-node" cred="hcat-creds">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>run_validations.py</exec>
<argument>--jdbcURL</argument><argument>${jdbcURL}</argument>
<argument>--jdbcPrincipal</argument><argument>${jdbcPrincipal}</argument>
<env-var>PYTHONPATH=/bin/python</env-var>
<env-var>PYTHON_EGG_CACHE=/tmp</env-var>
<env-var>PATH=/usr/bin</env-var>
<env-var>HADOOP_CLASSPATH=${HADOOP_CLASSPATH}</env-var>
<file>run_validations.py</file>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
腳本:
#!/usr/bin/env python2
import sys, os, commands, datetime, time ,getpass, errno
from optparse import OptionParser
import subprocess
from subprocess import Popen, PIPE
def arg_handle():
usage = "usage: run_validations.py [options]"
parser = OptionParser(usage)
parser.add_option("-u", "--jdbcURL",dest="jdbcURL",help="jdbcURL")
parser.add_option("-p", "--jdbcPrincipal",dest="jdbcPrincipal",help="jdbcPrincipal")
(options, args) = parser.parse_args()
print("run_validations.py -> Input : " + str(options))
return options
def main():
print("run_validations.py -> Started Run_validations.py")
options = arg_handle()
print("JDBC URL : "+options.jdbcURL)
print("JDBC PRINCIPAL : "+options.jdbcPrincipal)
beeline_connection = options.jdbcURL+";principal="+options.jdbcPrincipal
hive_cmd = 'beeline -u "'+beeline_connection+'" -e "select 1+2;"'
print("Invoked :"+hive_cmd)
rc,out = commands.getstatusoutput(hive_cmd)
if(rc==0):
print("RC : "+str(rc))
print("Output :")
print(out)
else:
print("RC : "+str(rc))
print("Output :")
print(out)
if __name__ == "__main__":
main()
Output
>>> Invoking Shell command line now >>
Stdoutput run_validations.py -> Started Run_validations.py
Stdoutput run_validations.py -> Input : {'jdbcURL': 'jdbc:hive2://host:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2', 'jdbcPrincipal': 'hive/_HOST@SOLON.PRD'}
Stdoutput Invoked :beeline -u "jdbc:hive2://host:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/_HOST@SOLON.PRD" -e "select 1+2;"
Stdoutput RC : 32512
Stdoutput Output :
Stdoutput sh: beeline: command not found
Exit code of the Shell command 0
<<< Invocation of Shell command completed <<<
有人可以告訴我我錯過了什么嗎?
Oozie 在 Hadoop 集群中的不同節點(可能是數據節點之一)中執行 shell 操作,而不是邊緣節點(您在其中測試直線或 python 腳本)。 在邊緣節點中必須安裝直線,這就是您能夠測試它的原因。
但實際問題是正在執行 shell 操作的節點似乎沒有安裝直線。 如果您可以訪問該節點,則可以登錄並檢查直線。
我建議您嘗試結合使用 hive 動作和 shell 動作來完成您嘗試執行的任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.