我正在调用下面的shell-action来调用将输出写入文件的shell脚本。 我已经在IBM BigInsight和Cloudera上尝试了这个,但每当我尝试写入HDFS中的新文件时,作业都会失败。
我检查了应用程序/作业ID日志但没有信息。 从shell脚本写入hdfs是否有任何限制。
--- --- sample.sh
hive -e "create t1(id int); insert into t1 values(1);"
hive -e "select * from t1;" > /user/cloudera/test123/t1_data.txt
- workflow.xml
<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.5" name="shell.workflow">
<start to="shell-node"/>
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="test123"/>
<mkdir path="test123"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>sample.sh</exec>
<env-var>HADOOP_USER_NAME=cloudera</env-var>
<file>hdfs://localhost:8020/user/cloudera/oozietest/sample.sh#sample.sh</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="kill"/>
</action>
<kill name="kill">
<message>Error in Shell.Please refer the Oozie Logs</message>
</kill>
<end name="end"/>
</workflow-app>
- job.properties
nameNode=hdfs://localhost:8020
jobTracker=localhost:8032
master=yarn-cluster
user.name=cloudera
queueName=default
examplesRoot=oozietest
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}
答案 0 :(得分:0)
Oozie shell操作不适用于Hive操作。在这里,你需要使用Oozie Hive动作。要使用Oozie Hive动作,你需要准备.sql
文件,你将把你所有的hive查询,然后你需要安排Oozie工作流。
请参阅下面的样本workflow.xml
了解Oozie Hive行动。
<workflow-app name="oozie_hive_action" xmlns="uri:oozie:workflow:0.4">
<credentials>
<credential name="hcat" type="hcat">
<property>
<name>hcat.metastore.uri</name>
<value>${hcat_metastore_uri}</value>
</property>
<property>
<name>hcat.metastore.principal</name>
<value>${hcat_metastore_principal}</value>
</property>
</credential>
</credentials>
<start to="Hive_action"/>
<action name="hive-table-refresh" cred="hcat">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${jobOutputDir}"/>
</prepare>
<job-xml>/diretory/path/to/hive-site.xml</job-xml>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
<property>
<name>oozie.hive.defaults</name>
<value>/diretory/path/to/hive-site.xml</value>
</property>
<property>
<name>oozie.use.system.libpath</name>
<value>true</value>
</property>
</configuration>
<script>/project/hdfs/dir/to/scripts/hive_jobs.sql</script>
<param>OutputDir=${jobOutputDir}</param>
<file>/user/${userName}/${userName}.keytab#${userName}.keytab</file> <!-- If you are using kerberos authentiation -->
<file>/project/hdfs/dir/to/scripts/hive_jobs.sql</file>
<file>/project/hdfs/dir/to/properties/job.properties#job.properties</file>
</hive>
<ok to="end"/>
<error to="kill"/>
</action>
<kill name="kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
请访问Oozie Hive Action Documentations了解有关它的更多信息。
此处,credentail部分是可选的。
<credentials>
<credential name="hcat" type="hcat">
<property>
<name>hcat.metastore.uri</name>
<value>${hcat_metastore_uri}</value>
</property>
<property>
<name>hcat.metastore.principal</name>
<value>${hcat_metastore_principal}</value>
</property>
</credential>
</credentials>
如果您的clauster获得经过身份验证(通常通过Kerberos),则可以使用它。
如果您的clauter不要求对Kerberos进行身份验证,请删除<credentials>
部分和<file>/user/${userName}/${userName}.keytab#${userName}.keytab</file>
然后将<action name="hive-table-refresh" cred="hcat">
替换为<action name="hive-table-refresh">
您还可以访问Oozie Action Authentication documentation以获取有关身份验证的更多信息。
此处hive-site.xml
是$HIVE_HOME/conf
文件夹中xml应存在的网站。
hive_jobs.sql
文件包含实际的配置单元查询。即use db_name;select * from table_name
。
答案 1 :(得分:0)
在您的代码版本中,当您提到'/user/cloudera/test123/t1_data.txt'时,oozie会在正在执行的datanode上查找本地FS路径,但它可能找不到它。
您可以使用以下代码从Hive表写入HDFS目录:
hive -e“INSERT OVERWRITE DIRECTORY”/ user / cloudera / test123 / t1'SELECT * FROM t1;“
但是,最好的方法是使用oozie的Hive操作来执行此任务,除非您有一些目的,您应该唯一地使用Shell操作。您也可以将上述Hive语句放在oozie的Hive操作中。