0

HPD-2.4.2 を使用しており、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 を直接呼び出してみました。

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 アクションからの beeline 呼び出しで hivevars として設定される前。

4

2 に答える 2

0

あなたの助けに感謝しますが、私はあきらめます。hive2 アクションの代わりに、ssh アクションを使用して、静的な変更ステートメントで beeline を実行します。

<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>
于 2016-07-04T08:32:06.050 に答える
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  |
+------+--+ 
于 2016-07-11T08:06:32.910 に答える