Brock Noland created HIVE-4762:
----------------------------------
Summary: HMS cannot handle concurrent requests
Key: HIVE-4762
URL: https://issues.apache.org/jira/browse/HIVE-4762
Project: Hive
Issue Type: Sub-task
Affects Versions: 0.11.0
Reporter: Brock Noland
Assignee: Brock Noland
Fix For: 0.12.0
It appears our use of DataNucleaus is not correct or perhaps there is a bug in
the ancient version of DN we are using. On startup having multiple threads
performing "show tables" results in failures. Additionally concurrent DML will
fail event after startup. I used the program below to demonstrate this.
{noformat}
package org.apache.hadoop.hive.ql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.hive.jdbc.HiveDriver;
public class MultiThreadTest {
public static class QueryRunner implements Runnable {
int id;
double averageElapsedTime;
Connection connection;
Statement statement;
QueryRunner(int id) {
this.id = id;
}
@Override
public void run() {
long count = 0;
double elapsedTime = 0;
try {
connection =
DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "brock",
"password");
statement = connection.createStatement();
// statement.execute("DROP TABLE IF EXISTS t" + id);
for (int i = 0; i < 10; i++) {
// statement.execute("CREATE TABLE t" + id + " (key int)");
long start = System.currentTimeMillis();
// statement.execute("DROP TABLE t" + id);
statement.execute("SHOW TABLES");
elapsedTime += System.currentTimeMillis() - start;
count++;
}
if(statement != null) {
statement.close();
}
if(connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(count > 0) {
averageElapsedTime = elapsedTime / (double)count;
}
}
}
}
public static void main(String[] args) throws Exception {
int numThreads = 50;
Class.forName(HiveDriver.class.getName());
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
QueryRunner[] queryRunners = new QueryRunner[numThreads];
for (int i = 0; i < numThreads; i++) {
queryRunners[i] = new QueryRunner(i);
executor.execute(queryRunners[i]);
}
executor.shutdown();
while(!executor.isTerminated()) {
System.out.println("Waiting...");
Thread.sleep(1000L);
}
for (int i = 0; i < numThreads; i++) {
System.out.println(Math.round(queryRunners[i].averageElapsedTime));
}
}
}
{noformat}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira