Spark on localhost

时间:2016-11-03 20:59:20

标签: apache-spark pyspark

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

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

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

另外(!),我的代码也非常简单,仅通过键对 20行进行分组并应用简单的地图操作

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

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

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

一些信息:

enter image description here

enter image description here

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

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

3 个答案:

答案 0 :(得分:3)

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

要解决此问题,您可以:

  1. 尝试使用速度更快的reduceByKey(上面的避免GroupByKey链接中还包含更多信息)。
  2. 使用DataFrames(而不是RDD),因为DF包括性能优化(DF GroupBy语句比RDD版本更快)。同样,当您使用Python时,可以避免PySpark RDD的Python到JVM问题。有关这方面的更多信息,请参阅PySpark Internals
  3. 顺便说一下,回顾上面的Spark UI图,#22指的是DAG中的任务#(不是执行的任务数)。

    HTH!

答案 1 :(得分:1)

我认为“postgresql”是解决这个难题的关键。

cbCtrl.DataBindings.Add( "Text", myBindingSource, ColDBName ); 可能是第一个真正使用数据的操作,因此它需要从外部数据库获取数据时执行时间更长。您可以通过在开头添加来验证它:

keyBy

如果我是对的,您需要优化数据库。它可能是:

  1. 网络问题(网络速度缓慢到数据库服务器)
  2. 此数据库上的复杂(和慢速)SQL(使用postgre shell尝试)
  3. DB服务器上的一些授权问题
  4. 您使用的JDBC驱动程序出现问题

答案 2 :(得分:0)

从我在运行spark时在系统中看到的情况开始:

当我们运行一个spark作业时,它会在内部创建map并减少任务并运行它们。在您的情况下,为了运行您拥有的数据,它创建了22个此类任务。我的数据量越大,数字就越大。

希望这有帮助。