hive-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Szehon Ho (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HIVE-6050) JDBC backward compatibility is broken
Date Wed, 18 Dec 2013 02:15:07 GMT

    [ https://issues.apache.org/jira/browse/HIVE-6050?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13851276#comment-13851276
] 

Szehon Ho commented on HIVE-6050:
---------------------------------

As another note, the issue also exists for the other way (connecting Hive 0.10 driver with
Hive 0.13 server).

Exception is almost same, except this time client complains about the serverProtocolVersion.

{noformat}
"Could not establish connection to jdbc:hive2://localhost:10000: Required field &apos;serverProtocolVersion&apos;
is unset! Struct:TOpenSessionResp(status:TStatus(statusCode:SUCCESS_STATUS), serverProtocolVersion:null,
sessionHandle:TSessionHandle(sessionId:THandleIdentifier(guid:29 3C D5 F4 B0 DB 49 48 86 0D
16 2B 42 D5 76 49, secret:B5 33 C6 D3 4B CF 4E 58 AE 0B DD DC 7F 71 AD AD)), configuration:{})"
type="java.sql.SQLException">java.sql.SQLException: Could not establish connection to jdbc:hive2://localhost:10000:
Required field &apos;serverProtocolVersion&apos; is unset! Struct:TOpenSessionResp(status:TStatus(statusCode:SUCCESS_STATUS),
serverProtocolVersion:null, sessionHandle:TSessionHandle(sessionId:THandleIdentifier(guid:29
3C D5 F4 B0 DB 49 48 86 0D 16 2B 42 D5 76 49, secret:B5 33 C6 D3 4B CF 4E 58 AE 0B DD DC 7F
71 AD AD)), configuration:{})
	at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:262)
	at org.apache.hive.jdbc.HiveConnection.&lt;init&gt;(HiveConnection.java:133)
	at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:106)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:185)
	at org.apache.hive.jdbc.MyTestJdbcDriver2.getConnection(MyTestJdbcDriver2.java:73)
	at org.apache.hive.jdbc.MyTestJdbcDriver2.&lt;init&gt;(MyTestJdbcDriver2.java:49)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187)
	at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:233)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
	at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
	at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
Caused by: org.apache.thrift.protocol.TProtocolException: Required field &apos;serverProtocolVersion&apos;
is unset! Struct:TOpenSessionResp(status:TStatus(statusCode:SUCCESS_STATUS), serverProtocolVersion:null,
sessionHandle:TSessionHandle(sessionId:THandleIdentifier(guid:29 3C D5 F4 B0 DB 49 48 86 0D
16 2B 42 D5 76 49, secret:B5 33 C6 D3 4B CF 4E 58 AE 0B DD DC 7F 71 AD AD)), configuration:{})
	at org.apache.hive.service.cli.thrift.TOpenSessionResp.validate(TOpenSessionResp.java:578)
	at org.apache.hive.service.cli.thrift.TOpenSessionResp$TOpenSessionRespStandardScheme.read(TOpenSessionResp.java:676)
	at org.apache.hive.service.cli.thrift.TOpenSessionResp$TOpenSessionRespStandardScheme.read(TOpenSessionResp.java:612)
	at org.apache.hive.service.cli.thrift.TOpenSessionResp.read(TOpenSessionResp.java:520)
	at org.apache.hive.service.cli.thrift.TCLIService$OpenSession_result$OpenSession_resultStandardScheme.read(TCLIService.java:2361)
	at org.apache.hive.service.cli.thrift.TCLIService$OpenSession_result$OpenSession_resultStandardScheme.read(TCLIService.java:2346)
	at org.apache.hive.service.cli.thrift.TCLIService$OpenSession_result.read(TCLIService.java:2293)
	at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
	at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:160)
	at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:147)
	at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:254)
	... 26 more
{noformat}

> JDBC backward compatibility is broken
> -------------------------------------
>
>                 Key: HIVE-6050
>                 URL: https://issues.apache.org/jira/browse/HIVE-6050
>             Project: Hive
>          Issue Type: Bug
>          Components: JDBC
>            Reporter: Szehon Ho
>
> Connect from JDBC driver of Hive 0.13 (TProtocolVersion=v4) to HiveServer2 of Hive 0.10
(TProtocolVersion=v1), will return the following exception:
> {noformat}
> java.sql.SQLException: Could not establish connection to jdbc:hive2://localhost:10000/default:
Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
> 	at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:336)
> 	at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:158)
> 	at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
> 	at java.sql.DriverManager.getConnection(DriverManager.java:571)
> 	at java.sql.DriverManager.getConnection(DriverManager.java:187)
> 	at com.cloudera.itest.hiveserver.UnmanagedHiveServer.createConnection(UnmanagedHiveServer.java:73)
> 	at com.cloudera.itest.AbstractTestWithStaticConfiguration.createConnection(AbstractTestWithStaticConfiguration.java:68)
> 	at com.cloudera.itest.FirstTest.sanityConnectionTest(FirstTest.java:19)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
> 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
> 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
> 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
> 	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> 	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
> 	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
> 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
> 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
> 	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
> 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
> 	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
> 	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
> 	at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
> 	at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
> 	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77)
> 	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195)
> 	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
> Caused by: org.apache.thrift.TApplicationException: Required field 'client_protocol'
is unset! Struct:TOpenSessionReq(client_protocol:null)
> 	at org.apache.thrift.TApplicationException.read(TApplicationException.java:108)
> 	at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:71)
> 	at org.apache.hive.service.cli.thrift.TCLIService$Client.recv_OpenSession(TCLIService.java:160)
> 	at org.apache.hive.service.cli.thrift.TCLIService$Client.OpenSession(TCLIService.java:147)
> 	at org.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:327)
> 	... 37 more
> {noformat}
> On code analysis, it looks like the 'client_protocol' scheme is a ThriftEnum, which doesn't
seem to be backward-compatible.  Look at the code path in the generated file 'TOpenSessionReq.java',
method TOpenSessionReqStandardScheme.read():
> 1. The method will call 'TProtocolVersion.findValue()' on the thrift protocol's byte
stream, which returns null if the client is sending an enum value unknown to the server. 
(v4 is unknown to server)
> 2. The method will then call struct.validate(), which will throw the above exception
because of null version.  
> So doesn't look like the current backward-compatibility scheme will work.



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Mime
View raw message