我正在开发一个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])
答案 0 :(得分:0)
PySpark或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更快) )。