Presto JDB C Большой запрос очень медленный - PullRequest
0 голосов
/ 09 января 2020

Проблема

  1. Итерации по большому ResultSet из запроса Presto с использованием JDB C Драйвер занимает очень много времени. Кажется, что каждый пакетный вызов занимает почти ровно 60 секунд, что является подозрительным (возможно, вызванным некоторым таймаутом?).
  2. По какой-то причине первоначальный метод executeQuery занимает почти ровно 45 секунд, что является подозрительным.

Запрос

Я выполняю простой запрос к Presto, используя Java JDB C Драйвер Presto, который по сути выглядит так:

SELECT stringA, stringB 
FROM {table} 
LIMIT 500000

stringA и stringB малы - порядка ~ 10 символов каждый.
Мой запрос завершается при 10se c при запуске в DbVisualizer с использованием драйвера teradata.
НО, когда я запускаю тот же запрос из приложения Spring Java при использовании драйвера 0.230 presto-jdb c кажется, что результаты возвращаются партиями (около 75 000), и для возврата каждой партии требуется более минуты.

Я немного читал о параметре запроса Presto targetResultSize, но не смог установить его с помощью драйвера / соединения JDB C. Я читал, что Presto по умолчанию будет возвращать данные только 1 МБ за раз? Не уверен, что это является причиной моей вышеупомянутой проблемы # 1 - было бы здорово выяснить, как это настроить.

Java Код

public List<Object> getResultSetUsingDriverManager(ChronoLocalDate chronoLocalDate) throws SQLException {
    long start = System.currentTimeMillis();

    Properties properties = new Properties();
    properties.setProperty("user", USERNAME);
    properties.setProperty("password", PASSWORD);
    properties.setProperty("SSL", "true");

    final Connection connection = DriverManager.getConnection(URL, properties);

    log.warn("Presto connection acquired in " + (System.currentTimeMillis() - start) + "ms");

    Statement statement = connection.createStatement();

    ResultSet resultSet = statement.executeQuery(query);

    log.warn("Presto query executed in " + (System.currentTimeMillis() - start) + "ms");

    List<Object> collection = new ArrayList<>();

    int counter = 0;
    long batchStart = System.currentTimeMillis();
    while (resultSet.next()) {
        counter++;
        if (counter % 1000 == 0) {
            log.warn("current count {} and took {}ms", counter, (System.currentTimeMillis() - batchStart));
            batchStart = System.currentTimeMillis();
        }
    }
    log.warn("Results extracted in " + (System.currentTimeMillis() - start));

    return collection;
}

Выход

2020-01-08 17:34:31.704  WARN 29368 --- ...       : Presto connection acquired in 0ms
2020-01-08 17:35:16.705  WARN 29368 --- ...       : Presto query executed in 45003ms
2020-01-08 17:37:18.242  WARN 29368 --- ...       : current count 1000 and took 121537ms
2020-01-08 17:37:18.244  WARN 29368 --- ...       : current count 2000 and took 2ms
2020-01-08 17:37:18.245  WARN 29368 --- ...       : current count 3000 and took 1ms
...
2020-01-08 17:37:18.294  WARN 29368 --- ...       : current count 75000 and took 1ms
2020-01-08 17:38:18.857  WARN 29368 --- ...       : current count 76000 and took 60563ms
2020-01-08 17:38:18.858  WARN 29368 --- ...       : current count 77000 and took 1ms
...
2020-01-08 17:38:18.941  WARN 29368 --- ...       : current count 151000 and took 0ms
2020-01-08 17:39:19.241  WARN 29368 --- ...       : current count 152000 and took 60300ms
2020-01-08 17:39:19.242  WARN 29368 --- ...       : current count 153000 and took 1ms
...
2020-01-08 17:39:19.311  WARN 29368 --- ...       : current count 250000 and took 0ms
2020-01-08 17:39:19.311  WARN 29368 --- ...       : Results extracted in 287609

Информация о версии

  • Java 11
  • com.facebook.presto presto-jdb c 0.230
  • Spring Boot 2.1.6.RELEASE
  • Версия Presto: 302-e.3 (версия Starburst)

1 Ответ

1 голос
/ 09 января 2020

В последние месяцы мы исправили проблемы, связанные с клиентскими подключениями на Java 11.

. Пожалуйста, обновите драйвер JDB C до 327.

или уменьшите его до Java 8 на стороне клиента.

...