bash – Oozie shell脚本动作
我正在探索Oozie管理Hadoop工作流的功能.我正在尝试设置一个
shell动作来调用一些配置单元命令.我的shell脚本hive.sh看起来像:
#!/bin/bash hive -f hivescript hive脚本(已经独立测试)创建了一些表等等.我的问题是在哪里保留hivescript,然后如何从shell脚本中引用它. 我试过两种方式,一是使用本地路径,如蜂房-f /本地/路径/到/文件,并采用与上述相对路径,蜂巢-f hivescript,在这种情况下,我把我的hivescript在Oozie的应用path目录(与hive.sh和workflow.xml相同)并将其设置为通过workflow.xml转到分布式缓存. 使用这两种方法,我收到错误消息: 我的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: <shell xmlns="uri:oozie:shell-action:0.1"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <exec>${appPath}/hive.sh</exec> <file>${appPath}/hive.sh</file> <file>${appPath}/hive_pill</file> </shell> <ok to="end"/> <error to="end"/> </action> <end name="end"/> 我的目标是使用oozie通过shell脚本调用hive脚本,请提出你的建议. 解决方法
关于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> 我希望这有助于每个人. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – Bootstrap 2.3.1 popover导致父模式关
- 解决: is not found. Have you run APT to generate&n
- Vim教程之进阶
- Dart最新消息:Angular 2 Dart及Flutter发布
- Axis2开发webservice总结
- Angular2 beta中的DynamicComponentLoader:“元素没有组件
- bash – 从grep生成的列表中创建数组
- 在Vim中编程:您*用什么特定机制来“复制 – 粘贴”变量?
- twitter-bootstrap – Zurb Foundation vs Twitter Bootstr
- bash – 当路径作为命令输入时,cd到目录(而不是“foo是目录