Oozie shell脚本动作

 勤奋的瞌睡猪_715 发布于 2023-01-18 11:08

我正在探索Oozie管理Hadoop工作流的功能.我正在尝试设置一个shell动作来调用一些配置单元命令.我的shell脚本hive.sh看起来像:

#!/bin/bash
hive -f hivescript

hive脚本(已经独立测试)创建了一些表等等.我的问题是在哪里保留hivescript,然后如何从shell脚本中引用它.

我尝试了两种方法,首先使用本地路径,hive -f /local/path/to/file并使用上面的相对路径hive -f hivescript,在这种情况下,我将我的hivescript保存在oozie应用程序路径目录中(与hive.sh和workflow.xml相同)并设置它通过workflow.xml转到分布式缓存.

使用这两种方法,我收到错误消息: "Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]"在oozie Web控制台上.另外我尝试在shell脚本中使用hdfs路径,据我所知,这不起作用.

我的job.properties文件:

nameNode=hdfs://sandbox:8020
jobTracker=hdfs://sandbox:50300   
queueName=default
oozie.libpath=${nameNode}/user/oozie/share/lib
oozie.use.system.libpath=true
oozieProjectRoot=${nameNode}/user/sandbox/poc1
appPath=${oozieProjectRoot}/testwf
oozie.wf.application.path=${appPath}

和workflow.xml:



    ${jobTracker}

    ${nameNode}

    

        

            mapred.job.queue.name

            ${queueName}

        

    

    ${appPath}/hive.sh

    ${appPath}/hive.sh 

    ${appPath}/hive_pill










我的目标是使用oozie通过shell脚本调用hive脚本,请提出你的建议.

1 个回答
  • 关于Oozie工作流程一直很棘手的一件事是执行bash脚本.Hadoop被创建为大规模并行,因此架构的行为与您想象的完全不同.

    当oozie工作流执行shell操作时,它将从您的作业跟踪器或群集中任何节点上的YARN接收资源.这意味着使用文件的本地位置将不起作用,因为本地存储仅在边缘节点上.如果作业碰巧在边缘节点上产生,那么它将起作用,但是任何其他时间它都会失败,并且这种分布是随机的.

    为了解决这个问题,我发现最好将hdfs中需要的文件(包括sh脚本)放在lib空间或与我的工作流相同的位置.

    这是一个很好的方法来接近你想要实现的目标.

    <shell xmlns="uri:oozie:shell-action:0.1">
    
        <exec>hive.sh</exec> 
        <file>/user/lib/hive.sh#hive.sh</file>
        <file>ETL_file1.hql#hivescript</file>
    
    </shell>
    

    你会注意到的一件事是exec只是hive.sh,因为我们假设文件将被移动到shell动作完成的基本目录

    要确保最后一个注释为真,您必须包含文件的hdfs路径,这将强制oozie使用该操作分发该文件.在您的情况下,配置单元脚本启动器应该只编码一次,并简单地提供不同的文件.由于我们有一对多关系,因此hive.sh应该保存在lib中,而不是随每个工作流一起分发.

    最后你看到了这一行:

    <file>ETL_file1.hql#hivescript</file>
    

    这条线做了两件事.在#之前我们有文件的位置.它只是文件名,因为我们应该使用我们的工作流分发不同的配置单元文件

    user/directory/workflow.xml
    user/directory/ETL_file1.hql
    

    并且运行sh的节点将自动分配给它.最后,#之后的部分是变量名,我们在sh脚本中分配了两个变量名.这使您能够反复重复使用相同的脚本,并简单地将其提供给不同的文件.

    HDFS目录说明,

    如果文件嵌套在与工作流相同的目录中,则只需指定子路径:

    user/directory/workflow.xml
    user/directory/hive/ETL_file1.hql
    

    会产量:

    <file>hive/ETL_file1.hql#hivescript</file>
    

    但是,如果路径位于工作流目录之外,则需要完整路径:

    user/directory/workflow.xml
    user/lib/hive.sh
    

    会屈服:

    <file>/user/lib/hive.sh#hive.sh</file>
    

    我希望这有助于每个人.

    2023-01-18 11:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有