Загрузить данные S3 в экземпляр Aurora MySQL
Я пытаюсь загрузить данные в S3 в экземпляр Aurora MySQL. Я сделал это с помощью PySpark и производительность составляет 4 ГБ в час.
current_df.write.format('jdbc').options(
url=url,
driver=jdbc_driver,
dbtable=table_name,
user=username,
password=password).mode("overwrite").save()
Добавил несколько улучшений производительности и заметил, что производительность улучшилась (7 ГБ в час), однако она все еще не так уж велика.
Параметры, добавленные в URL JDBC
useServerPrepStmts=false&rewriteBatchedStatements=true
Я попробовал другой подход
LOAD DATA FROM S3 's3://${s3.bucket}/${filename}' INTO TABLE ${TableName} FIELDS TERMINATED BY ',';
Таким образом он загружает 5 ГБ в час в MySQL.
У меня есть около 2 ТБ данных, необходимых для загрузки в экземпляр MySQL. Есть ли какой-нибудь возможный способ быстрее загрузить данные.
1 ответ
Некоторые случайные мысли; Я надеюсь, что некоторые помогут:
- Увеличьте выделенные IOPS с обеих сторон. (Если вы можете получить некоторые показатели, вы сможете решить, какая сторона нуждается в большем.)
- Что такое
s3://...
- звучит как проникновение в удаленную файловую систему? Как далеко? - Если он достаточно удаленный, рассмотрите возможность архивирования и копирования файлов ближе к месту, затем разархивируйте (так как
LOAD
не имеет возможности расстегнуть молнию). - Удаленный... Возможно, у вас ограничена пропускная способность сети?
- Запустить
LOADs
в параллели. Как много? Трудно сказать. Возможно, IOPS на одном конце или другом будет ограничивающим фактором. - У вас есть "чрезмерное" количество индексов в таблицах? Это может замедлить
LOAD
, Удаление индексов может ускоритьLOAD
, но вам нужно будет повторно добавить индексы позже. Главное - избавиться от индексов, которые вам не понадобятся. - Исходные файлы уже отсортированы в
PRIMARY KEY
порядок ускоритсяLOAD
(при условии, что в целевой схеме уже определен PK, что и должно быть). Конечно, предварительная сортировка файлов занимает много времени, поэтому существует компромисс.