PySpark在亚马逊集群上非常慢

时间:2017-05-19 07:56:39

标签: python apache-spark pyspark

我正在开发一个Spark项目并尝试在亚马逊上的群集上执行应用程序。在小文件上性能也很慢。我不想要一个解决方案,只是对经验缓慢的可能原因的意见。

spark = SparkSession.builder.appName("appName").getOrCreate()
sc = spark.sparkContext

rec= sc.textFile(sys.argv[1])
#  rec= sc.parallelize(records.collect())

a= rec.map(lambda line: line.split("\t"))
          .filter(lambda x: int(x[6])>=4)
          .map(lambda x: (x[1],[x[2], x[6]]))
a=a.join(a)
   .filter(lambda (x,(a,b)): a[0]<b[0])
   .map(lambda (x,(b,a)): ((a[0],b[0]),x))
   .groupByKey()
   .filter(lambda (x,y): len(set(y))>2)
   .sortBy(lambda a: a[0])
   .saveAsTextFile(sys.argv[2])

2 个答案:

答案 0 :(得分:0)

PySpark或Spark通常适用于需要处理大量数据的用例。预计小数据的速度很慢。原因如下:

  1. 在PySpark中,取决于你需要多少个执行程序才能首先启动JVM。此外,在PySpark的情况下,还需要通过Python子流程创建额外的开销。 PySpark Internals
  2. 第二个原因是数据改组。您的数据可能会在网络中混乱。在本地情况下,数据在同一节点上计算。对于数据分发,调度程序需要首先确定需要放置数据的位置,然后再确定如何处理数据。
  3. 所以当你需要用“大数据”做事时,PySpark / Spark才会闪耀!我看到很多人起初非常失望,因为他们说Spark很慢但是他们只用它来获得非常小的数据量。希望这有帮助!

答案 1 :(得分:0)

这个代码序列本身可能会让你最悲伤:

records = sc.textFile(sys.argv[1])
rec= sc.parallelize(records.collect())

为什么呢?你正在通过spark context textfile函数读取文件作为RDD,然后它将在整个集群中实现,然后通过调用records.collect()告诉集群发送所有数据,这是踢球者。对于驱动程序(无论什么机器启动该作业),最后您将从本地收集的列表重新生成RDD。只需使用记录RDD代替rec RDD

编辑: 看起来你正在做一个自己的交叉连接。这是为了什么目的?

按键分组强制所有数据的混洗,而不是按键减少。

停止使用SparkContext;它是为了向后兼容。使用你的sparksession的.read.option("delimiter", "\t").csv(file path)将创建一个DataFrame而不是RDD,将制表符分隔的行解析为通用Row对象,然后通过使用DataFrame API可以获得更好的性能(由Tungsten和Catalyst提供) 。这是非常有用的,因为你使用PySpark因为使用Spark 2.x与DataFrames和Python,性能与JVM上的scala一致,而使用RDD与Python意味着Python解释器完成工作(re Scala更快) )。