【发布时间】:2017-05-04 20:31:12
【问题描述】:
我知道默认情况下,spark中任务的分区数设置为200。我似乎无法改变这一点。我正在使用 spark 1.6 运行 jupyter。
我正在使用笔记本中的以下内容从蜂巢中加载一个包含大约 37K 行的相当小的表格
from pyspark.sql.functions import *
sqlContext.sql("set spark.sql.shuffle.partitions=10")
test= sqlContext.table('some_table')
print test.rdd.getNumPartitions()
print test.count()
输出确认了 200 个任务。从活动日志来看,它正在运行 200 个任务,这有点过头了。似乎上面的第 2 行被忽略了。所以,我尝试了以下方法:
test = sqlContext.table('gfcctdmn_work.icgdeskrev_emma_cusip_activity_bw').repartition(5)
并创建一个新单元格:
print test.rdd.getNumPartitions()
print test.count()
输出显示 5 个分区,但日志显示 200 个任务正在启动以进行计数,然后重新分区到 5 个。但是,如果我先将其转换为 RDD,然后返回 DataFrame,如下所示:
test = sqlContext.table('gfcctdmn_work.icgdeskrev_emma_cusip_activity_bw').repartition(5).rdd
并创建一个新单元格:
print test.getNumPartitions()
print test.toDF().count()
我第一次运行新单元时,它仍在运行 200 个任务。但是,我第二次运行新单元时,它运行了 5 个任务。
如何让代码在第一次运行时运行 5 个任务?
您介意解释一下为什么会这样吗(指定分区数,但它仍在默认设置下运行)?是不是因为默认的 Hive 表是使用 200 个分区创建的?
【问题讨论】:
-
Spark,确定性行为。选择一个... 更重要的是,如果您希望在 “第一次” 中强制执行 Spark 属性,则在启动时使用的配置中设置它——即在
$SPARK_HOME/conf/spark-defaults.conf或 on命令行,带有--conf <prop>=<value>。或者,如果您无法自定义 Jupyter 内核,则在 Notebbok 中,关闭“SparkContext”,然后使用修改后的 conf 重新创建它(但这有点棘手) -
我试过这个,但它对我不起作用。它仍在旋转 200 个任务。 pyspark --num-executors 2 --executor-memory=16G --conf spark.default.parallelism=15
标签: apache-spark pyspark spark-dataframe