Понятно, что при миграции/загрузке с oracle db на hdfs/parquet предпочтительно использовать SQOOP, а не SPARK с драйвером JDBC.
Spark должен быть в 100 раз быстрее при обработке, верно? А что не так со Спарком? Почему люди предпочитают SQOOP при загрузке данных из таблиц oracle db?
Пожалуйста, предложите мне, что мне нужно сделать, чтобы Spark работал быстрее при загрузке данных из оракула.
Spark работает быстро, когда умеет распараллеливать запросы. Если вы просто выполняете один запрос, Spark не знает, что делать. Вы можете улучшить скорость, используя параметры lowerBound
, upperBound
, numPartitions
при чтении данных с помощью spark.read.jdbc
, но на самом деле это зависит от дизайна ваших таблиц.
Вы можете найти дополнительную документацию здесь.
Основная мысль уже освещена в ответе Алекса.
Я просто хотел добавить пример,
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[4]").appName("Test-JDBC").getOrCreate()
ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select min(id), max(id) from post_history) as ph",
properties = {"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"})
r = ds.head()
minId = r[0]
maxId = r[1]
ds = spark.read.jdbc("jdbc:mysql://localhost:3306/stackexchange", "(select * from post_history) as ph",
properties = {"user": "devender", "password": "*****", "driver": "com.mysql.jdbc.Driver"},
numPartitions=4, column = "id", lowerBound=minId, upperBound=maxId)
count = ds.count()
print(count)
Для получения дополнительной информации https://gist.github.com/devender-yadav/5c4328918602b7910ba883e18b68fd87
Примечание. Sqoop автоматически выполняет граничный запрос для получения минимального и максимального значения для столбца разделить на (этот запрос также можно переопределить).
спасибо, но есть ли способ получить numPartitions динамически?
Нет универсального способа. Вам необходимо создать алгоритм, основанный на количестве записей (сторона источника), максимальном количестве одновременных заданий, выполняемых искрой (пряжа), и максимальном количестве одновременных подключений к базе данных.
Возможный дубликат Как повысить производительность для медленных заданий Spark с использованием соединения DataFrame и JDBC?