我可以在Oozie移动动作中使用通配符(例如*)或文件模式(例如{})吗?
我试图将我的工作结果移动到存档目录中.
目录结构的状态:
output
- 201304
- 201305
archive
- 201303
Run Code Online (Sandbox Code Playgroud)
我的行动:
<fs name="archive-files">
<move source="hdfs://namenode/output/{201304,201305}"
target="hdfs://namenode/archive" />
<ok to="next"/>
<error to="fail"/>
</fs>
Run Code Online (Sandbox Code Playgroud)
结果错误:
FS006: move, source path [hdfs://namenode/output/{201304,201305}] does not exist
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以在glob或bash语法中移动多个文件?想要做类似这个hadoop命令的事情:
hadoop fs -mv hdfs://namenode/output/{201304,201305} hdfs://namenode/archive
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?hadoop fs命令接受glob.Oozie?
Oozie将在其Web UI中列出所有提交的作业,包括RUNNING,KILLED,PREP等.
有没有办法从oozie的Web UI删除作业而不直接编辑Metastore DB?
我正在尝试在 CDH 虚拟机上运行 Oozie 示例。我运行了 Cloudera Manager 并执行以下命令:
oozie job -oozie http://localhost:11000/oozie -config examples/apps/map-reduce/job.properties -run
Run Code Online (Sandbox Code Playgroud)
当我检查状态时,我收到了 HadoopAccessorException。
我检查了 oozie 日志,看到以下堆栈跟踪:
2013-07-22 14:25:56,179 WARN org.apache.oozie.command.wf.ActionStartXCommand:
USER[cloudera] GROUP[-] TOKEN[] APP[map-reduce-wf] JOB[0000001-130722142323751-oozie
oozi-W] ACTION[0000001-130722142323751-oozie-oozi-W@mr-node] Error starting action
[mr-node]. ErrorType [ERROR], ErrorCode [HadoopAccessorException], Message
[HadoopAccessorException: E0900: Jobtracker not allowed, not in
Oozies whitelist] org.apache.oozie.action.ActionExecutorException:
HadoopAccessorException: E0900: Jobtracker not allowed, not in Oozies
Whitelist
Run Code Online (Sandbox Code Playgroud)
oozie-site.xml 和 oozie-default.xml设置了oozie.service.HadoopAccessorService.jobTracker.whitelist和oozie.service.HadoopAccessorService.nameNode.whitelist。
任何帮助,将不胜感激。
谢谢。
戴夫
我正在提交一个oozie工作流程,我在Hue设计它包含一些java动作.
Hue提交并尝试执行oozie工作流程,我总是得到以下错误.
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.JavaMain], main() threw exception, begin > end in range (begin, end)
Caused by java.lang.IllegalArgumentException: begin > end in range (begin, end): (1399708804155, 1399694415805)
Run Code Online (Sandbox Code Playgroud)
我不知道它意味着什么以及我应该怎么做.从错误消息中,我能够推断工作流的提交时间晚于完成时间.
但我不知道造成这种情况的原因以及解决这个问题需要做些什么.
对此的任何输入都会有所帮助.
我在Hue使用oozie编辑器调用bash shell脚本.
我在工作流中使用了shell动作,并在shell命令中尝试了以下不同的选项:
但所有这些选项都给出了以下错误:
无法运行程序"sec_test_oozie.sh"(在目录"/ data/hadoop/yarn/local/usercache/user/appcache/application_1399542362142_0086/container_1399542365422_0086_01_000002"):java.io.IOException:error = 2,没有这样的文件或目录
我应该如何给出shell脚本执行命令?shell脚本文件应该驻留在哪里?
我有一个 Oozie 协调器,用于监视某个目录中显示的文件。该协调器每天运行。如果正在观看的文件出现,则会启动工作流程。
工作流采用正在监视的文件/目录的参数。Oozie 将其传递给它。它是一个完全限定的路径(即:hdfs://myhost/dir1/dir2/2015-02-17)。
我需要获取 /dir1/dir2/2015-02-17 并将其传递到 Hive 脚本中,该脚本似乎没有采用完全合格的 HDFS 路径。这意味着我需要使用 Workflow EL 函数来去除 hdfs://myhost 部分。我认为 replaceAll() 会做到这一点。问题是将结果传递给 Hive。
有没有办法在工作流本身中使用工作流配置属性?
例如,我希望能够使用“dateToProcess”,它是作为工作流输入的目录名称的一部分:
<workflow-app name="mywf" xmlns="uri:oozie:workflow:0.4">
<parameters>
<property>
<name>region</name>
</property>
<property>
<name>hdfsDumpDir</name>
</property>
<property>
<name>hdfsWatchDir</name>
<value>${nameNode}${watchDir}</value>
</property>
</parameters>
<start to="copy_to_entries"/>
<action name="copy_to_entries">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<job-xml>hive-site.xml</job-xml>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
<property>
<name>dateToProcess</name>
<value>${replaceAll(hdfsDumpDir, hdfsWatchDir,"")}</value>
</property>
</configuration>
<script>myhivescript.q</script>
<!--
Parameters referenced within Hive script.
-->
<param>INPUT_TABLE=dumptable</param>
<param>INPUT_LOCATION=${watchDir}/${wf:conf('dateToProcess')}</param>
</hive>
<ok to="cleanup"/>
<error to="sendEmailKill"/>
</action>
...
</workflow>
Run Code Online (Sandbox Code Playgroud)
当我使用 $wf:conf('dateToProcess') 时,我得到一个空字符串。使用 ${dateToProcess} 时找不到变量。 …
所有,
希望将变量从shell动作传递给oozie shell.我在我的脚本中运行这样的命令:
#!/bin/sh
evalDate="hive -e 'set hive.execution.engine=mr; select max(cast(create_date as int)) from db.table;'"
evalPartition=$(eval $evalBaais)
echo "evaldate=$evalPartition"
Run Code Online (Sandbox Code Playgroud)
诀窍是它是shell中的hive命令.
然后我运行它来获取它在oozie中:
${wf:actionData('getPartitions')['evaldate']}
Run Code Online (Sandbox Code Playgroud)
但它每次都是空白!我可以在我的shell中运行这些命令很好,它似乎工作,但oozie没有.同样,如果我在群集的其他框上运行命令,它们也可以正常运行.有任何想法吗?
我有一个Oozie工作,我从java客户端开始,它停留在START操作,它说它正在运行,但START节点处于PREP状态.
为什么这样以及如何解决问题?
Oozie工作流只包含一个java动作.群集上的Hadoop版本是2.4.0,集群上的Oozie是4.0.0.
这是workflow.xml
<workflow-app xmlns='uri:oozie:workflow:0.2' name='java-filecopy-wf'>
<start to='java1'/>
<action name='java1'>
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>default</value>
</property>
</configuration>
<main-class>testingoozieclient.Client</main-class>
<capture-output/>
</java>
<ok to="end" />
<error to="fail" />
</action>
<kill name="fail">
<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
</message>
</kill>
<end name='end' />
Run Code Online (Sandbox Code Playgroud)
这是java客户端
OozieClient oozieClient = new OozieClient(args[0]);
Properties conf = oozieClient.createConfiguration();
conf.setProperty(OozieClient.APP_PATH, args[1]);
conf.setProperty("nameNode", args[2]);
conf.setProperty("jobTracker", args[3]);
String jobId = null;
try{
jobId = oozieClient.run(conf);
}
catch(OozieClientException ex){
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
由于我尝试了几次,现在有5,6个工作流都以RUNNING作为状态,但是当我通过Web界面查看时,我可以看到所有这些都停留在PREP状态的START节点上?
在一些提交的工作流程被杀后,我能够启动另一个工作流程.这次工作流从开始到java动作,但以类似的方式陷入java动作 - 它保持在PREP状态.
这是日志的样子
2015-06-22 17:54:37,366 INFO …Run Code Online (Sandbox Code Playgroud) 我在Scala中编写了一个使用Spark的应用程序.
该应用程序包含两个模块 - App包含具有不同逻辑的类的Env模块,以及包含环境和系统初始化代码的模块,以及实用程序功能.
入口点位于Env初始化之后,它在App(根据args,使用Class.forName)中创建一个类并执行逻辑.
模块被导出到2个不同的JAR(即env.jar和app.jar).
当我在本地运行应用程序时,它执行得很好.下一步是将应用程序部署到我的服务器.我使用Cloudera的CDH 5.4.
我使用Hue使用Spark任务创建一个新的Oozie工作流,其中包含以下参数:
yarnclustermyApplib/env.jar,lib/app.jarenv.Main在Env模块中)app.AggBlock1Task然后我将2个JAR放在lib工作流文件夹(/user/hue/oozie/workspaces/hue-oozie-1439807802.48)中的文件夹中.
当我运行工作流时,它会抛出一个FileNotFoundException并且应用程序不会执行:
java.io.FileNotFoundException: File file:/cloudera/yarn/nm/usercache/danny/appcache/application_1439823995861_0029/container_1439823995861_0029_01_000001/lib/app.jar,lib/env.jar does not exist
Run Code Online (Sandbox Code Playgroud)
然而,当我离开星火主和模式参数为空,这一切工作正常,但是当我检查spark.master编程设置为local[*],而不是yarn.此外,在观察日志时,我在Oozie Spark动作配置下遇到了这个:
--master
null
--name
myApp
--class
env.Main
--verbose
lib/env.jar,lib/app.jar
app.AggBlock1Task
Run Code Online (Sandbox Code Playgroud)
我假设我做得不对 - 没有设置Spark master和mode参数并且运行应用程序spark.master设置为local[*].据我所知,SparkConf …
在oozie中,input-events非常简单,如果指定的文件/文件夹不存在,协调器作业将保持WAITING状态.但我无法理解是什么output-events.
根据我的理解,output-events标签中指定的文件/文件夹应由oozie创建,以防所有指定的操作成功.但这不会发生.我也找不到任何相关的日志.文件也没有明确说明这一点.
所以,问题是,Oozie真的创建了指定的文件/文件夹output-events吗?或者它只是提到这些特定的文件/文件夹是在工作流程中创建的,创建的责任在于工作,而不是在Oozie上?
相关的代码可以在https://gist.github.com/venkateshshukla/de0dc395797a7ffba153找到
oozie ×10
hadoop ×7
hue ×3
hive ×2
apache-spark ×1
bash ×1
cloudera ×1
hadoop-yarn ×1
java ×1
shell ×1