基于条件为真我在shell脚本中执行hive -e.它工作正常.当我在Oozie中将此脚本放入Shell操作并运行时,我得到一个scriptName.sh:第42行:hive:命令未找到异常.
我尝试在shell动作中传递<env-var> PATH =/usr/lib/hive </ env-var>,但我想我在那里犯了一些错误,因为我得到了同样的错误scriptName.sh:第42行:hive:找不到命令
编辑:
我which hive在shell脚本中使用过.它的输出不一致.我得到两个输出变量:
1./usr/bin/hive以及Delegation token can be issued only with kerberos or web authenticationJava IOException."
2.which : hive not in {.:/sbin:/usr/bin:/usr/sbin:...}
我正试图通过Oozie进行蜂巢动作.我的workflow.xml情况如下:
<workflow-app name='edu-apollogrp-dfe' xmlns="uri:oozie:workflow:0.1">
<start to="HiveEvent"/>
<action name="HiveEvent">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>oozie.hive.defaults</name>
<value>${hiveConfigDefaultXml}</value>
</property>
</configuration>
<script>${hiveQuery}</script>
<param>OUTPUT=${StagingDir}</param>
</hive>
<ok to="end"/>
<error to="end"/>
</action>
<kill name='kill'>
<message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name='end'/>
Run Code Online (Sandbox Code Playgroud)
这是我的job.properties文件:
oozie.wf.application.path=${nameNode}/user/${user.name}/hiveQuery
oozie.libpath=${nameNode}/user/${user.name}/hiveQuery/lib
queueName=interactive
#QA
nameNode=hdfs://hdfs.bravo.hadoop.apollogrp.edu
jobTracker=mapred.bravo.hadoop.apollogrp.edu:8021
# Hive
hiveConfigDefaultXml=/etc/hive/conf/hive-default.xml
hiveQuery=hiveQuery.hql
StagingDir=${nameNode}/user/${user.name}/hiveQuery/Output
Run Code Online (Sandbox Code Playgroud)
当我运行此工作流程时,我最终得到此错误:
ACTION[0126944-130726213131121-oozie-oozi-W@HiveEvent] Launcher exception: org/apache/hadoop/hive/cli/CliDriver
java.lang.NoClassDefFoundError: org/apache/hadoop/hive/cli/CliDriver
Run Code Online (Sandbox Code Playgroud)
Error Code: JA018
Error Message: org/apache/hadoop/hive/cli/CliDriver
我不确定这个错误意味着什么.我哪里错了?
编辑
此链接说错误代码JA018是:JA018 is output directory exists error in workflow map-reduce action.但在我的情况下,输出目录不存在.这使得它更加令人困惑
我在我的机器上运行带有 virtualbox 的 CDH4.5。在虚拟机内部,我有一个本地目录:/home/cloudera/logs/abc.log,我想做一个非常简单的事情,我在 oozie 中安排了一个非常简单的脚本来复制abc.log到 HDFS ( /user/cloudera/logs/)。
计划的作业已执行,但在 stderr 中,它向我显示:
cannot access /home/cloudera/logs/abc.log: No such file or directory
有没有办法可以使这项工作?因为我想用 oozie 安排一个脚本,每天将文件从本地复制到 HDFS 作为沐浴作业。谢谢!!
我正在使用Hue的工作流编辑器来开发Oozie工作流程.有一些行动应该并行执行.
是否可以同时执行两个或多个操作?
我怎样才能在顺化中进行设置?
我通过 Hue 界面创建了 Oozie 工作流程。我有几个与此相关的问题
A。我可以看到创建的工作流程 XML。但我没有看到 job.properties 文件。Job.properties 存储在哪里?
b. 有 REST API 可以提交通过编写工作流程.xml 和 job.properties 创建的 Oozie 作业。对于通过 HUE 创建的 oozie 工作流程,REST API 是什么?任何样本都会有帮助。
我正在尝试为Oozie工作流创建一个通用模板,用于运行不同的配置单元脚本.每个配置单元脚本都有自己的参数.
在Oozie的Hive Action中,在使用PARAM标签设置参数时,我需要检查变量是否存在,如果它不存在,我需要将其默认为"".
我试过了,
<param> my_parameter_var = $ {empty my_parameter?"":my_parameter} </ param>
这只能检查my_parameter是空字符串还是空字符串.如果变量根本不存在,则此检查失败; 出现以下错误:
错误代码:EL_ERROR
错误消息:无法解析变量[my_parameter]
有人可以帮助我如何实现这一目标吗?
我需要安排一个与安全的hbase交互的oozie Java操作,所以我需要为Java操作提供hbase凭据.我使用的是安全的hortonworks 2.2环境,我的工作流XML如下所示
<workflow-app xmlns="uri:oozie:workflow:0.4" name="solr-wf">
<credentials>
<credential name="hbase" type="hbase">
</credential>
</credentials>
<start to="java-node"/>
<action name="java-node" cred="hbase">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<main-class>com.test.hbase.TestHBaseSecure</main-class>
<arg>${arg1}</arg>
</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"/>
</workflow-app>
Run Code Online (Sandbox Code Playgroud)
我还修改了oozie属性以包含HbaseCredentials类
oozie.credentials.credentialclasses=hcat=org.apache.oozie.action.hadoop.HCatCredentials,hbase=org.apache.oozie.action.hadoop.HbaseCredentials
Run Code Online (Sandbox Code Playgroud)
但我无法运行它抛出错误的工作,下面是堆栈跟踪
java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration
at org.apache.oozie.action.hadoop.HbaseCredentials.copyHbaseConfToJobConf(HbaseCredentials.java:60)
at org.apache.oozie.action.hadoop.HbaseCredentials.addtoJobConf(HbaseCredentials.java:49)
at org.apache.oozie.action.hadoop.JavaActionExecutor.setCredentialTokens(JavaActionExecutor.java:1054)
at org.apache.oozie.action.hadoop.JavaActionExecutor.submitLauncher(JavaActionExecutor.java:913)
at org.apache.oozie.action.hadoop.JavaActionExecutor.start(JavaActionExecutor.java:1135)
at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:228)
at org.apache.oozie.command.wf.ActionStartXCommand.execute(ActionStartXCommand.java:63)
at org.apache.oozie.command.XCommand.call(XCommand.java:281)
at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:323)
at org.apache.oozie.service.CallableQueueService$CompositeCallable.call(CallableQueueService.java:252)
at org.apache.oozie.service.CallableQueueService$CallableWrapper.run(CallableQueueService.java:174)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
其他工作运行良好,只有hbase交互失败的工作.我已经在我的lib目录中包含了所有的hbase jar,我无法弄清楚这个问题.
更新的workflow.xml:
<workflow-app xmlns="uri:oozie:workflow:0.4" name="${appName}">
<credentials>
<credential name="hbase-cred" …Run Code Online (Sandbox Code Playgroud) 我是Oozie的新手,我已经阅读了一些Oozie shell动作示例,但这让我对某些事情感到困惑.
我见过的例子中没有<file>标签.
一些例子,像Cloudera的位置,重复文件标签shell脚本:
<shell xmlns="uri:oozie:shell-action:0.2">
<exec>check-hour.sh</exec>
<argument>${earthquakeMinThreshold}</argument>
<file>check-hour.sh</file>
</shell>
Run Code Online (Sandbox Code Playgroud)
在Oozie的网站上,将shell脚本(${EXEC}来自job.properties 的引用,指向script.sh文件)写入两次,用#分隔.
<shell xmlns="uri:oozie:shell-action:0.1">
...
<exec>${EXEC}</exec>
<argument>A</argument>
<argument>B</argument>
<file>${EXEC}#${EXEC}</file>
</shell>
Run Code Online (Sandbox Code Playgroud)
还有一些例子我看过路径(HDFS或本地?)script.sh#script.sh在<file>标签内部之前的位置.
<shell xmlns="uri:oozie:shell-action:0.1">
...
<exec>script.sh</exec>
<argument>A</argument>
<argument>B</argument>
<file>/path/script.sh#script.sh</file>
</shell>
Run Code Online (Sandbox Code Playgroud)
据我所知,任何shell脚本文件都可以包含在工作流HDFS路径中(workflow.xml所在的路径).
有人能解释这些例子中的差异,以及如何<exec>,<file>,script.sh#script.sh,和/path/script.sh#script.sh使用?
我有两个python文件 - my_python_A.py和my_python_B.py.第一个文件引用第二个(from my_python_B import *).
我正在Oozie中的shell动作执行第一个python文件(即脚本很简单python my_python_A.py),并且收到以下错误:
Traceback (most recent call last):
File "my_python_A.py", line 2, in <module>
from my_python_B import *
ImportError: No module named my_python_B
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]
Run Code Online (Sandbox Code Playgroud)
两个python文件都位于HDFS中的同一目录下.如何才能使此import语句生效?
我已经和distcp打了好几天了,我发誓我已经用Google搜索了.这是我的用例:
我在某个位置有一个主文件夹说/ hdfs/root,有很多子目录(深度不固定)和文件.
卷:200,000个文件〜= 30个GO
我需要只为客户端复制一个子集,/ hdfs/root在另一个位置,比如说/ hdfs/dest这个子集由一个可以随时间更新的绝对路径列表定义.
卷:50,000个文件〜= 5个GO
你明白我不能使用简单的hdfs dfs -cp /hdfs/root /hdfs dest因为它没有被优化,它将占用每个文件,并且它没有一个更新模式.
我最终以两种方式使用hadoop distcp:
Algo 1 (simplified):
# I start up to N distcp jobs in parallel for each subdir, with N=MAX_PROC (~30)
foreach subdir in mylist:
# mylist = /hdfs/root/dirX/file1 /hdfs/root/dirX/file2 ...
mylist = buildList(subdirs)
hadoop distcp -i -pct -update mylist /hdfs/dest/subdir &
Run Code Online (Sandbox Code Playgroud)
和
Algo 2
# I start one distcp that has a blacklist
blacklist = …Run Code Online (Sandbox Code Playgroud)