Spark Shell JDBC读取numPartitions的值是否取决于执行器的数量



我在具有2个内核和16GB RAM的单个节点上以独立模式设置了Spark,以制作一些粗略的POC
我想使用val df = spark.read.format('jdbc')...option('numPartitions',n).load()从SQL源加载数据。当我试图通过调用df.rdd.count来测量读取不同numPartitions值的表所花费的时间时,我发现无论我给出的值是多少,时间都是相同的。在上下文web UI中,我还注意到活动执行器的数量为1,尽管我在spark_env.sh文件中给出了SPARK_WORKER_INSTANCES=2SPARK_WORKER_CORES=1

我有两个问题:
实际创建的numPartitions是否取决于执行器的数量
如何在当前设置中启动带有多个执行器的spark shell?

谢谢!

分区的数量不取决于执行器的数量-尽管有最佳实践(每个核心的分区(,但它不是由执行器实例决定的。

在从JDBC读取的情况下,为了使其并行读取,您需要一个分区列,例如:

spark.read("jdbc")
.option("url", url)
.option("dbtable", "table")
.option("user", user)
.option("password", password)
.option("numPartitions", numPartitions)
.option("partitionColumn", "<partition_column>")
.option("lowerBound", 1)
.option("upperBound", 10000)
.load()

这将使数据库中的查询与每个查询的10000/numPartitions结果并行。

关于你的第二个问题,你可以在这里找到所有的火花配置:https://spark.apache.org/docs/latest/configuration.html,(spark2shell--num executors,或configuration--conf-spark.executor.instances(。

指定执行器的数量意味着动态分配将关闭,所以要注意这一点。

最新更新