我尝试安排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模式运行配置单元脚本。
答案 0 :(得分:0)
我之前观察到上述错误,我能够解决它,并能够在Oozie上运行Hive(tez引擎)。
这是我遵循的步骤。
未找到类错误:
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罐子的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失败2次,因为AM容器为appattempt_1459860815404_0033_000002退出,退出时使用exitCode:1
查看容器日志,我看到了
线程中的异常&#34; main&#34; java.lang.NoClassDefFoundError:org / apache / hadoop / service / AbstractService 引起:java.lang.ClassNotFoundException:org.apache.hadoop.service.AbstractService
这是因为我的TEZ安装很少,并且没有hadoop依赖。
因此,您需要告诉TEZ在workflow.xml中使用以下属性来使用群集的hadoop库。
<property>
<name>tez.use.cluster.hadoop-libs</name>
<value>true</value>
</property>
因此,通过上述步骤,我能够通过Oozie在TEZ引擎上成功运行配置单元脚本。