为什么我的简单的Spark应用程序的运行速度这么慢?(Why my simple Spark app

2019-10-31 07:02发布

我想count通过星火API mllib的FP增长所产生的频繁项集。 我的Spark是1.5.1版本。 下面是我的代码:

#!/usr/bin/python 
from pyspark.mllib.fpm import FPGrowth
from pyspark import SparkContext,SparkConf
from pyspark import HiveContext
import os
os.environ['PYSPARK_PYTHON']='/usr/bin/python'
appName = "FP_growth"
sc = SparkContext()
sql_context = HiveContext(sc)

def read_spu(prod):#prod_code):
    sql = """
        select 
        t.orderno_nosplit, 
        t.prod_code, 
        t.item_code, 
        sum(t.item_qty) as item_qty
        from ioc_fdm.fdm_dwr_ioc_fcs_pk_spu_item_f_chain t
        where t.prod_code='%s'
        group by t.prod_code, t.orderno_nosplit, t.item_code  """%prod
    spu_result = sql_context.sql(sql)
    return spu_result.cache()

if __name__ == '__main__':
    spu=read_spu('6727780')  
    conf=0.7             
    trans=spu.rdd.repartition(100).map(lambda x: (x[0],x[2])).groupByKey().mapValues(list).values().cache()
    model = FPGrowth.train(trans, 0.01, 100) 
    freq_count = model.freqItemsets().count()
    print 'freq_count:',freq_count  
    sc.stop()

输入数据从Hadoop的读取,数据不是非常大,大约只有20000行。 然而,脚本作品非常的阶段很慢.count 。 我不知道为什么。 从性能,现在看来,这是因为数据歪斜。 但输出数据并不大(只有约每任务100KB)。

群集具有320芯和1.56总共T个存储器(未只有一个用户)的8个节点。 我的火花提交脚本是spark-submit --master yarn-cluster --executor-memory 30g --num-executors 20 --executor-cores 5 FP_growth.py

运行时,附件是性能的丝网印刷:

资源使用

活跃阶段

任务

Answer 1:

repartition(100)看起来并不像一个好主意,你可以检查哪些阶段是最耗时。 由于只有20000条记录。 遣返应该将它们分割成200个记录每个分区。

如果数据尺寸不是很大,你并不需要在所有的遣返工作。 或用40-60分区(2或3)*无遗嘱执行人的尝试。



文章来源: Why my simple Spark application works so slow?