0

我在具有 2 个内核和 16GB RAM 的单个节点上以独立模式设置了 Spark,以制作一些粗略的 POC。
我想使用val df = spark.read.format('jdbc')...option('numPartitions',n).load(). numPartitions当我尝试通过调用 a来测量读取不同值的表格所花费的df.rdd.count时间时,我发现无论我给出的值如何,时间都是相同的。我还注意到一个上下文 Web UI,即 Active executor 的数量为 1,即使我在 spark_env.sh 文件中给出了SPARK_WORKER_INSTANCES=2和。SPARK_WORKER_CORES=1

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

谢谢!

4

1 回答 1

2

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

如果从 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)。

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

于 2020-04-14T10:14:17.847 回答