火花分区/执行程序不一致命令行与jupyter

时间:2018-07-05 18:33:52

标签: apache-spark pyspark apache-spark-sql

我不太确定该问题的标题-很高兴获得建议的更好的摘要

我很想找出原因,为什么Jupyter可以完成简单的Spark工作,但是在命令行中却没有足够的执行程序来执行。

我要做什么:我有大量数据(<1TB),我需要从中提取少量数据(〜1GB)并另存为实木复合地板。

我遇到的问题:当我从命令行运行简陋的代码时,我得到的执行程序与最终分区一样多,鉴于最终分区很小,因此理想情况下是这样。相同的精确代码在Jupyter的同一集群中也可以正常工作,在该集群中,它可以在整个集群中执行> 10k个任务。命令行版本永远不会进行。由于除了报告缺少进度外,它不会生成任何日志,因此我不确定在哪里可以挖掘更多日志。

我尝试了python3 mycode.py和spark-submit mycode.py,但有很多变化,但没有用。我的集群已配置了dynamicAllocation。

import findspark
findspark.init('/usr/lib/spark/')
from pyspark.sql import SparkSession

spark = SparkSession.builder.enableHiveSupport().getOrCreate()
data = spark.read.parquet(<datapath>).select(<fields>)
subset = [<list of items>]
spark.sparkContext.broadcast(subset)
data.filter(field.isin.(subset)).coalesce(1).write.parquet("output")

**编辑:原始版本错误地具有repartition(1)而不是合并。

在这种情况下,从命令行运行,我的进程将得到一个执行程序。

在我的日志中,我得到的唯一真实提示是

WARN TaskSetManager: Stage 1 contains a task of very large size (330 KB). The maximum recommended task size is 100 KB.

鉴于缺乏分配的资源,这很有意义。

我尝试使用spark-submit运行时设置手动强制执行程序的数量。在这种情况下,它将以我的初始设置开始,然后立即开始降低它们,直到只有一种设置没有任何进展。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我最终在这个电话上给朋友打电话...

在JupyterHub中运行良好但未通过命令行运行的代码实质上是:

  • 阅读实木复合地板,
  • 过滤一些小字段
  • coalesce(1)
  • 写实木复合地板

我假设结盟(1)和repartition(1)应该具有相同的结果-即使结盟(N)和repartition(N)没有相同-假设它们都进入一个分区。

据我的朋友说,Spark有时会将coalcece(1)优化为一个任务,这就是我所看到的行为。通过将其更改为repartition(1),一切正常。

我仍然不知道为什么它在JupyterHub中可以正常工作-已经完成了20多次实验-从来没有在命令行上-也没有20多次实验。

但是,如果您想以这种方式将数据湖带入数据池,请使用repartition(1)或repartition(n)(n较小),而不是合并。