Cloudera 如何使用oozie的shell操作进行写操作以在HDFS中创建文件
我调用下面的shell操作来调用将输出写入文件的shell脚本。 我在IBMBigInsight和Cloudera上都尝试过这一点,但每当我尝试在HDFS中写入新文件时,作业就会失败 我查看了应用程序/作业id日志,但没有任何信息。 从shell脚本写入hdfs有任何限制 --sample.sh--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
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>