Почему спарк медленнее по сравнению с sqoop, когда дело доходит до jdbc? - PullRequest
2 голосов
/ 24 мая 2019

Понятно, что при переносе / загрузке из oracle db в hdfs / parquet предпочтительно использовать SQOOP, а не SPARK с драйвером JDBC.

Предполагается, что Spark будет в 100 раз быстрее при обработке, верно?Тогда что не так с Spark?Почему люди предпочитают SQOOP при загрузке данных из таблиц oracle db?

Подскажите, пожалуйста, что мне нужно сделать, чтобы Spark быстрее загружал данные из oracle.

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Spark работает быстро, когда знает, как распараллеливать запросы.Если вы просто выполняете один запрос, то Spark не знает, что делать.Вы можете улучшить скорость, используя параметры lowerBound, upperBound, numPartitions при чтении данных с помощью spark.read.jdbc, но это действительно зависит от дизайна ваших таблиц.

Вы можете найти больше документации здесь .

0 голосов
/ 28 мая 2019

Суть уже раскрыта в ответе Алекса.

Я просто хотел добавить пример,

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 автоматически выполняет граничный запрос для получения значения MIN, MAX для , разделенного на столбец (этот запрос также может быть переопределен)

...