Oozie hive脚本在tez模式下安排

时间:2015-11-02 07:26:58

标签: hive bigdata oozie apache-tez

我尝试安排hive工作流xml文件以tez模式运行hive脚本,方法是传递hadoop属性以引用工作流xml文件中的tez jar文件,如下所示。

            <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模式运行配置单元脚本。

1 个答案:

答案 0 :(得分:0)

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

这是我遵循的步骤。

未找到类错误:

  1. 如错误所示,Oozie Launcher容器找不到SessionNotRunning类。
  2. 此类是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罐子的NoClassDefFoundError或ClassNotFoundException。

    缺少Hadoop依赖关系:

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

      14972 [uber-SubtaskRunner] ERROR org.apache.hadoop.hive.ql.exec.Task - 无法执行tez图。 org.apache.tez.dag.api.SessionNotRunning:TezSession已经关闭。应用程序application_1459860815404_0033失败2次,因为AM容器为appattempt_1459860815404_0033_000002退出,退出时使用exitCode:1

    2. 查看容器日志,我看到了

      线程中的异常&#34; main&#34; 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

      因此,您需要告诉TEZ在workflow.xml中使用以下属性来使用群集的hadoop库。

                               <property>
                                    <name>tez.use.cluster.hadoop-libs</name>
                                    <value>true</value>
                               </property>
      

      因此,通过上述步骤,我能够通过Oozie在TEZ引擎上成功运行配置单元脚本。