如何使用oozie的shell-action编写以在HDFS中创建文件

时间:2016-12-28 16:41:13

标签: cloudera oozie bigdata

我正在调用下面的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}

2 个答案:

答案 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操作中。