|
| 1 | +## О Проекте |
| 2 | +Проект создан для быстрой загрузки тестовых данных в распределенной реляционной СУБД [Shardman](https://postgrespro.ru/products/shardman). |
| 3 | +## Как это работает |
| 4 | + |
| 5 | +При запуске автоматически создаются необходимые таблицы. |
| 6 | + |
| 7 | +### Основная таблица для тестовых данных |
| 8 | +В таблице usertable будут храниться тестовые данные. Она создается с помощью следующего SQL-запроса: |
| 9 | +```sal |
| 10 | +CREATE TABLE IF NOT EXISTS usertable( |
| 11 | + YCSB_KEY VARCHAR(64) PRIMARY key |
| 12 | + , FIELD0 VARCHAR(100) |
| 13 | + , FIELD1 VARCHAR(100) |
| 14 | + , FIELD2 VARCHAR(100) |
| 15 | + , FIELD3 VARCHAR(100) |
| 16 | + , FIELD4 VARCHAR(100) |
| 17 | + , FIELD5 VARCHAR(100) |
| 18 | + , FIELD6 VARCHAR(100) |
| 19 | + , FIELD7 VARCHAR(100) |
| 20 | + , FIELD8 VARCHAR(100) |
| 21 | + , FIELD9 VARCHAR(100) |
| 22 | + ) with (distributed_by='ycsb_key', num_parts=$PARTITION_CNT) |
| 23 | +``` |
| 24 | + |
| 25 | +### Таблица для мониторинга |
| 26 | +В таблицу monitoring_insert записывается информация о процессе вставки данных. |
| 27 | +Каждые 5 минут в нее добавляются данные о количестве вставленных строк в таблицу usertable: |
| 28 | +``` |
| 29 | +create table monitoring_insert( |
| 30 | + ts timestamp, |
| 31 | + shard int, |
| 32 | + val bigint |
| 33 | +); |
| 34 | +``` |
| 35 | +Для достижения высокой скорости загрузки данных используется параллельная вставка: |
| 36 | +в каждой ноде Shardman`а запускается отдельный экземпляр приложения, что позволяет эффективно вставлять данные именно в эту ноду не используя [FDW](https://postgrespro.ru/docs/enterprise/15/postgres-fdw). |
| 37 | + |
| 38 | + |
| 39 | +## Как собрать |
| 40 | +``` |
| 41 | +mvn package |
| 42 | +``` |
| 43 | +Результат сборки в ./target/mbench_fast_load_to_shardman-1.0-SNAPSHOT-jar-with-dependencies.jar |
| 44 | + |
| 45 | +## Как запустить |
| 46 | + |
| 47 | +Параметры, которые нужно задать перед запуском: |
| 48 | + |
| 49 | +Переменные окружения: |
| 50 | + |
| 51 | +- SHARD_CNT - Задаёт количество нод |
| 52 | +- PARTITION_CNT - Задаёт общее количество секций для секционированной таблицы |
| 53 | +- BENCH_RUN_AFTER - Задаёт начальный id с которого будем генерировать. Если его не указать, то он будет высчитываться из таблицы monitoring_insert как: (select max(val) from monitoring_insert) - 20 000 000 |
| 54 | +- ROW_LIMIT - Задаёт лимит строк. По умолчанию 800 000 000 000 |
| 55 | +- В PATH обязательно должен быть путь до psql |
| 56 | + |
| 57 | +Аргументы приложения: |
| 58 | +- -U Пользователь, который подключается к СУБД |
| 59 | +- -P Пароль, с которым пользователь подключается к СУБД |
| 60 | +- -d Имя базы данных |
| 61 | +- -h Хост СУБД |
| 62 | +- -w Количество параллельных воркеров, на одной ноде |
| 63 | +- -v номер ноды: 0 <= v < SHARD_CNT. Важный параметр, поскольку именно с помощью него определяются записи для текущей ноды |
| 64 | +- -t Ограничение времени выполнения (в секундах). Генерация остановится, когда будет достигнут лимит времени или ROW_LIMIT. |
| 65 | + |
| 66 | +Пример: |
| 67 | +``` |
| 68 | +export SHARD_CNT=7 |
| 69 | +export PARTITION_CNT=70 |
| 70 | +java -Xmx512M -cp ./target/mbench_fast_load_to_shardman-1.0-SNAPSHOT-jar-with-dependencies.jar tests.YahooLoader -U postgres -P shardman-petabyte-scale-2025 -d postgres -w 40 -v 1 -t 43200 -h localhost |
| 71 | +``` |
| 72 | + |
| 73 | +## Перезапуск |
| 74 | + |
| 75 | +Процесс java можно остановить в любой момент. |
| 76 | + |
| 77 | +Однако, чтобы избежать лишней работы, рекомендуется: |
| 78 | +- Дождаться появления новой записи в таблице monitoring_insert |
| 79 | +- Сразу после появления записи остановить процесс java |
| 80 | +- Запустить генерацию заново по инструкции выше |
0 commit comments