ENGLISH:
The project purpose is to provide tool for quick test data load into distributed PostgreSQL-based database called Shardman Shardman.
At first tool creates required tables.
Table usertable saves all test data. Here is DDL:
CREATE TABLE IF NOT EXISTS usertable(
YCSB_KEY VARCHAR(64) PRIMARY key
, FIELD0 VARCHAR(100)
, FIELD1 VARCHAR(100)
, FIELD2 VARCHAR(100)
, FIELD3 VARCHAR(100)
, FIELD4 VARCHAR(100)
, FIELD5 VARCHAR(100)
, FIELD6 VARCHAR(100)
, FIELD7 VARCHAR(100)
, FIELD8 VARCHAR(100)
, FIELD9 VARCHAR(100)
) with (distributed_by='ycsb_key', num_parts=$PARTITION_CNT)
Table monitoring_insert contains information about data load progress.
Each 5 minutes tool inserts new row with count of inserted rows into test data table.
Here is DDL:
create table monitoring_insert(
ts timestamp,
shard int,
val bigint
);
To achieve high load speed tool uses parallel threads. It's recommended to use separate tool instance for each Shardman node to avoid cross-node interaction via FDW.
mvn package
Build result is stored in ./target/mbench_fast_load_to_shardman-1.0-SNAPSHOT-jar-with-dependencies.jar
The following parameters are supported via environment variables and program arguments.
Environment variables:
- SHARD_CNT - Amount of Shardman nodes
- PARTITION_CNT - Total amount of partitions for test data table
- BENCH_RUN_AFTER - Initial value of ID. If not specified, it will be calculated based on monitoring_insert as:
(select max(val) from monitoring_insert) - 20 000 000 - ROW_LIMIT - Target amount of rows into test data table, default - 800 000 000 000
Please specify path to routine psql into environment variable PATH
Program arguments:
- -U database username
- -P database user password
- -d database name
- -h database host
- -w amount of parallel threads per Shardman node / tool instance
- -v ID of Shardman node: 0 <= v < SHARD_CNT. Important to set it to make routine correctly identify for particular node.
- -t Timeout (in seconds). Row generation stops after timeout or amount of rows in test data table reachs ROW_LIMIT.
Shardman cluster contains 7 nodes. We want to have 10 partitions per node (70 in total) and fill node with ID=1 by 40 concurrent nodes during 12 hours (43200 seconds)
export SHARD_CNT=7
export PARTITION_CNT=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
It's safe to restart java process at any moment
However, to avoid redundant work and save time, recommends:
- Wait for fresh row in monitoring_insert
- After row appearance, terminate/stop process (kill it by SIGTERM/SIGSTOP)
- Restart java process
РУССКИЙ:
Проект создан для быстрой загрузки тестовых данных в распределенной реляционной СУБД Shardman.
При запуске автоматически создаются необходимые таблицы.
В таблице usertable будут храниться тестовые данные. Она создается с помощью следующего SQL-запроса:
CREATE TABLE IF NOT EXISTS usertable(
YCSB_KEY VARCHAR(64) PRIMARY key
, FIELD0 VARCHAR(100)
, FIELD1 VARCHAR(100)
, FIELD2 VARCHAR(100)
, FIELD3 VARCHAR(100)
, FIELD4 VARCHAR(100)
, FIELD5 VARCHAR(100)
, FIELD6 VARCHAR(100)
, FIELD7 VARCHAR(100)
, FIELD8 VARCHAR(100)
, FIELD9 VARCHAR(100)
) with (distributed_by='ycsb_key', num_parts=$PARTITION_CNT)
В таблицу monitoring_insert записывается информация о процессе вставки данных. Каждые 5 минут в нее добавляются данные о количестве вставленных строк в таблицу usertable:
create table monitoring_insert(
ts timestamp,
shard int,
val bigint
);
Для достижения высокой скорости загрузки данных используется параллельная вставка:
в каждой ноде Shardman`а запускается отдельный экземпляр приложения, что позволяет эффективно вставлять данные именно в эту ноду не используя FDW.
mvn package
Результат сборки в ./target/mbench_fast_load_to_shardman-1.0-SNAPSHOT-jar-with-dependencies.jar
Параметры, которые нужно задать перед запуском:
Переменные окружения:
- SHARD_CNT - Задаёт количество нод
- PARTITION_CNT - Задаёт общее количество секций для секционированной таблицы
- BENCH_RUN_AFTER - Задаёт начальный id с которого будем генерировать. Если его не указать, то он будет высчитываться из таблицы monitoring_insert как: (select max(val) from monitoring_insert) - 20 000 000
- ROW_LIMIT - Задаёт лимит строк. По умолчанию 800 000 000 000
- В PATH обязательно должен быть путь до psql
Аргументы приложения:
- -U Пользователь, который подключается к СУБД
- -P Пароль, с которым пользователь подключается к СУБД
- -d Имя базы данных
- -h Хост СУБД
- -w Количество параллельных воркеров, на одной ноде
- -v номер ноды: 0 <= v < SHARD_CNT. Важный параметр, поскольку именно с помощью него определяются записи для текущей ноды
- -t Ограничение времени выполнения (в секундах). Генерация остановится, когда будет достигнут лимит времени или ROW_LIMIT.
Пример:
export SHARD_CNT=7
export PARTITION_CNT=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
Процесс java можно остановить в любой момент.
Однако, чтобы избежать лишней работы, рекомендуется:
- Дождаться появления новой записи в таблице monitoring_insert
- Сразу после появления записи остановить процесс java
- Запустить генерацию заново по инструкции выше