0

我尝试通过传递 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 脚本。

4

1 回答 1

0

我之前观察到了上述错误,我能够解决它并且能够在 Oozie 上运行 Hive(tez 引擎)。

这是我遵循的步骤。


找不到类错误:

  1. 正如错误所说,Oozie Launcher 容器找不到SessionNotRunning该类。

这个类是 tez-api-0.xxjar 的一部分。您可以确认使用:

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 依赖项:

  1. 此时,应该提交 TEZ 作业,但是您可能会在 OOZIE 启动器上遇到另一个错误。

    14972 [uber-SubtaskRunner] 错误 org.apache.hadoop.hive.ql.exec.Task - 无法执行 tez 图。org.apache.tez.dag.api.SessionNotRunning:TezSession 已经关闭。应用程序 application_1459860815404_0033 由于 AM Container for appattempt_1459860815404_0033_000002 退出 2 次,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 引擎上成功运行配置单元脚本。

于 2016-04-06T13:43:11.027 回答