Как сделать асинхронный вызов Hive в Java?

Я хотел бы выполнить запрос Hive на сервере асинхронно. Запрос Hive, вероятно, займет много времени, поэтому я бы предпочел не блокировать вызов. В настоящее время я использую Thirft для выполнения блокирующего вызова (блокирует client.execute()), но я не видел примера того, как сделать неблокирующий вызов. Вот код блокировки:

        TSocket transport = new TSocket("hive.example.com", 10000);
        transport.setTimeout(999999999);
        TBinaryProtocol protocol = new TBinaryProtocol(transport);
        Client client = new ThriftHive.Client(protocol);
        transport.open();
        client.execute(hql);  // Omitted HQL

        List<String> rows;
        while ((rows = client.fetchN(1000)) != null) {
            for (String row : rows) {
                // Do stuff with row
            }
        }

        transport.close();

В приведенном выше коде отсутствуют блоки try/catch, чтобы сделать его коротким.

У кого-нибудь есть идеи, как сделать асинхронный вызов? Может ли Hive/Thrift поддерживать это? Есть ли способ лучше?

Спасибо!


person Peter Sankauskas    schedule 02.02.2010    source источник
comment
Сейчас я мало что знаю о Thrift, но не могли бы вы обернуть его в runnable и создать новый поток?   -  person brindy    schedule 02.02.2010
comment
Да, понятно, что я могу сделать эту работу сам, но есть вещи, которые заставляют меня думать, что это уже встроено в Thrift, например, TNonblockingSocket. Я не могу найти никаких примеров того, как его использовать, или даже если Hive его поддерживает.   -  person Peter Sankauskas    schedule 02.02.2010


Ответы (6)


Насколько я знаю, на момент написания Thrift не генерирует асинхронных клиентов. Причина, как объясняется в этой ссылке здесь (ищите текст для "асинхронного"), заключается в том, что Thrift был разработан для центров обработки данных, где предполагается низкая задержка.

К сожалению, как вы знаете, задержка между вызовом и результатом не всегда вызвана сетью, а выполняемой логикой! У нас есть проблема с вызовом базы данных Cassandra с сервера приложений Java, где мы хотим ограничить общее количество потоков.

Резюме: на данный момент все, что вы можете сделать, это убедиться, что у вас достаточно ресурсов для обработки необходимого количества заблокированных одновременных потоков, и дождаться более эффективной реализации.

person The D Williams    schedule 22.02.2010

Теперь можно сделать асинхронный вызов в экономном клиенте Java после установки этого исправления: https://issues.apache.org/jira/browse/THRIFT-768

Создайте асинхронный Java-клиент, используя новую экономию, и инициализируйте свой клиент следующим образом:

TNonblockingTransport transport = new TNonblockingSocket("127.0.0.1", 9160);
TAsyncClientManager clientManager = new TAsyncClientManager();
TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
Hive.AsyncClient client = new Hive.AsyncClient(protocolFactory, clientManager, transport);

Теперь вы можете выполнять методы на этом клиенте так же, как на синхронном интерфейсе. Единственное изменение состоит в том, что все методы принимают дополнительный параметр обратного вызова.

person Ishan    schedule 10.01.2012

Я ничего не знаю о Hive, но в крайнем случае вы можете использовать библиотеку параллелизма Java:

 Callable<SomeResult> c = new Callable<SomeResult>(){public SomeResult call(){

    // your Hive code here

 }};

 Future<SomeResult> result = executorService.submit(c);

 // when you need the result, this will block
 result.get();

Или, если вам не нужно ждать результата, используйте Runnable вместо Callable.

person Thilo    schedule 02.02.2010

После разговора со списком рассылки Hive Hive не поддерживает асинхронные вызовы с использованием Thirft.

person Peter Sankauskas    schedule 12.02.2010

Я ничего не знаю о Hive в частности, но любой блокирующий вызов можно превратить в асинхронный вызов, создав новый поток и используя обратный вызов. Вы можете взглянуть на java.util.concurrent.FutureTask, который был разработан, чтобы упростить обработку такой асинхронной операции.

person SyntaxT3rr0r    schedule 02.02.2010

Мы запускаем асинхронные вызовы к AWS Elastic MapReduce. AWS MapReduce может выполнять задания hadoop/hive в облаке Amazon с вызовом веб-сервисов AWS MapReduce.

Вы также можете отслеживать статус своих заданий и получать результаты с S3 после завершения задания.

Поскольку вызовы веб-служб по своей природе асинхронны, мы никогда не блокируем другие наши операции. Мы продолжаем отслеживать статус наших заданий в отдельном потоке и получаем результаты, когда задание завершено.

person Deep Kapadia    schedule 08.02.2010