Низкая производительность вставки и сохранения всех данных в хранилище данных cassandra. - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь вставить 1500 записей с помощью пружины в Кассандру.У меня есть список POJO, которые содержат эти 1500 записей, и когда я вызываю saveAll или вставляю эти данные, требуется 30 секунд для завершения этой операции.Может кто-нибудь предложить мне способ сделать это быстрее?В настоящее время я использую Cassandra 3.11.2 в качестве одного узла Тестовый кластер.

Объект POJO:

package com.samplepoc.pojo;

import static org.springframework.data.cassandra.core.cql.PrimaryKeyType.PARTITIONED;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;

@Table("health")
public class POJOHealth
{
    @PrimaryKeyColumn(type=PARTITIONED)
    UUID primkey;
    @Column
    String col1;
    @Column
    String col2;
    @Column
    String col3;
    @Column
    String col4;
    @Column
    String col5;
    @Column
    Date ts;
    @Column
    boolean stale;
    @Column
    String col6;
    @Column
    String col7;
    @Column
    String col8;
    @Column
    String col9;
    @Column
    Map<String,String> data_map = new HashMap<String,String>();

    public POJOHealth(
             String col1,
             String col2,
             String col3,
             String col4,
             String col5,
             String col6,
             String col7,
             String col8,
             String col9,
             boolean stale,
             Date ts,
             Map<String,String> data_map
             )
    {
        this.primkey = UUID.randomUUID();
        this.col1=col1;
        this.col2=col2;
        this.col3=col3;
        this.col4=col4;
        this.col5=col5;
        this.col6=col6;
        this.col7=col7;
        this.col8=col8;
        this.col9=col9;
        this.ts=ts;
        this.data_map = data_map;
        this.stale=stale;
    }

    //getters & setter ommitted
}

Фрагмент сохраняемой службы:

public void persist(List<POJO> l_POJO)
{
        System.out.println("Enter Persist: "+new java.util.Date());

        List<l_POJO> l_POJO_stale = repository_name.findBycol1AndStale("sample",false);
        System.out.println("Retrieve Old: "+new java.util.Date());

        l_POJO_stale.forEach(s -> s.setStale(true));
        System.out.println("Set Stale: "+new java.util.Date());

        repository_name.saveAll(l_POJO_stale);
        System.out.println("Save stale: "+new java.util.Date());

        try 
        {
            repository_name.insert(l_POJO);
        } 
        catch (Exception e) 
        {
            System.out.println("Error in persisting new data");
        }
        System.out.println("Insert complete: "+new java.util.Date());
}

1 Ответ

0 голосов
/ 08 октября 2018

Я не знаю о Spring, но драйвер Java, который его использует, может выполнять вставки асинхронно.Если вы сэкономите таким образом, задержка для вашего экземпляра определяет вашу пропускную способность, а не эффективность вашего запроса.т. е. предположим, что у вас есть задержка в 10 мс для координатора C *, сохраняясь по одной за раз, что займет 30 секунд (10 мс там, 10 мс назад * 1500).

Если вы вставляете все из них одновременно с executeAsyncи заблокируйте их все, что завершит, вы должны быть в состоянии сделать 1500 за менее чем секунду, если ваше оборудование не слишком сильно загружено (почти все, что не малиновый пи должен быть в состоянии справиться с этим по крайней мере).Тем не менее, если в вашем приложении есть какой-либо параллелизм, вы не хотите, чтобы каждая отправляла 1000 вставок одновременно, поэтому было бы очень неплохо ввести какой-то дроссель в полете (например, семафор с пределом 128).

...