загрузка в MySQL 150 миллионов записей за 2-3 часа - PullRequest
0 голосов
/ 16 октября 2018

У меня есть искровые проза, который выполняет некоторые вычисления, затем выполняет вставку в таблицу MySQL, все вычисления выполняются за 40-50 минут, но.Запись в таблицу занимает 2-3 часа (зависит от использования БД).Я пытался сделать пакетный размер

val db_url_2 = "jdbc:mysql://name.amazonaws.com:port/db_name?rewriteBatchedStatements=true" 

df_trsnss.write.format("jdbc").option("url", db_url_2).option("dbtable", output_table_name).option("user", db_user).option("password", db_pwd).option("truncate","true").option("batchsize", 5000).mode("overwrite").save()

, но загрузка все равно длилась вечно, я не могу позволить себе тратить 2-4 часа в день только на подсчет и запись данных в таблицу.

Есть ли способ ускорить этот процесс?

Начните думать, чтобы сделать запись в CSV, а затем загрузить его в дБ из CSVтак что я могу сократить время EMR.

1 Ответ

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

Попробуйте что-то вроде этого - прямо из Руководства по DataBricks:

JDBC записывает

Разделы Spark определяют количество соединений, используемых для передачи данных через JDBCAPI.Вы можете управлять параллелизмом, вызывая coalesce () или repartition () в зависимости от существующего количества разделов.Вызовите coalesce при уменьшении числа разделов и переразбивку при увеличении количества разделов.

Попробуйте и посмотрите, как это соотносится с вашим подходом записи, и дайте нам знать.

import org.apache.spark.sql.SaveMode

val df = spark.table("diamonds")
println(df.rdd.partitions.length)

// Given the number of partitions above, you can reduce the partition value by calling coalesce() or increase it by calling repartition() to manage the number of connections.
df.repartition(10).write.mode(SaveMode.Append).jdbc(jdbcUrl, "diamonds", connectionProperties)
...