Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cloudera 如何使用oozie的shell操作进行写操作以在HDFS中创建文件_Cloudera_Oozie_Bigdata - Fatal编程技术网

Cloudera 如何使用oozie的shell操作进行写操作以在HDFS中创建文件

Cloudera 如何使用oozie的shell操作进行写操作以在HDFS中创建文件,cloudera,oozie,bigdata,Cloudera,Oozie,Bigdata,我调用下面的shell操作来调用将输出写入文件的shell脚本。 我在IBMBigInsight和Cloudera上都尝试过这一点,但每当我尝试在HDFS中写入新文件时,作业就会失败 我查看了应用程序/作业id日志,但没有任何信息。 从shell脚本写入hdfs有任何限制 --sample.sh-- hive -e "create t1(id int); insert into t1 values(1);" hive -e "select * from t1;" > /user/cloud

我调用下面的shell操作来调用将输出写入文件的shell脚本。 我在IBMBigInsight和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>

Oozie shell操作不适用于配置单元操作。这里您需要使用Oozie配置单元操作。要使用Oozie配置单元操作,您需要准备.sql文件,将所有配置单元查询放在其中,然后需要使用Oozie工作流进行计划

有关Oozie配置单元操作,请参见下面的示例workflow.xml

<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>
有关更多信息,请访问

这里的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身份验证,则删除节和/user/${userName}/${userName}.keytab${userName}.keytab

然后替换以获取有关身份验证的更多信息

这里的hive-site.xml是站点xml应该出现在$hive_HOME/conf文件夹中。
hive_jobs.sql文件包含实际的配置单元查询。i、 e.使用db_名称;在您的代码版本中,当您引用“/user/cloudera/test123/t1_data.txt”时,oozie会在正在执行的数据节点上查找本地FS路径,但可能找不到它

您可以使用以下代码从配置单元表写入HDFS目录:

配置单元-e插入覆盖目录“/user/cloudera/test123/t1”选择 *从t1开始


但是,最好的方法是使用oozie的Hive操作来完成这项任务,除非您有明确的目的,只使用Shell操作。您也可以将上述配置单元语句放在oozie的配置单元操作中。

hi Deepak,感谢您的帮助。.实际上我尝试了上述操作,但问题是我需要将文件内容作为另一个配置单元查询的参数引用。。。我需要从上面的while中读取文本,并将其用作sqoop import select*from xyz_表中的参数,其中date_time=${date_time}还有$CONDITION…有没有一种方法我可以从Oozie运行的shell脚本创建/删除一段时间…这是我在论坛上提出的相关问题谢谢Sandeep的详细解释…我真的很感谢你的帮助…有没有一种方法我可以从Oozie运行的shell操作节点的shell脚本创建一个文件。。。这是我在论坛上提出的问题…是的,您可以从Oozie shell action在HDFS上创建、删除文件或目录。您需要在workflow.xml中提供脚本的完整HDFS路径。如果您无法这样做,请检查该位置的权限。
<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>