Пакетные запросы в Кассандру

1

Я пытаюсь вставить пакет объектов в Cassandra примерно так:

public void insertIntoCassandra(ArrayList<FileLoaderVo> LoadVo)
        throws NitroLoaderException {

    int temp = LoadVo.size();

    try {
        Session session = cassandraDAO.getSession();
        if (session == null) {
            String msg = "CassandraDAO.getSession() returned null";
            logger.error(msg);
            throw new FileLoaderException(msg);
        }

        BoundStatement bStmtHistTable = null;

        if (pStmtHistTable == null) {
            pStmtHistTable = session.prepare(insertToCassandra);
            pStmtHistTable.setConsistencyLevel(ConsistencyLevel.ONE);
        }

        for (FileLoaderVo fileLoaderVo : LoadVo) {              

            bStmtHistTable = pStmtHistTable.bind(fileLoaderVo.getSecurityCode(),
                    fileLoaderVo.getType(), fileLoaderVo.getAreaCode(),
                    fileLoaderVo.getEmpName(), fileLoaderVo.getCityType(),
                    fileLoaderVo.getHomeFIPS(), fileLoaderVo.getLastName(),
                    fileLoaderVo.getDst(), fileLoaderVo.getCssCode(),
                    fileLoaderVo.getAbbr(), fileLoaderVo.getOfficeFIPS(),
                    fileLoaderVo.getMiddleName(), fileLoaderVo.getZone(),
                    fileLoaderVo.getUtc());

            session.execute(bStmtHistTable);
            logger.info("LoadVo.size() is :"+temp);
            temp--;
        }
    } catch (Exception e) {
        System.out.println(e);
    }

}

Здесь я передаю этот метод ArrayList объектов, которые нужно вставить в Cassandra. Но можно ли каким-либо образом запустить один запрос на этих объектах, например, в пакетной вставке?

Я заглянул в datastax, но ничего не мог найти, ваши входы были бы оценены.

Заранее спасибо.

Теги:
cassandra
batch-processing
datastax

2 ответа

1
Лучший ответ

В зависимости от версии Cassandra, которую вы запускаете, вы можете либо связать заявления, добавленные в пакет (C * 2.0), либо подготовить оператор партии (C * 1.2). Эти 2 варианта описаны в этом сообщении в блоге: http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

В основном с C * 2.0 вы можете делать:

if (pStmtHistTable == null) {
    pStmtHistTable = session.prepare(insertToCassandra);
    pStmtHistTable.setConsistencyLevel(ConsistencyLevel.ONE);
}
// create a batch statement
BatchStatement batch = new BatchStatement();

for (FileLoaderVo fileLoaderVo : LoadVo) {
    // add bound statements to the batch
    batch.add(pStmtHistTable.bind(...));
}
// execute all
session.execute(batch);
  • 1
    Это снизит производительность, так как тип по умолчанию представляет собой пакет LOGGED, где, как я думаю, они были после того, как более простой / более производительный хочет вставить.
2

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

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

Для получения полной информации, включая общие анти-шаблоны, см.

Записанные партии: http://christopher-batey.blogspot.co.uk/2015/03/cassandra-anti-pattern-cassandra-logged.html

Незавершенные партии: http://christopher-batey.blogspot.co.uk/2015/02/cassandra-anti-pattern-misuse-of.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню