tez 模式下的 Oozie hive 脚本调度
Posted
技术标签:
【中文标题】tez 模式下的 Oozie hive 脚本调度【英文标题】:Oozie hive script scheduling in tez mode 【发布时间】:2015-11-02 07:26:58 【问题描述】:我尝试通过传递 hadoop 属性以在工作流 xml 文件中引用 tez jar 文件来安排 hive 工作流 xml 文件以在 tez 模式下运行 hive 脚本,如下所示。
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>$jobTracker</job-tracker>
<name-node>$nameNode</name-node>
<job-xml>hive-site.xml</job-xml>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>$queueName</value>
</property>
<property>
<name>tez.lib.uris</name>
<value>$nameNode/apps/Tez/,$nameNode/apps/Tez/lib/</value>
</property>
</configuration>
我还将 hive-site xml 文件属性 hive.execution.engine 更改为 tez 模式。
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
当我使用 oozie 安排工作流程时。我得到如下错误
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.HiveMain], main() threw exception, org/apache/tez/dag/api/SessionNotRunning
java.lang.NoClassDefFoundError: org/apache/tez/dag/api/SessionNotRunning
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:479)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:680)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:624)
at org.apache.oozie.action.hadoop.HiveMain.runHive(HiveMain.java:306)
at org.apache.oozie.action.hadoop.HiveMain.run(HiveMain.java:290)
at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:47)
at org.apache.oozie.action.hadoop.HiveMain.main(HiveMain.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:236)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:430)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runSubtask(LocalContainerLauncher.java:370)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runTask(LocalContainerLauncher.java:295)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.access$200(LocalContainerLauncher.java:181)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler$1.run(LocalContainerLauncher.java:224)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassNotFoundException: org.apache.tez.dag.api.SessionNotRunning
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 24 more
谁能告诉我如何纠正这个问题并安排我的工作流 xml 文件并在 tez 模式下运行 hive 脚本。
【问题讨论】:
【参考方案1】:我之前观察到上述错误,我能够解决它并能够在 Oozie 上运行 Hive(tez 引擎)。
这是我遵循的步骤。
找不到类错误:
-
正如错误所说,Oozie Launcher 容器找不到
SessionNotRunning
类。
这个类是 tez-api-0.x.x.jar 的一部分。您可以确认使用:
jar tvf /usr/lib/tez/tez-api-0.7.0.jar | grep SessionNotRunning
您需要确保您的 Oozie 启动器容器(即 YARN)本地化此和其他 TEZ JAR,以便将其传递给 HiveClient。
期望如果我们在 workflow.xml 中包含以下配置属性,oozie 应该会获取所有这些 JAR。
<property>
<name>tez.lib.uris</name>
<value>hdfs:///apps/tez/,hdfs:///apps/tez/lib/</value>
</property>
但是,它可能不会那样做。(不知道为什么)
所以,我将所有 TEZ JAR 复制到 HDFS 中 Hive-action 的共享库(例如:到 /user/oozie/share/lib/lib_20160405125827/hive/)。工作流上的 oozie hive-action 应该使用该路径中存在的 JAR 并本地化这些 JAR。
在执行此操作时,请确保新 JAR 具有与该 HDFS 目录中先前 JAR 相同的权限。 Oozie 还需要刷新共享库。
示例命令可以是:
hadoop fs -copyFromLocal /usr/lib/tez/*.jar /user/oozie/share/lib/lib_20160405125827/hive/
hadoop fs -copyFromLocal /usr/lib/tez/lib/*.jar /user/oozie/share/lib/lib_20160405125827/hive/
hadoop fs -chown oozie:oozie /user/oozie/share/lib/lib_20160405125827/hive/*.jar
oozie admin -sharelibupdate
现在,如果您列出您的 hive 共享库 oozie admin -shareliblist hive
,您应该能够看到所有 TEZ 库。
通过这些步骤,您应该不会再看到 TEZ jar 中的 NoClassDefFoundError 或 ClassNotFoundException。
缺少 Hadoop 依赖项:
此时,应该提交 TEZ 作业,但您可能会在 OOZIE 启动器上遇到另一个错误。
14972 [uber-SubtaskRunner] 错误 org.apache.hadoop.hive.ql.exec.Task - 无法执行 tez 图。 org.apache.tez.dag.api.SessionNotRunning:TezSession 已经关闭。应用程序 application_1459860815404_0033 失败 2 次,原因是用于 appattempt_1459860815404_0033_000002 的 AM 容器退出,exitCode:1
查看容器日志,我明白了
线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/hadoop/service/AbstractService 引起:java.lang.ClassNotFoundException: org.apache.hadoop.service.AbstractService
这是因为我的 TEZ 安装是最小的并且没有附带 hadoop 依赖项。
https://github.com/apache/tez/blob/release-0.7.0/docs/src/site/markdown/install.md#hadoop-installation-dependent-installdeploy-instructions
因此,您需要使用 workflow.xml 中的以下属性告诉 TEZ 使用集群的 hadoop 库。
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
因此,通过上述步骤,我能够通过 Oozie 在 TEZ 引擎上成功运行配置单元脚本。
【讨论】:
以上是关于tez 模式下的 Oozie hive 脚本调度的主要内容,如果未能解决你的问题,请参考以下文章
使用 hacatalog 在 tez 模式下运行 pig 脚本时出错
oozie的shell-action中加入hive脚本命令启动执行shell同时操作hive,抛异常Container killed on request. Exit code is 143 Cont