Scala 基本火花-是什么导致程序运行缓慢?
我是新来的Scala 基本火花-是什么导致程序运行缓慢?,scala,apache-spark,pyspark,Scala,Apache Spark,Pyspark,我是新来的pyspark。致力于国情咨文地址数据集(SOU)(我在机器学习课程中获得了该数据集)[*] 简而言之,我的问题是: 我比较了在SOU上使用pyspark中的一些非常基本的操作与使用更大的随机数据集。由于某种原因,随机数据集的处理速度要快得多关于spark的工作原理,我在这里遗漏了什么,如何解释这种差异?我处理SOU数据集的方式可能有哪些错误,导致处理速度慢? 所有的代码和输出都在这个笔记本中,我比较了数据集,以表明它们是相似的,但运行时间相差很大[**] 稍后添加:这是程序的一部分(
pyspark
。致力于国情咨文地址数据集(SOU)(我在机器学习课程中获得了该数据集)[*]
简而言之,我的问题是:
我比较了在SOU上使用pyspark
中的一些非常基本的操作与使用更大的随机数据集。由于某种原因,随机数据集的处理速度要快得多关于spark
的工作原理,我在这里遗漏了什么,如何解释这种差异?我处理SOU数据集的方式可能有哪些错误,导致处理速度慢?
所有的代码和输出都在这个笔记本中,我比较了数据集,以表明它们是相似的,但运行时间相差很大[**]
稍后添加:这是程序的一部分(稍有不同的版本)
详细说明 0)国情咨文地址数据集具有以下形式
+--------------------+--------------------+----+
| president| text|year|
+--------------------+--------------------+----+
| James Monroe| Fellow-Citizens ...|1821|
| William McKinley| To the Senate an...|1897|
|Dwight D. Eisenhower|[Delivered in per...|1960|
| Calvin Coolidge|Since the close o...|1923|
| James Madison| Fellow-Citizens ...|1816|
其中text
是演讲的内容
1)我为整个数据集提供了一个单词列表(或字典)V[I]
(留下大约2000个独特的单词,它们既不太罕见,也不太常见)
2)使用上述字典,我将每个语音文本[k]
表示为整数数组vec[I]
。其中vec[i]
统计单词V[i]
在text[k]
中出现的次数
3)我想通过比较代表演讲的向量之间的距离来比较演讲
4)我使用rdd
class[***]的cartesian
方法查找所有成对演讲之间的距离。构造笛卡尔积需要太长的时间来处理(即使是在SOU数据集的一个小的子样本上),但当我在随机较大的rdd
向量上运行相同的代码时就不需要了
深入挖掘,我试图了解是什么导致了这个问题。我已经模仿了同样的步骤,在由一组随机向量组成的rdd
上应用cartesian
[*]我发现了一个类似的数据集 [**]读取随机数据集
6.07899999619秒
vs SOU数据集24.2050001621秒
。采用笛卡尔坐标是3.29400014877秒
vs37.8359999657秒
)
[***]一件显而易见的事情可能是分区的数量不同。如果您直接在tar.gz中阅读,spark可能只会将其放在一个分区中。@jamborta谢谢!我检查了两个
rdd
都使用了1个分区,这样差异就无法解释差异。我相信有一些基本的错误,我做的,完整的数据集只有23兆字节,我只看它的10%,仍然需要很长的时间来处理。。。我一定是在做一些非常低效的事情,因为我所有的操作都是非常基本的,肯定有一些简单的事情我做错了。。。我已经用.getNumPartitions()
查询相关的rdd
s更新了我的Jupyter笔记本。我在原始帖子中添加了程序的DAG图,以防有帮助。Ok。我的第二个猜测是,SOU数据是从磁盘读取的,而随机数据是在内存中创建的,因此存在差异。在进行笛卡尔运算之前,尝试将.persist()
添加到您的sourdd。我认为17s vs 5s是因为linewords\u tmp\u 2。take
是缓存结果后您调用take
的第一个实例,因此它会执行缓存以及该行DAG上游的所有其他步骤(可能还包括读取位)。至于笛卡尔函数,根据实现的不同,Spark会在DAG中重复前面的一些步骤,如果对每一行重复这些步骤,这可能是非常重要的。一件显而易见的事情可能是分区的数量不同。如果您直接在tar.gz中读取,Spark可能只会将其放在一个分区中。@jamborta Thanks!我检查了两个rdd
都使用了1个分区,这样差异就无法解释差异。我相信有一些基本的错误,完整的数据集只有23兆字节,我只看了其中的10%,但处理起来仍然需要很长时间……我一定做了一些非常低效的事情,因为我所有的操作都非常复杂基本的,一定有一些简单的事情我做错了…我用.getNumPartitions()更新了我的Jupyter笔记本
查询相关的rdd
s。我在原始帖子中添加了程序的DAG图,以防它有所帮助。好的。我的第二个猜测是,您的SOU数据是从磁盘读取的,而您的随机数据是在内存中创建的,因此存在差异。请尝试添加.persist()
在你做笛卡尔坐标之前给你的SOU RDD。我认为17s vs 5s是因为linewords\u tmp\u 2。take
是缓存结果后你调用take
的第一个实例,所以它会缓存该行以及DAG中上游的所有其他步骤(可能也包括读取位)。至于笛卡尔坐标系,根据实现情况,Spark将在DAG中重复前面的一些步骤,如果对每一行重复这些步骤,则可能是实质性的。