Классу Presto Singleton в qds-sdq-py необходимо взаимодействовать с различными токенами API во время выполнения - PullRequest
0 голосов
/ 28 мая 2019

Наше приложение (python 3.6) является генератором запросов, позволяющим пользователям запрашивать несколько таблиц из разных баз данных. Мы пытаемся добавить поддержку Qubole. В настоящее время пытаются ассимилировать кластеры с двигателем Presto. У нас есть несколько токенов API, и мы должны иметь возможность запрашивать разные базы данных Presto одновременно. Мы начали реализовывать это с использованием qds_sdk, однако, кажется, что класс Qubole является синглтоном, а класс PrestoCommand взаимодействует с ним напрямую.

Пожалуйста, рассмотрите qds-sdk-py / example / qubole_presto_api_example.py https://github.com/qubole/qds-sdk-py/blob/master/example/qubole_presto_api_example.py

строки 67-68

  Qubole.configure(api_token=‘YOUR-QUBOLE-API-TOKEN’)
  get_results(execute_query(“select * from  default.cities limit 100;“))

Наш сервис требует возможности иметь несколько объектов Qubole.configure и запрашивать их в соответствии с взаимодействиями с пользователем. То есть:

    q1 =  Qubole.configure(api_token=‘Token1’)
    q2 =  Qubole.configure(api_token=‘Token2’)
    *user triggeres an event*
    q1.get_results(execute_query(“query”))

Как бы вы поступили? Должен ли я реализовать некоторую блокировку перед попыткой доступа к таблице?

1 Ответ

0 голосов
/ 28 мая 2019

Если ваш вопрос заключается в том, как использовать разные токены API для отправки запросов в разные учетные записи Qubole (и, следовательно, в кластеры Presto), я полагаю, что вы отсортировали их при создании экземпляров разных клиентов Qubole.

Если вам нужно подождатьдля завершения каждого запроса, прежде чем двигаться дальше, вы также можете использовать цикл с опросом.Вот краткий пример того, как вы можете подойти к нему для одного запроса:

presto_command=PrestoCommand.create(query=my_query, label='presto_cluster_label')
while True:
    sts = PrestoCommand.find(presto_command.id).status
    if sts == u'error' or sts == u'done' or sts == u'cancelled':
        break
    time.sleep(10)

if sts != u'done':
    error_str = presto_command.get_log()
    sys.stderr.write(error_str)
    raise QuboleError(error_str)

presto_command.get_results()
...