You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pr...@apache.org on 2019/04/12 23:37:28 UTC
[hive] branch master updated: HIVE-21597: WM trigger validation
should happen at the time of create or alter (Prasanth Jayachandran
reviewed by Daniel Dai)
This is an automated email from the ASF dual-hosted git repository.
prasanthj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 079a720 HIVE-21597: WM trigger validation should happen at the time of create or alter (Prasanth Jayachandran reviewed by Daniel Dai)
079a720 is described below
commit 079a7208363e4798d24a54d997d5b0f1cb7cd657
Author: Prasanth Jayachandran <pr...@apache.org>
AuthorDate: Fri Apr 12 16:37:13 2019 -0700
HIVE-21597: WM trigger validation should happen at the time of create or alter (Prasanth Jayachandran reviewed by Daniel Dai)
---
.../org/apache/hadoop/hive/ql/exec/DDLTask.java | 11 +++++++
.../hive/ql/exec/tez/TriggerValidatorRunnable.java | 8 ++++-
ql/src/test/queries/clientpositive/resourceplan.q | 10 ++++--
.../results/clientpositive/llap/resourceplan.q.out | 36 ++++++++++++++--------
.../apache/hive/service/server/KillQueryImpl.java | 4 +--
5 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 7c5a47e..7f0eb40 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -190,6 +190,7 @@ import org.apache.hadoop.hive.ql.security.authorization.plugin.HivePrivilegeObje
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveRoleGrant;
import org.apache.hadoop.hive.ql.security.authorization.plugin.HiveV1Authorizer;
import org.apache.hadoop.hive.ql.session.SessionState;
+import org.apache.hadoop.hive.ql.wm.ExecutionTrigger;
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.hive.serde2.MetadataTypedColumnsetSerDe;
import org.apache.hadoop.hive.serde2.avro.AvroSerdeUtils;
@@ -595,11 +596,21 @@ public class DDLTask extends Task<DDLWork> implements Serializable {
}
private int createWMTrigger(Hive db, CreateWMTriggerDesc desc) throws HiveException {
+ validateTrigger(desc.getTrigger());
db.createWMTrigger(desc.getTrigger());
return 0;
}
+ private void validateTrigger(final WMTrigger trigger) throws HiveException {
+ try {
+ ExecutionTrigger.fromWMTrigger(trigger);
+ } catch (IllegalArgumentException e) {
+ throw new HiveException(e);
+ }
+ }
+
private int alterWMTrigger(Hive db, AlterWMTriggerDesc desc) throws HiveException {
+ validateTrigger(desc.getTrigger());
db.alterWMTrigger(desc.getTrigger());
return 0;
}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
index 670184b..8fb0695 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/tez/TriggerValidatorRunnable.java
@@ -72,10 +72,16 @@ public class TriggerValidatorRunnable implements Runnable {
currentCounterValue);
violatedSessions.put(sessionState, currentTrigger);
LOG.info("KILL trigger replacing MOVE for query {}", queryId);
- } else {
+ } else if (existingTrigger.getAction().getType().equals(Action.Type.MOVE_TO_POOL) &&
+ currentTrigger.getAction().getType().equals(Action.Type.MOVE_TO_POOL)){
// if multiple MOVE happens, only first move will be chosen
LOG.warn("Conflicting MOVE triggers ({} and {}). Choosing the first MOVE trigger: {}",
existingTrigger, currentTrigger, existingTrigger.getName());
+ } else if (existingTrigger.getAction().getType().equals(Action.Type.KILL_QUERY) &&
+ currentTrigger.getAction().getType().equals(Action.Type.KILL_QUERY)){
+ // if multiple KILL happens, only first kill will be chosen
+ LOG.warn("Conflicting KILL triggers ({} and {}). Choosing the first KILL trigger: {}",
+ existingTrigger, currentTrigger, existingTrigger.getName());
}
} else {
// first violation for the session
diff --git a/ql/src/test/queries/clientpositive/resourceplan.q b/ql/src/test/queries/clientpositive/resourceplan.q
index 46aae72..93d848b 100644
--- a/ql/src/test/queries/clientpositive/resourceplan.q
+++ b/ql/src/test/queries/clientpositive/resourceplan.q
@@ -179,11 +179,17 @@ CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME >= '30seconds' DO MOVE TO slow
CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME < '30hour' DO MOVE TO slow_pool;
CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME <= '30min' DO MOVE TO slow_pool;
CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME = '0day' DO MOVE TO slow_pool;
+-- invalid size unit
+CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '10k' DO KILL;
+-- invalid time unit
+CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '10 millis' DO KILL;
+-- invalid long value
+CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '-1000' DO KILL;
CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO slow_pool;
SELECT * FROM SYS.WM_TRIGGERS;
-ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL;
+ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL;
SELECT * FROM SYS.WM_TRIGGERS;
DROP TRIGGER plan_1.trigger_1;
@@ -193,7 +199,7 @@ SELECT * FROM SYS.WM_TRIGGERS;
CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > '100mb' DO MOVE TO null_pool;
-- Add trigger with reserved keywords.
-CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table`;
+CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `default`;
CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO `default`;
CREATE TRIGGER `table`.`database` WHEN BYTES_WRITTEN > "1GB" DO MOVE TO `default`;
CREATE TRIGGER `table`.`trigger1` WHEN ELAPSED_TIME > 10 DO KILL;
diff --git a/ql/src/test/results/clientpositive/llap/resourceplan.q.out b/ql/src/test/results/clientpositive/llap/resourceplan.q.out
index 9ae68f4..c0d6ec2 100644
--- a/ql/src/test/results/clientpositive/llap/resourceplan.q.out
+++ b/ql/src/test/results/clientpositive/llap/resourceplan.q.out
@@ -4059,6 +4059,18 @@ FAILED: ParseException line 2:50 mismatched input '>=' expecting > near 'ELAPSED
FAILED: ParseException line 2:50 mismatched input '<' expecting > near 'ELAPSED_TIME' in comparisionOperator
FAILED: ParseException line 2:50 mismatched input '<=' expecting > near 'ELAPSED_TIME' in comparisionOperator
FAILED: ParseException line 2:50 mismatched input '=' expecting > near 'ELAPSED_TIME' in comparisionOperator
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '10k' DO KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: Invalid size unit k
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '10 millis' DO KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: Invalid time unit millis
+PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN BYTES_READ > '-1000' DO KILL
+PREHOOK: type: CREATE TRIGGER
+PREHOOK: Output: dummyHostnameForTest
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.IllegalArgumentException: Illegal value for counter limit. Expected a positive long value.
PREHOOK: query: CREATE TRIGGER plan_1.trigger_2 WHEN ELAPSED_TIME > '30hour' DO MOVE TO slow_pool
PREHOOK: type: CREATE TRIGGER
PREHOOK: Output: dummyHostnameForTest
@@ -4074,10 +4086,10 @@ POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
plan_1 default trigger_1 BYTES_READ > '10kb' KILL
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
-PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL
+PREHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL
PREHOOK: type: ALTER TRIGGER
PREHOOK: Output: dummyHostnameForTest
-POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1min' DO KILL
+POSTHOOK: query: ALTER TRIGGER plan_1.trigger_1 WHEN BYTES_READ > '1GB' DO KILL
POSTHOOK: type: ALTER TRIGGER
PREHOOK: query: SELECT * FROM SYS.WM_TRIGGERS
PREHOOK: type: QUERY
@@ -4087,7 +4099,7 @@ POSTHOOK: query: SELECT * FROM SYS.WM_TRIGGERS
POSTHOOK: type: QUERY
POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
-plan_1 default trigger_1 BYTES_READ > '1min' KILL
+plan_1 default trigger_1 BYTES_READ > '1GB' KILL
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
PREHOOK: query: DROP TRIGGER plan_1.trigger_1
PREHOOK: type: DROP TRIGGER
@@ -4107,10 +4119,10 @@ PREHOOK: query: CREATE TRIGGER plan_2.trigger_1 WHEN BYTES_READ > '100mb' DO MOV
PREHOOK: type: CREATE TRIGGER
PREHOOK: Output: dummyHostnameForTest
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Resource plan must be disabled to edit it.)
-PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table`
+PREHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `default`
PREHOOK: type: CREATE TRIGGER
PREHOOK: Output: dummyHostnameForTest
-POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `table`
+POSTHOOK: query: CREATE TRIGGER `table`.`table` WHEN BYTES_WRITTEN > '100KB' DO MOVE TO `default`
POSTHOOK: type: CREATE TRIGGER
PREHOOK: query: CREATE TRIGGER `table`.`trigger` WHEN BYTES_WRITTEN > '100MB' DO MOVE TO `default`
PREHOOK: type: CREATE TRIGGER
@@ -4142,7 +4154,7 @@ POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
table default database BYTES_WRITTEN > "1GB" MOVE TO default
-table default table BYTES_WRITTEN > '100KB' MOVE TO table
+table default table BYTES_WRITTEN > '100KB' MOVE TO default
table default trigger BYTES_WRITTEN > '100MB' MOVE TO default
table default trigger1 ELAPSED_TIME > 10 KILL
table default trigger2 ELAPSED_TIME > '1hour' KILL
@@ -4160,7 +4172,7 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
-table default table BYTES_WRITTEN > '100KB' MOVE TO table
+table default table BYTES_WRITTEN > '100KB' MOVE TO default
table default trigger BYTES_WRITTEN > '100MB' MOVE TO default
table default trigger1 ELAPSED_TIME > 10 KILL
table default trigger2 ELAPSED_TIME > '1hour' KILL
@@ -4232,7 +4244,7 @@ POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
plan_2 default trigger_1 BYTES_READ > 0 MOVE TO null_pool
-table default table BYTES_WRITTEN > '100KB' MOVE TO table
+table default table BYTES_WRITTEN > '100KB' MOVE TO default
table default trigger BYTES_WRITTEN > '100MB' MOVE TO default
table default trigger1 ELAPSED_TIME > 10 KILL
table default trigger2 ELAPSED_TIME > '1hour' KILL
@@ -4615,13 +4627,13 @@ POSTHOOK: query: SHOW RESOURCE PLAN `table`
POSTHOOK: type: SHOW RESOURCEPLAN
table[status=DISABLED,parallelism=1,defaultPool=null]
+ table[allocFraction=0.0,schedulingPolicy=fifo,parallelism=1]
- | trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO table }
+ | trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO default }
+ pool[allocFraction=0.9,schedulingPolicy=fair,parallelism=3]
+ child2[allocFraction=0.7,schedulingPolicy=fair,parallelism=3]
| trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
| trigger trigger2: if (ELAPSED_TIME > '1hour') { KILL }
+ child1[allocFraction=0.3,schedulingPolicy=fair,parallelism=1]
- | trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO table }
+ | trigger table: if (BYTES_WRITTEN > '100KB') { MOVE TO default }
| trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
+ <unmanaged queries>
| trigger trigger1: if (ELAPSED_TIME > 10) { KILL }
@@ -4871,7 +4883,7 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: sys@wm_triggers
#### A masked pattern was here ####
plan_1 default trigger_2 ELAPSED_TIME > '30hour' MOVE TO slow_pool
-table default table BYTES_WRITTEN > '100KB' MOVE TO table
+table default table BYTES_WRITTEN > '100KB' MOVE TO default
table default trigger BYTES_WRITTEN > '100MB' MOVE TO default
table default trigger1 ELAPSED_TIME > 10 KILL
table default trigger2 ELAPSED_TIME > '1hour' KILL
@@ -4977,7 +4989,7 @@ plan_4a default trigger_1 BYTES_READ > '10GB' KILL
plan_4a default trigger_2 BYTES_READ > '11GB' KILL
plan_4b default trigger_1 BYTES_READ > '10GB' KILL
plan_4b default trigger_2 BYTES_READ > '11GB' KILL
-table default table BYTES_WRITTEN > '100KB' MOVE TO table
+table default table BYTES_WRITTEN > '100KB' MOVE TO default
table default trigger BYTES_WRITTEN > '100MB' MOVE TO default
table default trigger1 ELAPSED_TIME > 10 KILL
table default trigger2 ELAPSED_TIME > '1hour' KILL
diff --git a/service/src/java/org/apache/hive/service/server/KillQueryImpl.java b/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
index c7f2c91..d9a5033 100644
--- a/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
+++ b/service/src/java/org/apache/hive/service/server/KillQueryImpl.java
@@ -162,7 +162,7 @@ public class KillQueryImpl implements KillQuery {
killChildYarnJobs(conf, queryTag);
} else {
// no privilege to cancel
- throw new HiveSQLException("No privilege");
+ throw new HiveSQLException("No privilege to kill query id");
}
break;
case TAG:
@@ -174,7 +174,7 @@ public class KillQueryImpl implements KillQuery {
}
killChildYarnJobs(conf, queryIdOrTag);
if (numCanceled == 0) {
- throw new HiveSQLException("No privilege");
+ throw new HiveSQLException("No privilege to kill query tag");
}
break;
case UNKNOWN: