为什么 spark 在 jdbc 时比 sqoop 慢?
Why spark is slower when compared to sqoop , when it comes to jdbc?
据了解,从 oracle db migrating/load 到 hdfs/parquet 时,首选使用 SQOOP 而不是 SPARK 和 JDBC 驱动程序。
Spark 在处理时应该快 100 倍吧?
那么 Spark 有什么问题呢?
为什么人们在从 oracle 数据库表加载数据时更喜欢 SQOOP?
请建议我在从 oracle 加载数据时需要做什么才能使 Spark 更快。
Spark 知道如何并行化查询时速度很快。如果您只是执行单个查询,那么 Spark 不知道该怎么做。当使用 spark.read.jdbc
读取数据时,您可以通过使用参数 lowerBound
、upperBound
、numPartitions
来提高速度,但这实际上取决于您的表的设计。
您可以找到更多文档 here。
Alex 的回答中已经涵盖了要点。
我只是想补充一个例子,
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 自动执行边界查询以获取 split by 列的 MIN、MAX 值(该查询也可以被覆盖)
据了解,从 oracle db migrating/load 到 hdfs/parquet 时,首选使用 SQOOP 而不是 SPARK 和 JDBC 驱动程序。
Spark 在处理时应该快 100 倍吧? 那么 Spark 有什么问题呢? 为什么人们在从 oracle 数据库表加载数据时更喜欢 SQOOP?
请建议我在从 oracle 加载数据时需要做什么才能使 Spark 更快。
Spark 知道如何并行化查询时速度很快。如果您只是执行单个查询,那么 Spark 不知道该怎么做。当使用 spark.read.jdbc
读取数据时,您可以通过使用参数 lowerBound
、upperBound
、numPartitions
来提高速度,但这实际上取决于您的表的设计。
您可以找到更多文档 here。
Alex 的回答中已经涵盖了要点。
我只是想补充一个例子,
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 自动执行边界查询以获取 split by 列的 MIN、MAX 值(该查询也可以被覆盖)