Spark on localhost

gui*_*cgs 9 apache-spark pyspark

出于测试目的,虽然我没有生产集群,但我在本地使用spark:

print('Setting SparkContext...')
sconf = SparkConf()
sconf.setAppName('myLocalApp')
sconf.setMaster('local[*]')
sc = SparkContext(conf=sconf)
print('Setting SparkContext...OK!')
Run Code Online (Sandbox Code Playgroud)

另外,我使用的是一个非常小的数据集,在postgresql数据库中只有20行(~2kb)

另外(!),我的代码也很简单,只用一个键分组20行并应用一个简单的map操作

params = [object1, object2]
rdd = df.rdd.keyBy(lambda x: (x.a, x.b, x.c)) \
                          .groupByKey() \
                          .mapValues(lambda value: self.__data_interpolation(value, params))


def __data_interpolation(self, data, params):
    # TODO: only for testing
    return data
Run Code Online (Sandbox Code Playgroud)

困扰我的是整个执行大约需要5分钟!

检查Spark UI,我发现大部分时间花在了第6阶段:byKey方法.(第7阶段,collect()方法也很慢......)

一些信息:

在此输入图像描述

在此输入图像描述

这些数字对我没有意义......为什么我需要22个任务,执行54秒,处理少于1 kb的数据

它是一个网络问题,试图弄清楚localhost的IP地址?我不知道......有什么线索吗?

Den*_*Lee 3

代码片段性能下降的主要原因似乎是由于使用了groupByKey(). 问题在于groupByKey,它最终会打乱所有键值对,导致大量不必要的数据被传输。解释这个问题的一个很好的参考是避免 GroupByKey

要解决此问题,您可以:

  1. 尝试使用reduceByKey哪个应该更快(更多信息也包含在上面的避免 GroupByKey 链接中)。
  2. 使用 DataFrame(而不是 RDD),因为 DF 包括性能优化(并且 DF GroupBy 语句比 RDD 版本更快)。此外,当您使用 Python 时,您可以避免 PySpark RDD 的 Python 到 JVM 问题。有关这方面的更多信息可以在PySpark 内部查看

顺便说一下,查看上面的 Spark UI 图,#22 指的是 DAG 中的任务#(而不是执行的任务数)。

哈!