aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYin Huai <yhuai@databricks.com>2015-08-25 12:49:50 +0800
committerCheng Lian <lian@databricks.com>2015-08-25 12:50:44 +0800
commitc99f4160b98bc0685c23fee4eb7b892c47f6feda (patch)
treede9914c64845a559f81883bc429246603b97d93b
parent2f7e4b416492ff3c2ea7fcab05b57ed9f0c6e45b (diff)
downloadspark-c99f4160b98bc0685c23fee4eb7b892c47f6feda.tar.gz
spark-c99f4160b98bc0685c23fee4eb7b892c47f6feda.tar.bz2
spark-c99f4160b98bc0685c23fee4eb7b892c47f6feda.zip
[SPARK-10121] [SQL] Thrift server always use the latest class loader provided by the conf of executionHive's state
https://issues.apache.org/jira/browse/SPARK-10121 Looks like the problem is that if we add a jar through another thread, the thread handling the JDBC session will not get the latest classloader. Author: Yin Huai <yhuai@databricks.com> Closes #8368 from yhuai/SPARK-10121. (cherry picked from commit a0c0aae1defe5e1e57704065631d201f8e3f6bac) Signed-off-by: Cheng Lian <lian@databricks.com>
-rw-r--r--sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala6
-rw-r--r--sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2Suites.scala54
2 files changed, 60 insertions, 0 deletions
diff --git a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala
index 833bf62d47..02cc7e5efa 100644
--- a/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala
+++ b/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/SparkExecuteStatementOperation.scala
@@ -159,6 +159,12 @@ private[hive] class SparkExecuteStatementOperation(
// User information is part of the metastore client member in Hive
hiveContext.setSession(currentSqlSession)
+ // Always use the latest class loader provided by executionHive's state.
+ val executionHiveClassLoader =
+ hiveContext.executionHive.state.getConf.getClassLoader
+ sessionHive.getConf.setClassLoader(executionHiveClassLoader)
+ parentSessionState.getConf.setClassLoader(executionHiveClassLoader)
+
Hive.set(sessionHive)
SessionState.setCurrentSessionState(parentSessionState)
try {
diff --git a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2Suites.scala b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2Suites.scala
index ded42bca99..b72249b3bf 100644
--- a/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2Suites.scala
+++ b/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2Suites.scala
@@ -377,6 +377,60 @@ class HiveThriftBinaryServerSuite extends HiveThriftJdbcTest {
rs2.close()
}
}
+
+ test("test add jar") {
+ withMultipleConnectionJdbcStatement(
+ {
+ statement =>
+ val jarFile =
+ "../hive/src/test/resources/hive-hcatalog-core-0.13.1.jar"
+ .split("/")
+ .mkString(File.separator)
+
+ statement.executeQuery(s"ADD JAR $jarFile")
+ },
+
+ {
+ statement =>
+ val queries = Seq(
+ "DROP TABLE IF EXISTS smallKV",
+ "CREATE TABLE smallKV(key INT, val STRING)",
+ s"LOAD DATA LOCAL INPATH '${TestData.smallKv}' OVERWRITE INTO TABLE smallKV",
+ "DROP TABLE IF EXISTS addJar",
+ """CREATE TABLE addJar(key string)
+ |ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
+ """.stripMargin)
+
+ queries.foreach(statement.execute)
+
+ statement.executeQuery(
+ """
+ |INSERT INTO TABLE addJar SELECT 'k1' as key FROM smallKV limit 1
+ """.stripMargin)
+
+ val actualResult =
+ statement.executeQuery("SELECT key FROM addJar")
+ val actualResultBuffer = new collection.mutable.ArrayBuffer[String]()
+ while (actualResult.next()) {
+ actualResultBuffer += actualResult.getString(1)
+ }
+ actualResult.close()
+
+ val expectedResult =
+ statement.executeQuery("SELECT 'k1'")
+ val expectedResultBuffer = new collection.mutable.ArrayBuffer[String]()
+ while (expectedResult.next()) {
+ expectedResultBuffer += expectedResult.getString(1)
+ }
+ expectedResult.close()
+
+ assert(expectedResultBuffer === actualResultBuffer)
+
+ statement.executeQuery("DROP TABLE IF EXISTS addJar")
+ statement.executeQuery("DROP TABLE IF EXISTS smallKV")
+ }
+ )
+ }
}
class HiveThriftHttpServerSuite extends HiveThriftJdbcTest {