如果假设我们设置了限制为100,并且Spark应用程序连接到具有百万条记录的数据库。那么Spark会加载所有百万条记录还是加载100比100?
Spark如何从DB加载数据?它取决于数据库类型及其连接器实现。当然,对于分布式处理框架,分布式数据摄取始终是构建连接器的主要目标。
作为一个简单的例子,如果我们在表中有一个(1 Mil)记录,并且我们在load()
时将分区数定义为100,那么理想情况下,读取任务将分发给执行程序,以便每个执行程序读取一个范围(10,000)记录并将它们存储在内存中的相应分区中。见SQL Databases using JDBC.
在Spark UI中,您可以看到numPartitions指示了启动的任务数。每个任务都分布在执行程序中,这可以通过JDBC接口增加读写的并行性
Spark提供灵活的接口(Spark DataSource V2),允许我们构建自己的自定义数据源连接器。这里的主要设计关键是根据定义的分区数并行化读取操作。还要检查(figure 4)以了解分布式CSV提取在Spark中的工作原理。
更新
从多个worker的JDBC连接中读取
df = spark.read.jdbc(
url=jdbcUrl,
table="employees",
column="emp_no",
lowerBound=1,
upperBound=100000,
numPartitions=100
)
display(df)
在上面的示例代码中,我们使用JDBC read来分析使用emp_no
,partitionColumn
,lowerBound
和upperBound
在numPartitionsparameters
列上的执行程序读取的表。