【发布时间】:2016-06-28 07:48:22
【问题描述】:
我正在使用 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';"
或打开一个定义了 hivevar 的直线控制台并执行 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 操作的直线调用中的 hivevar 之前。
【问题讨论】:
-
您能否检查 Oozie 控制台,了解哪些参数(连同它们的值)正在传递给您的配置单元脚本并分享?需要此信息来解决此问题。
-
我不确定我是否明白你想要什么。我尝试用更多信息更新问题,希望对您有所帮助。
-
尝试使用“-f”选项(即使用外部文件)而不是“-e”选项(即内联查询执行),看看是否有帮助。 $ beeline -f
-
已经尝试过 -f 选项;从日志中可以看出,好像 hive2 操作正是这样做的。在控制台上看起来不错
0: jdbc:hive2://localhost:10000/default> ALTER TABLE visits ADD PARTITION(dt = '${dt}') LOCATION '${nameNode}/data/parquet/visitors/${path}';但没有添加分区。看起来好像 beeline 没有用传递的 hivevar 替换 ${...}。 -
那么beeline 的选项是打开一个beeline 控制台并在ADVANCE 中定义了hivevar,然后执行该语句——正如你已经尝试过的那样。
标签: hive oozie hortonworks-data-platform parquet beeline