Параллельное сканирование в Google BigTable обеспечивает ускорение?

Я пытаюсь оптимизировать время сканирования запроса. Запрос представляет собой простой запрос диапазона без фильтров. Когда я запускаю запрос, сканирование несоленых данных временных рядов обычно занимает около 10 секунд (около 1,8 миллиона строк, каждая из которых содержит 32-байтовые значения и 40-байтовые ключи).

Стоит ли ожидать ускорения, если я солю данные, а затем запустил сканирование параллельно?

Например, я мог бы случайным образом добавить к каждой строке номер 0,1,2,3,4,5. Тогда я мог бы иметь пул потоков размером 6 для параллельного выполнения 6 отдельных сканирований. Когда я сейчас это делаю, я не вижу никакого ускорения, что наводит на мысль, что, возможно, что-то происходит за кулисами, что свело бы на нет какие-либо преимущества параллельного сканирования.

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


person Paul Mazzuca    schedule 23.10.2017    source источник
comment
Обычно помогает распараллеливание. Скорее всего, происходит что-то еще. Как настроено ваше сканирование (т.е. какие фильтры вы устанавливаете)?   -  person Solomon Duskis    schedule 24.10.2017


Ответы (1)


Проверив свои предположения, я понял, что на виртуальной машине, которую я использовал, было только два VCPU. Я увеличил это значение до SALT_RANGE и получил ожидаемое ускорение. В общем, убедитесь, что количество процессоров способно справиться с нагрузкой. Ниже приведен сокращенный код Java (я имею дело с картами для своих данных) для параллельного запуска сканирования.

ForkJoinPool myPool = new ForkJoinPool(Config.SALT_RANGE);

results = myPool.submit(() -> 
        IntStream.range(0,Config.SALT_RANGE).parallel().mapToObj(salt -> {
                    Scan scan = buildMyScan();
                    Table t = agent.getTableMain();
                    out = performScan(scan);
                    return  out;
                }).map(Map::entrySet).flatMap(Collection::stream).collect(
                    Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> merger(a, b), TreeMap::new)))
            .get();
person Paul Mazzuca    schedule 25.10.2017