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

Does the Spark Shell JDBC read numPartitions value depend on the number of executors?

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

这会将来自数据库的查询并行化为每个查询的 10,000/numPartitions 个结果。

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

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