0
我开发一个节俭的客户,TApplicationException:必填字段“client_protocol”未设置
我有我的机器上建立一个节俭蜂巢服务器(Apache的蜂房0.14.0)和我也有机会获得Cloudera的DIST蜂巢4.6.0
当我节俭客户端连接到客户端CDH给予以下错误:
TApplicationException: Required field 'client_protocol' is unset!
Struct:TOpenSessionReq(client_protocol:null, username:
我传递正确的协议服务器,但它似乎有些事情是在骑它... 。
而且如果我点到本地主机(在那里我有我的蜂巢服务器上运行)的每一件事似乎做工精细....
请让我知道什么是错在这里....
代码:
var socket = new TSocket("XXX.XXX.XXX.XXX", 10000);
TStreamTransport sTransport = (TStreamTransport)socket;
var transport = new TBufferedTransport(socket);
underlyingTransport = transport;
var proto = new TBinaryProtocol(transport);
var client = new TCLIService.Client(proto);
transport.Open();
TOpenSessionReq req = new TOpenSessionReq(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V6);
req.Username = "hive";
req.Password = "hive";
TOpenSessionResp oSResponse = client.OpenSession(req);
TSessionHandle sessionHandle = oSResponse.SessionHandle;
TExecuteStatementReq execReq = new TExecuteStatementReq(sessionHandle, "select * from emp");
TExecuteStatementResp exeRes= client.ExecuteStatement(execReq);
TOperationHandle operationHandle = exeRes.OperationHandle;
TFetchResultsReq fechReq = new TFetchResultsReq(operationHandle,TFetchOrientation.FETCH_FIRST, 1);
TFetchResultsResp fechRes = client.FetchResults(fechReq);
TRowSet results = fechRes.Results;
List<TRow> resultRows = results.Rows;
foreach (var row in resultRows)
{
var val = row.ColVals[0];
System.Console.WriteLine(val.StringVal);
}
TCloseOperationReq closeOprReq = new TCloseOperationReq(operationHandle);
client.CloseOperation(closeOprReq);
TCloseSessionReq creq = new TCloseSessionReq(sessionHandle);
client.CloseSession(creq);
这样的声音可能是I/O堆栈错误。 Cloudera Hive是否使用TFramedTransport而不是TBufferedTransport? – codeSF 2014-10-11 19:19:04
“*我正在将正确的协议传递给服务器,但似乎有些东西正在压倒它...... *” - 没有人会压倒任何东西。但是有些服务器隐含地要求'TFramedTransport'。这是一个非常常见的陷阱。根据[本文档](https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2),Hive在服务器端使用线程,因此请检查'TFramedTransport'是否工作。 – JensG 2014-10-12 17:10:47