2015-11-02 33 views
0

我嘗試通過傳遞hadoop屬性來引用工作流xml文件中的tez jar文件,如下所示,計劃配置單元工作流xml文件在tez模式下運行配置單元腳本。在tez模式下Oozie配置單元腳本調度

  <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> 

此外,我已經改變了蜂巢網站的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模式蜂巢腳本。

回答

0

我之前觀察到上述錯誤,我能夠解決它,並能夠在Oozie上運行Hive(tez引擎)。

下面是我遵循的步驟。


類未找到錯誤:

  1. 由於錯誤說,Oozie的啓動容器找不到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> 

但是,它可能無法做到這一點(不知道爲什麼)

所以,我在HDFS(防爆複製所有TEZ JAR的蜂巢行動的份額圖書館:到/用戶/ Oozie的/股/ LIB/lib_20160405125827 /蜂巢/)。對工作流的oozie配置單元應該使用JAR的路徑並將這些JAR本地化。

雖然這樣做,但確保新JAR的權限與先前JAR在HDFS目錄中的權限相同。 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

現在,如果你發佈蜂巢共享庫,oozie admin -shareliblist hive,你應該能夠查看所有TEZ庫。

通過這些步驟,您不應再看到來自TEZ jar的NoClassDefFoundError或ClassNotFoundException。


缺少Hadoop的相關性:

  • 在這個時候,TEZ工作應提交,但有,你可以在Oozie的發射遇到另一個錯誤。

    14972 [uber-SubtaskRunner] ERROR org.apache.hadoop.hive.ql.exec.Task - 無法執行tez圖形。 org.apache.tez.dag.api.SessionNotRunning:TezSession已經關閉。應用application_1459860815404_0033失敗,原因是AM容器2次appattempt_1459860815404_0033_000002與退出碼退出:1

  • 看着容器日誌,我看到

    異常在線程「主要」 java.lang.NoClassDefFoundError:組織/阿帕奇/ 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引擎上成功運行配置單元腳本。