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 脚本调度的主要内容,如果未能解决你的问题,请参考以下文章

任务调度工具oozie和azkaban的对比

Oozie介绍

使用 hacatalog 在 tez 模式下运行 pig 脚本时出错

oozie的shell-action中加入hive脚本命令启动执行shell同时操作hive,抛异常Container killed on request. Exit code is 143 Cont

hive集群tez引擎执行任务报错

hive集群tez引擎执行任务报错&&telnet Connection refused