2016-06-28 103 views
0

我正在使用HPD-2.4.2並嘗試使用Oozie協調器作業向外部Hive表添加分區。 我創建了一個協調者,每天跳跳虎以下工作流程:使用Oozie添加Hive分區

<workflow-app name="addPartition" xmlns="uri:oozie:workflow:0.4"> 
    <start to="hive"/> 
    <action name="hive"> 
    <hive2 xmlns="uri:oozie:hive2-action:0.1"> 
    <job-tracker>${jobTracker}</job-tracker> 
    <name-node>${nameNode}</name-node> 
    <jdbc-url>jdbc:hive2://${jdbcPath}</jdbc-url> 
    <password>yarn</password> 
    <script>${appPath}/addPartition.q</script> 
    <param>nameNode=${nameNode}</param> 
    <param>dt=${dt}</param> 
    <param>path=${path}</param> 
    </hive2> 
    <ok to="end" /> 
    <error to="fail" /> 
    </action> 
    <kill name="fail"> 
    <message> 
    Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}] 
    </message> 
    </kill> 
    <end name="end" /> 
</workflow-app> 

的執行腳本包含

CREATE EXTERNAL TABLE IF NOT EXISTS visits (sid BIGINT, os STRING, browser STRING, visit_time TIMESTAMP) 
    PARTITIONED BY (dt STRING) 
    STORED AS PARQUET; 

ALTER TABLE visits ADD PARTITION(dt = '${dt}') LOCATION '${nameNode}/data/parquet/visitors/${path}'; 

如果我運行創建表的工作,但不加分。 在紗線日誌我發現:

Beeline command arguments : 
     -u 
     jdbc:hive2://localhost:10000/default 
     -n 
     yarn 
     -p 
     yarn 
     -d 
     org.apache.hive.jdbc.HiveDriver 
     --hivevar 
     nameNode=hdfs://bigdata01.local:8020 
     --hivevar 
     dt=2016-01-05 
     --hivevar 
     path=2016/01/05 
     -f 
     addPartition.q 
     -a 
     delegationToken 
     --hiveconf 
     mapreduce.job.tags=oozie-1b3b2ee664df7ac9ee436379d784955a 

Fetching child yarn jobs 
tag id : oozie-1b3b2ee664df7ac9ee436379d784955a 
Child yarn jobs are found - 
================================================================= 

>>> Invoking Beeline command line now >>> 
[...] 
0: jdbc:hive2://localhost:10000/default> ALTER TABLE visits ADD PARTITION(dt = '${dt}') LOCATION '${nameNode}/data/parquet/visitors/${path}'; 

它看起來彷彿是在ALTER TABLE參數沒有更換,檢查這個我試圖直接從CLI撥打直線:

beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver --hivevar nameNode=hdfs://bigdata01.local:8020 --hivevar dt="2016-01-03" --hivevar path="2016/01/03" -e "ALTER TABLE visits ADD PARTITION(dt='${dt}') LOCATION '${nameNode}/data/parquet/visitors/${path}';" 

導致在一個錯誤:

Connecting to jdbc:hive2://localhost:10000/default 
Connected to: Apache Hive (version 1.2.1000.2.4.2.0-258) 
Driver: Hive JDBC (version 1.2.1000.2.4.2.0-258) 
Transaction isolation: TRANSACTION_REPEATABLE_READ 
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. partition spec is invalid; field dt does not exist or is empty (state=08S01,code=1) 

,如果我跑不帶參數的ALTER語句

beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver -e "ALTER TABLE visits ADD PARTITION(dt='2016-01-03') LOCATION 'hdfs://bigdata01.local:8020/data/parquet/visitors/2016/01/03';" 

或打開與定義hivevars直奔控制檯和執行ALTER語句

beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver --hivevar nameNode=hdfs://bigdata01.local:8020 --hivevar dt="2016-01-03" --hivevar path="2016/01/03" 
0: jdbc:hive2://localhost:10000/default> ALTER TABLE visits ADD PARTITION(dt = '${dt}') LOCATION '${nameNode}/data/parquet/visitors/${path}'; 

創建分區。

我在哪裏錯了?

更新:

在hive2行動的參數值在oozie.properties文件和coordinator.xml

<property> 
    <name>nameNode</name> 
    <value>${nameNode}</value> 
</property> 
<property> 
<name>dt</name>     
<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1,'DAY'),'yyyy-MM-dd')}</value> 
</property> 
<property> 
    <name>path</name>      
    <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1,'DAY'),'yyyy/MM/dd')}</value> 
</property> 

紗線登錄定義你發現

Parameters: 
------------------------ 
nameNode=hdfs://bigdata01.local:8020 
dt=2016-01-05 
path=2016/01/05 

將它們設置爲來自hive2操作的直線調用中的hivevars之前。

+0

能否請你檢查了Oozie控制檯,以什麼參數(連同它們的值)被傳遞到您的蜂巢腳本和共享呢?需要此信息才能解決此問題。 – janeshs

+0

我不知道我是否明白你想要什麼。我嘗試用更多的信息來更新這個問題,希望它有所幫助。 –

+0

嘗試使用「-f」選項(即使用外部文件)而不是「-e」選項(即內聯查詢執行)並查看是否有幫助。 $直線-f <查詢文件名> – janeshs

回答

0

終於找到了問題。你必須使用雙引號,而不是單引號;-)

$ beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver --hivevar foo=bar -e "SELECT '${foo}' as foo;  

+------+--+ 
| foo | 
+------+--+ 
|  | 
+------+--+ 

beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver --hivevar foo=bar -e 'SELECT "${foo}" as foo;' 

+------+--+ 
| foo | 
+------+--+ 
| bar | 
+------+--+ 

beeline -u jdbc:hive2://localhost:10000/default -n yarn -p yarn -d org.apache.hive.jdbc.HiveDriver --hivevar foo=bar -f selectFoo.q 

+------+--+ 
| foo | 
+------+--+ 
| bar | 
+------+--+ 
0

感謝您的幫助,但我放棄了。而不是一個hive2行動,我會用一個ssh動作來執行一條靜態的alter語句的直線。

<ssh xmlns="uri:oozie:ssh-action:0.1"> 
    <host>${sshUser}@${sshHost}</host> 
    <command>"beeline"</command> 
    <args>-u</args> 
    <args>jdbc:hive2://localhost:10000/default</args> 
    <args>-n</args> 
    <args>yarn</args> 
    <args>-p</args> 
    <args>yarn</args> 
    <args>-d</args> 
    <args>org.apache.hive.jdbc.HiveDriver</args> 
    <args>-e</args> 
    <args>"ALTER TABLE visits ADD PARTITION(dt='${dt}') LOCATION '${nameNode}/data/raw/parquet/visitors/${path}';"</args> 
    <capture-output /> 
</ssh> 
+0

SSH操作?你的意思是殼牌的行動,對吧? –

+0

在我的設置中,右鍵,shell操作會更容易。 –