diff --git a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java index bcc66cf..50fb09e 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/HiveCommandOperation.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; +import org.apache.commons.lang3.CharEncoding; import org.apache.hadoop.hive.metastore.api.Schema; import org.apache.hadoop.hive.ql.processors.CommandProcessor; import org.apache.hadoop.hive.ql.processors.CommandProcessorResponse; @@ -56,7 +57,6 @@ */ private BufferedReader resultReader; - protected HiveCommandOperation(HiveSession parentSession, String statement, CommandProcessor commandProcessor, Map confOverlay) { super(parentSession, statement, confOverlay, false); @@ -69,16 +69,16 @@ private void setupSessionIO(SessionState sessionState) { LOG.info("Putting temp output to file " + sessionState.getTmpOutputFile().toString()); sessionState.in = null; // hive server's session input stream is not used // open a per-session file in auto-flush mode for writing temp results - sessionState.out = new PrintStream(new FileOutputStream(sessionState.getTmpOutputFile()), true, "UTF-8"); + sessionState.out = new PrintStream(new FileOutputStream(sessionState.getTmpOutputFile()), true, CharEncoding.UTF_8); // TODO: for hadoop jobs, progress is printed out to session.err, // we should find a way to feed back job progress to client - sessionState.err = new PrintStream(System.err, true, "UTF-8"); + sessionState.err = new PrintStream(System.err, true, CharEncoding.UTF_8); } catch (IOException e) { LOG.error("Error in creating temp output file ", e); try { sessionState.in = null; - sessionState.out = new PrintStream(System.out, true, "UTF-8"); - sessionState.err = new PrintStream(System.err, true, "UTF-8"); + sessionState.out = new PrintStream(System.out, true, CharEncoding.UTF_8); + sessionState.err = new PrintStream(System.err, true, CharEncoding.UTF_8); } catch (UnsupportedEncodingException ee) { LOG.error("Error creating PrintStream", e); ee.printStackTrace(); @@ -88,12 +88,6 @@ private void setupSessionIO(SessionState sessionState) { } } - - private void tearDownSessionIO() { - IOUtils.cleanup(LOG, parentSession.getSessionState().out); - IOUtils.cleanup(LOG, parentSession.getSessionState().err); - } - @Override public void runInternal() throws HiveSQLException { setState(OperationState.RUNNING); @@ -131,7 +125,6 @@ public void runInternal() throws HiveSQLException { @Override public void close() throws HiveSQLException { setState(OperationState.CLOSED); - tearDownSessionIO(); cleanTmpFile(); cleanupOperationLog(); } diff --git a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java index cc9df76..afbbb0b 100644 --- a/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java +++ b/service/src/java/org/apache/hive/service/cli/operation/SQLOperation.java @@ -18,7 +18,10 @@ package org.apache.hive.service.cli.operation; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.PrintStream; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.security.PrivilegedExceptionAction; @@ -31,6 +34,8 @@ import java.util.concurrent.RejectedExecutionException; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.CharEncoding; +import org.apache.hadoop.hive.common.io.CachingPrintStream; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.Schema; @@ -80,8 +85,24 @@ public SQLOperation(HiveSession parentSession, String statement, Map confOverlay, boolean runInBackground) { // TODO: call setRemoteUser in ExecuteStatementOperation or higher. super(parentSession, statement, confOverlay, runInBackground); + setupSessionIO(parentSession.getSessionState()); } + private void setupSessionIO(SessionState sessionState) { + try { + sessionState.in = null; // hive server's session input stream is not used + sessionState.out = new PrintStream(System.out, true, CharEncoding.UTF_8); + sessionState.info = new PrintStream(System.err, true, CharEncoding.UTF_8); + sessionState.err = new CachingPrintStream(System.err, true, CharEncoding.UTF_8); + } catch (FileNotFoundException | UnsupportedEncodingException e) { + LOG.error("Error creating PrintStream", e); + e.printStackTrace(); + sessionState.out = null; + sessionState.info = null; + sessionState.err = null; + } + } + /*** * Compile the query and extract metadata * @param sqlOperationConf