Большой запрос Presto JDBC очень медленный

Проблема

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

Запрос

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

SELECT stringA, stringB 
FROM {table} 
LIMIT 500000

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

Я читал о Престо targetResultSizeпараметр запроса, но мне не удалось установить его с помощью драйвера / соединения JDBC. Я читал, что 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-jdbc 0.230
  • Spring Boot 2.1.6.RELEASE
  • Версия Presto: 302-e.3 (версия Starburst)

1 ответ

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

Обновите драйвер JDBC до 327.

Или перейдите на Java 8 на стороне клиента.

Другие вопросы по тегам