Импорт данных из файла в кластер Cassandra с 5 узлами вызывает исключение BusyConnectionException - PullRequest
0 голосов
/ 27 июня 2018

Для моей диссертации мне нужно загрузить данные из файла в Cassandra Cluster. с session.execute () это слишком медленно. Поэтому я решил использовать session.executeAsyn (). но это вызывает BusyConnectionException.

Вот мой код на Java:

    final PoolingOptions poolingOptions = new PoolingOptions();
    poolingOptions.setMaxRequestsPerConnection(HostDistance.LOCAL, 32768)
            .setMaxRequestsPerConnection(HostDistance.REMOTE, 32768);
    final Cluster cluster = Cluster.builder()
            .withPoolingOptions(poolingOptions)
            .addContactPoint("x.x.x.x")
            .withPort(9042)
            .build();
    final Session session = cluster.connect();
    System.out.println("session object---" + session.getState());
    final String path = "&PathToFile%";
    final File dir = new File(path);

    session.execute("use products;");
    for (final File file : dir.listFiles()) {
        final BufferedReader br = new BufferedReader(new FileReader(file));
        String str;
        final String insert = br.readLine();
        while ((str = br.readLine()) != null) {
            final String query = insert + str.substring(0, str.length() - 1) + "IF NOT EXISTS ;";
            session.executeAsync(query);
        }
    }
    session.close();
    cluster.close();
}

вот исключения, которые были у меня при выполнении кода:

Ошибка запроса /x.x.x.1:9042: com.datastax.driver.core.exceptions.BusyPoolException: [/x.x.x.1] Пул занят (нет доступного соединения, и очередь достигла максимального размера 256) Ошибка запроса /x.x.x.2:9042: com.datastax.driver.core.exceptions.BusyPoolException: [/x.x.x.2] Пул занят (нет доступного соединения, и очередь достигла максимального размера 256) Ошибка запроса /x.x.x.3:9042: com.datastax.driver.core.exceptions.BusyPoolException: [/x.x.x.3] Пул занят (нет доступного соединения, и очередь достигла максимального размера 256) Ошибка запроса /x.x.x.4:9042: com.datastax.driver.core.exceptions.BusyPoolException: [/x.x.x.4] Пул занят (нет доступного соединения, и очередь достигла максимального размера 256) Ошибка запроса /x.x.x.5:9042: com.datastax.driver.core.exceptions.BusyPoolException: [/x.x.x.5] Пул занят (нет доступного соединения, и очередь достигла максимального размера 256)

1 Ответ

0 голосов
/ 27 июня 2018

Занятое исключение возникает, когда вы помещаете слишком много запросов в одно соединение. Вы должны контролировать, сколько запросов отправлено. Простейшим способом будет использовать семафор или что-то подобное. У меня есть класс , который упаковывает Session и позволяет контролировать количество запросов в полете, поэтому он ведет себя как асинхронно, пока не будет достигнут предел, и будет блокироваться до тех пор, пока не будет выполнено количество запросов в полете. под лимитом. Вы можете использовать мой код или реализовать нечто подобное.

Обновление: вы используете облегченные транзакции (LWT) (предложение IF NOT EXISTS), и это сильно влияет на производительность вашего кластера, поскольку каждую вставку необходимо координировать с другими узлами ...

...