2013-08-22 82 views
2

我正在嘗試通過Oozie運行配置單元操作。我workflow.xml如下:在Oozie中運行Hive操作時出錯

<workflow-app name='edu-apollogrp-dfe' xmlns="uri:oozie:workflow:0.1"> 
    <start to="HiveEvent"/> 
    <action name="HiveEvent"> 
      <hive xmlns="uri:oozie:hive-action:0.2"> 
        <job-tracker>${jobTracker}</job-tracker> 
        <name-node>${nameNode}</name-node> 
        <configuration> 
          <property> 
            <name>oozie.hive.defaults</name> 
            <value>${hiveConfigDefaultXml}</value> 
          </property> 
        </configuration> 
        <script>${hiveQuery}</script> 
        <param>OUTPUT=${StagingDir}</param> 
      </hive> 

      <ok to="end"/> 
      <error to="end"/> 
    </action> 

    <kill name='kill'> 
        <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 
    <end name='end'/> 

這裏是我的job.properties文件:

oozie.wf.application.path=${nameNode}/user/${user.name}/hiveQuery 
oozie.libpath=${nameNode}/user/${user.name}/hiveQuery/lib 
queueName=interactive 

#QA 
nameNode=hdfs://hdfs.bravo.hadoop.apollogrp.edu 
jobTracker=mapred.bravo.hadoop.apollogrp.edu:8021 

# Hive 

hiveConfigDefaultXml=/etc/hive/conf/hive-default.xml 

hiveQuery=hiveQuery.hql 
StagingDir=${nameNode}/user/${user.name}/hiveQuery/Output 

當我運行這個流程,我結束了這個錯誤:

ACTION[[email protected]] Launcher exception: org/apache/hadoop/hive/cli/CliDriver 
java.lang.NoClassDefFoundError: org/apache/hadoop/hive/cli/CliDriver 

Error Code: JA018

Error Message: org/apache/hadoop/hive/cli/CliDriver

我不確定這個錯誤的含義。我哪裏錯了?

編輯

This link說,錯誤代碼JA018是:JA018 is output directory exists error in workflow map-reduce action。但在我的情況下,輸出目錄不存在。這使得它更容易混淆

回答

5

我想出了什麼問題!

類別org/apache/hadoop/hive/cli/CliDriver是執行Hive操作所必需的。從錯誤消息中可以看出這很明顯。這個類在這個jar文件中:hive-cli-0.7.1-cdh3u5.jar。 (在我的情況下,在我的cloudera版本中爲cdh3u5)。

Oozie檢查ShareLib目錄中的這個罐子。該目錄的位置通常在hive-site.xml中配置,屬性名稱爲oozie.service.WorkflowAppService.system.libpath,所以Oozie應該很容易找到該jar。

但在我的情況下,hive-site.xml不包括此屬性,所以Oozie不知道在哪裏尋找這個罐子,因此java.lang.NoClassDefFoundError

爲了解決這個問題,我不得不在我的job.properties文件中包含一個參數,以便指向ShareLib目錄的位置,如下所示: oozie.libpath=${nameNode}/user/oozie/share/lib。 (取決於您的集羣中配置了SharedLib目錄的位置)。

這擺脫了錯誤!