2016-02-15 2 views
2

Возможно ли выполнить запрос асинхронно на сервере куста?Выполнение запроса асинхронного куста: OperationHandle очищается на стороне сервера, как только клиент инициатора запроса отключается

Для, например, как я могу/Можно ли сделать что-то подобное из Client-

QueryHandle handle = executeAsyncQuery(hiveQuery); 
Status status = handle.checkStatus(); 
if(status.isCompleted()) { 
    QueryResult result = handle.fetchResult(); 
} 

я также имел взглянуть на How do I make an async call to Hive in Java?. Но не помогло. Ответы были в основном вокруг бережливых клиентов с аргументом обратного вызова.

Любая помощь будет оценена по достоинству. Благодаря!

[EDIT 1]

Я прошел через HiveConnection.java в улье JDBC. По умолчанию hive-jdbc использует API-интерфейс async thrift. Следовательно, он отправляет запрос и опросы для наборов результатов (посмотрите на HiveStatement.java). Теперь я могу написать кусок кода, который является чисто не блокирующим. Но проблема в том, что как только клиент отключит отпечаток стопы, запрос будет потерян.

Client 1

final TCLIService.Client client = new TCLIService.Client(createBinaryTransport(host, port, loginTimeout, sessConf, false)); // from HiveConnection.java 
TSessionHandle sessionHandle = openSession(client) // from HiveConnection.java 
TExecuteStatementReq execReq = new TExecuteStatementReq(sessionHandle, sql); 
execReq.setRunAsync(true); 
execReq.setConfOverlay(sessConf); 
final TGetOperationStatusReq handle = client.ExecuteStatement(execReq) 
writeHandleToFile("~/handle", handle) 

Client 2

final TGetOperationStatusReq handle = readHandleFromFile("~/handle") 
final TCLIService.Client client = new TCLIService.Client(createBinaryTransport(host, port, loginTimeout, sessConf, false)); 
while (true) { 
    System.out.println(client.GetOperationStatus(handle).getOperationState()); 
    Thread.sleep(1000); 
} 

Client 2 поддерживает печать FINISHED_STATE, пока клиент 1 жив. Но если процесс клиента 1 завершается или убивается, клиент 2 начинает печатать нуль, что означает, что hiveserver2 очищает ресурсы, как только клиент отключается.

Возможно ли настроить hiveserver2 для настройки этого процесса очистки в зависимости от времени или чего-то еще?

Спасибо!

+0

Из любопытства, что вы ожидаете делать во время выполнения запроса «в фоновом режиме»? Получить журналы, как и Beeline (с V0.14)? –

+0

В моем случае пользователь должен подключиться к веб-службе, которая запрашивает улей. Если веб-служба может просто поместить дескриптор запроса в некоторый общий хранилище, он удаляет зависимость веб-службы, чтобы оставаться в живых, пока запрос не завершится. Другими словами, в среде с балансировкой нагрузки, даже если экземпляр веб-службы опускается, другой экземпляр может извлекать результаты через дескриптор, хранящийся в общем хранилище. – amrk7

ответ

0

ли некоторые исследования и выяснили, что это происходит только с двоичным транспорта (ТСР)

@Override 
    public void deleteContext(ServerContext serverContext, 
     TProtocol input, TProtocol output) { 
    Metrics metrics = MetricsFactory.getInstance(); 
    if (metrics != null) { 
     try { 
     metrics.decrementCounter(MetricsConstant.OPEN_CONNECTIONS); 
     } catch (Exception e) { 
     LOG.warn("Error Reporting JDO operation to Metrics system", e); 
     } 
    } 
    ThriftCLIServerContext context = (ThriftCLIServerContext) serverContext; 
    SessionHandle sessionHandle = context.getSessionHandle(); 
    if (sessionHandle != null) { 
     LOG.info("Session disconnected without closing properly, close it now"); 
     try { 
     cliService.closeSession(sessionHandle); 
     } catch (HiveSQLException e) { 
     LOG.warn("Failed to close session: " + e, e); 
     } 
    } 
    } 

выше заглушки (от ThriftBinaryCLIService) запускается на выполнение через этот кусок кода из TThreadPoolServer, который используется ThriftBinaryCLIService.

eventHandler.deleteContext (connectionContext, inputProtocol, outputProtocol);

Видимо HTTP транспорт (ThriftHttpCLIService) имеет другую стратегию очистки операции ручки (не жадный, как TCP)

Проверят с улья сообщества по этому вопросу, чтобы понять немного больше и посмотреть, если есть проблема обращаясь к этому уже.

+0

Привет, Вы спрашивали сообщество? Если да, можете ли вы указать мне на обсуждение? – prongs

+0

@prongs Вновь открыли conersation здесь: https://issues.apache.org/jira/browse/HIVE-4617?focusedCommentId=15217491&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15217491 – amrk7

 Смежные вопросы

  • Нет связанных вопросов^_^