gpt4 book ai didi

hadoop - OOZIE:全局作业 xml 中引用的文件中定义的属性在 workflow.xml 中不可见

转载 作者:可可西里 更新时间:2023-11-01 14:25:57 25 4
gpt4 key购买 nike

我是 hadoop 的新手,现在我正在测试仅使用单个 sqoop 操作的简单工作流。如果我使用纯值而不是全局属性,它会起作用。

然而,我的目标是在 job-xml 中引用的文件中定义一些全局属性。全局部分中的标记。

经过长时间的斗争和阅读很多文章,我仍然无法让它工作。我怀疑一些简单的事情出了问题,因为我发现有文章表明此功能可以正常工作。

希望你能给我一个提示。

简而言之:

  1. 我有属性,dbserver , dbuserdbpassword/user/dm/conf/environment.xml 中定义
  2. 我的 /user/dm/jobs/sqoop-test/workflow.xml 中引用了这些属性
  3. 在运行时,我收到一个 EL_ERRORdbserver无法解析变量

详情如下:

我正在使用安装在单个节点上的 Cloudera 5.7.1 发行版。

environment.xml文件已上传到 hdfs 到 /user/dm/conf文件夹。内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>dbserver</name>
<value>someserver</value>
</property>
<property>
<name>dbuser</name>
<value>someuser</value>
</property>
<property>
<name>dbpassword</name>
<value>somepassword</value>
</property>
</configuration>

workflow.xml文件已上传到 /user/dm/jobs/sqoop-test-job .内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.4" name="sqoop-test">
<global>
<job-xml>/user/dm/conf/env.xml</job-xml>
</global>
<start to="get-data"/>
<action name="get-data">
<sqoop xmlns="uri:oozie:sqoop-action:0.3">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${outputRootPath}"/>
</prepare>
<arg>import</arg>
<arg>--connect</arg>
<arg>jdbc:sqlserver://${dbserver};user=${dbuser};password=${dbpassword}</arg>
<arg>--query</arg>
<arg>select col1 from table where $CONDITIONS</arg>
<arg>--split-by</arg>
<arg>main_id</arg>
<arg>--target-dir</arg>
<arg>${outputRootPath}/table</arg>
<arg>-m</arg>
<arg>1</arg>
</sqoop>
<ok to="end"/>
<error to="kill"/>
</action>
<kill name="kill">
<message>Sqoop-test failed, error message[${wf:errorMessage()}]</message>
</kill>
<end name='end'/>
</workflow-app>

现在,我从命令行执行 oozie 工作流:

sudo -u dm oozie job --oozie http://host:11000/oozie -config job-config.xml -run

其中我的job-config.xml如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<property>
<name>nameNode</name>
<value>namenode:8020</value>
</property>
<property>
<name>jobTracker</name>
<value>jobtracker:8021</value>
</property>
<property>
<name>oozie.wf.application.path</name>
<value>/user/dm/jobs/sqoop-test-job/workflow.xml</value>
</property>
<property>
<name>outputRootPath</name>
<value>/user/dm/data/sqoop-test</value>
</property>
</configuration>

最佳答案

好吧,你犯了两个大错误。

1. 让我们从快速解读 Oozie 文档 (V4.2) 的某些部分开始

Workflow Functional Specification

  • 第 19 节是关于全局配置的
  • 包含关于核心操作类型(即 MapReduce、Pig、Java 等)的 3.2.x 部分。
  • XML 模式规范清楚地显示了 <global>元素

Sqoop action Extension

  • 没有提及全局参数
  • 有自己的 XML 架构规范,该规范按照自己的节奏发展,并且不是与工作流架构同步的

换句话说:Sqoop 操作是一个插件 就 Oozie 服务器而言。它不支持 100% 的“较新”功能,包括 <global>工作流模式 V0.4 中引入的东西


2. 您不了解属性参数 之间的区别——我不怪您,Oozie 文档很困惑而且令人困惑。

参数Oozie用于在属性、命令等中运行文本替换。您将它们的值定义为文字,或者在提交时使用 -config参数,或在 <parameters>工作流级别的元素。我所说的“字面意思”是指您不能在另一个参数中引用一个参数。该值只是不可变的文本,按原样使用。

Properties传递给 Oozie 启动的作业的 Java 属性。您可以在提交时使用 -config 设置它们argument -- 是的,这是一团糟,Oozie 解析器必须找出哪些参数具有众所周知的属性名称,哪些只是参数 -- 或者在 <global> 中工作流元素 -- 但它们不会在所有“扩展”中传播,因为您已经发现了困难的方法 -- 或在 <property> 中使用 <job-xml> 定义的操作元素或在 XML 文件中元素,在全局工作流级别或本地操作级别。

需要注意两点:

  • properties 被多个(冲突的)值定义多次时,必须有一个优先规则,但我不太确定
  • properties 在 Oozie 中显式定义,可以使用 parameters 和 EL 函数动态定义它们的值;但 属性 定义在 <job-xml> 中文件必须是文字,因为 Oozie 无法访问它们(它只是在运行时将文件内容传递给 Hadoop Configuration 构造函数)

这对你意味着什么?那么,您的脚本告诉 Oozie 在运行时通过 <job-xml> 将“隐藏”属性 传递给运行 Sqoop 作业的 JVM。 .
但是您期望 Oozie 解析一个参数 列表并在编译时使用它们来定义一些属性。那不会发生。

关于hadoop - OOZIE:全局作业 xml 中引用的文件中定义的属性在 workflow.xml 中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38337362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com