繁体   English   中英

从 python 脚本执行直线命令时出现“未找到直线命令”错误(从 oozie shell 操作调用)

[英]“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 动作来完成您尝试执行的任务。

参考: Oozie > 异步动作和同步动作有什么区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM