无法从 Oozie 工作流作业的第二次运行启动 Hive 操作

Posted

技术标签:

【中文标题】无法从 Oozie 工作流作业的第二次运行启动 Hive 操作【英文标题】:Unable to Start Hive Action from Second Run of Oozie Workflow Job 【发布时间】:2015-02-02 09:50:18 【问题描述】:

从 Second Workflow Job Run 从 Oozie 运行 Hive Action 时遇到一点问题。 在 Worfklow 的第一次运行中,作业在 Pig 和 Hive Action 上运行良好,但是每当作业要在其第二个实例上运行时,在预定的时间,相同的作业就会失败,并且 Hive 异常表示无法访问元存储德比。 不确定哪个 Jar 正在检查 Derby,在哪里使用 Oracle,并且在 hive-site.xml、hive-default.xml 中更新相同

如果作业在杀死前一个实例后重新开始,则同样会按预期完成。

使用 Hive0.9 和 Oozie 3.3.0,Metastore 使用 Oracle 已更新 HDFS 中的 hive-site.xml、hive-default.xml、oozie-user-hive-default.xml 以及 DFS Oozie 的本地和共享位置,但仍然无法正常工作。

我的工作流程如下:

<action name="hiveForUploadData">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>$jobTracker</job-tracker>
<name-node>$nameNode</name-node>
<configuration>
<property>
<name>oozie.launcher.mapred.job.queue.name</name>
<value>default</value>
</property>
<property>
<name>oozie.hive.defaults</name>
<value>$namenode/user/hive-default/hive-default.xml</value> -- have tried with hive-site.xml & oozie-user-hive-default.xml as well 
</property>
</configuration>
<script>UploadScripts.q</script>
<param>inputfile_name=/user/input/table/filename</param>
</hive>
<ok to="end"/>
<error to="error"/>
</action>
<kill name="error">
<message>Hive Action Failed, error message[$wf:errorMessage(wf:lastErrorNode())]</message>
</kill>

第一次运行成功,运行良好 Oracle Meta Store 也得到更新 第二次运行获取失败:无法访问元存储 derby 1836 [main] 信息 hive.ql.parse.ParseDriver - 解析完成 1959 [main] INFO org.apache.hadoop.hive.metastore.HiveMetaStore - 0:使用实现类打开原始存储:org.apache.hadoop.hive.metastore.ObjectStore 1985 [main] INFO org.apache.hadoop.hive.metastore.ObjectStore - ObjectStore,初始化调用 2278 [main] 错误 DataNucleus.Plugin - 捆绑包“org.eclipse.jdt.core”需要“org.eclipse.core.resources”,但无法解决。 2278 [main] 错误 DataNucleus.Plugin - 捆绑包“org.eclipse.jdt.core”需要“org.eclipse.core.runtime”,但无法解决。 2278 [main] 错误 DataNucleus.Plugin - 捆绑包“org.eclipse.jdt.core”需要“org.eclipse.text”,但无法解决。 2420 [main] INFO DataNucleus.Persistence - 属性 datanucleus.cache.level2 未知 - 将被忽略 2421 [main] INFO DataNucleus.Persistence - 属性 javax.jdo.option.NonTransactionalRead 未知 - 将被忽略 2421 [main] INFO DataNucleus.Persistence - ================== 持久性配置 =============== 2426 [main] INFO DataNucleus.Persistence - DataNucleus 持久性工厂 - 供应商:“DataNucleus”版本:“2.0.3” 2426 [main] INFO DataNucleus.Persistence - DataNucleus Persistence Factory 已为数据存储区初始化 URL="jdbc:derby:;databaseName=metastore_db;create=true" driver="org.apache.derby.jdbc.EmbeddedDriver" userName="APP" 2426 [主要] INFO DataNucleus.Persistence - ========================================== =================== 8704 [main] INFO DataNucleus.Datastore.Schema - 使用“无”自动启动选项初始化目录“”,模式“APP” 8704 [main] INFO DataNucleus.Datastore.Schema - 目录“”,模式“APP”已初始化 - 管理 0 个类 8795 [main] INFO org.apache.hadoop.hive.metastore.ObjectStore - 使用 hive.metastore.cache.pinobjtypes="Table,StorageDescriptor,SerDeInfo,Partition,Database,Type,FieldSchema,Order" 设置 MetaStore 对象 pin 类 8832 [main] INFO DataNucleus.MetaData - 为元数据初始化注册监听器 8858 [main] INFO org.apache.hadoop.hive.metastore.ObjectStore - 已初始化 ObjectStore

我不确定为什么 Oozie 没有读取用户定义的“hive-default.xml”,并且从 Some Jar 中读取也是如此,不确定它正在使用哪个 Jar。 还有为什么/如何每次第一次运行新的 Oozie 工作都获得成功,从第二次运行开始,工作无法读取相同的内容。 你们能帮我找出丢失的地方或需要更新的地方吗

【问题讨论】:

【参考方案1】:

你需要在&lt;configuration&gt;标签上方插入:

<job-xml>[HIVE SETTINGS FILE]</job-xml>

其中[HIVE SETTINGS FILE] 是最常称为hive-site.xml 的文件。这将使您的 Hive 脚本能够连接到元存储。

【讨论】:

错过了提及,也尝试过使用 job-xml 参数,但同样失败,出现异常,例如“JA010: Property [mapred.job.tracker] not allowed in action [job-xml ] 配置”。工作流程中需要任何更正??? 又发现了一个不匹配的地方,我在其中设置了诸如 datanucleus.autoCreateSchema=false datanucleus.autoCreateTables=true datanucleus.fixedDatastore=true 之类的变量,第一次运行时 Hive 操作正在检查该变量,但是在第二次运行同样没有被检查【参考方案2】:

将 OJDBC 驱动程序放在 HDFS 的共享 Lib 位置后,该问题得到解决。

上述 Jar 在 Oozie Shared Location 中不可用,因为 Derby Jar 可用,所以 Oozie 试图为 Hive-MetaStore 连接 Derby。默认情况下。

【讨论】:

以上是关于无法从 Oozie 工作流作业的第二次运行启动 Hive 操作的主要内容,如果未能解决你的问题,请参考以下文章

Oozie 工作流配置单元操作卡在 RUNNING 中

使用 Oozie 永久运行 Sqoop 作业

杀死协调员后如何让 oozie 工作流程运行?

Oozie Sqoop 工作

Oozie Sqoop 作业 - 无法恢复作业

管理 Hadoop 作业的工作流调度系统——Oozie