无法在 pyspark 中设置随机分区的数量

Posted

技术标签:

【中文标题】无法在 pyspark 中设置随机分区的数量【英文标题】:Not able to set number of shuffle partition in pyspark 【发布时间】: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 【参考方案1】:

在笔记本的开头,执行以下操作:

from pyspark.conf import SparkConf
sc.stop()
conf = SparkConf().setAppName("test")
conf.set("spark.default.parallelism", 10)
sc = SparkContext(conf=conf)

当笔记本启动时,您已经为您创建了一个SparkContext,但您仍然可以更改配置并重新创建它。

至于spark.default.parallelism,我知道是你需要的,看看here:

RDD 中由转换返回的默认分区数,例如 用户未设置时加入、reduceByKey 和并行化。

【讨论】:

感谢您的建议。我试过这个,但我得到一个错误。重新创建上下文时 Py4JJavaError:调用 None.org.apache.spark.api.java.JavaSparkContext 时发生错误。 : org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Delegation Token 只能通过 kerberos 身份验证发布。当前 AuthenticationMethod: TOKEN) 好吧,对我来说它有效,你必须有不同的身份验证。快速搜索我看到this,他们在谈论外壳而不是笔记本,但有一个不推荐的解决方法......对不起,我无法真正帮助你,因为我什至无法重现它。祝你好运!

以上是关于无法在 pyspark 中设置随机分区的数量的主要内容,如果未能解决你的问题,请参考以下文章

在 R ~ Caret 包中设置树的数量

如何在pyspark中设置计数id的日期间隔?

无法在 Jupyter notebook-anaconda 中设置 spark home

Swift - 如何在水平 StackView 中设置可变数量按钮之间的间距?

在 Kafka 连接器中设置分区策略

带有 conda 集成的 pySpark 抛出错误 pyspark 无法识别