spark 将 dataframe 写到 hdfs 为什么会如此耗时? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
wudc
V2EX    程序员

spark 将 dataframe 写到 hdfs 为什么会如此耗时?

  •  
  •   wudc 2017-12-25 16:25:23 +08:00 7442 次点击
    这是一个创建于 2926 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司这边有个数据聚合的任务,聚合的过程中遇到了数据倾斜,通过局部聚合和全局聚合的方式解决,速度提升了很多,12G 的数据大概需要 15 分钟左右聚合完,但是在最后以 json 格式的文件存储到 hdfs 上时特别耗时,而且偶尔会报内存溢出,spark.default.parallelism 设置的是 200,最后保存时是这么写的:df.repartition(20).write.json(savePath),求 spark 大神指点我哪里有问题,该怎么解决这个问题?谢谢。
    18 条回复    2017-12-26 16:24:21 +08:00
    linuxchild
        1
    linuxchild  
       2017-12-25 16:54:10 +08:00
    压缩一下再写试试
    wudc
        2
    wudc  
    OP
       2017-12-25 17:22:51 +08:00
    @linuxchild 嗯,谢谢,我加上了这段代码 df.persist(StorageLevel.MEMORY_AND_DISK_SER),现在程序在跑
    F281M6Dh8DXpD1g2
        3
    F281M6Dh8DXpD1g2  
       2017-12-25 17:25:25 +08:00
    df.repartition(20) 这样不是只起二十个 partition 在写么
    直接 df.write.json 试试?
    wudc
        4
    wudc  
    OP
       2017-12-25 18:32:42 +08:00
    @liprais 想最后把结果写到 20 个文件中
    mind3x
        5
    mind3x  
       2017-12-25 18:35:51 +08:00
    用 coalesce(20) 试试
    zhusimaji
        6
    zhusimaji  
       2017-12-25 18:39:03 +08:00 via iPhone
    @wudc 你这个只是数据持久化
    zhusimaji
        7
    zhusimaji  
       2017-12-25 18:40:00 +08:00 via iPhone
    @wudc 可以看下 spark job 看看卡在哪了
    Mondoz
        8
    Mondoz  
       2017-12-25 18:46:45 +08:00
    同 coalesce
    wudc
        9
    wudc  
    OP
       2017-12-25 18:47:36 +08:00
    @zhusimaji 卡在 df.repartition(20).write.json(savePath)这行了,数据量比较小时还可以但是数据量一大就栈溢出
    wudc
        10
    wudc  
    OP
       2017-12-25 18:49:06 +08:00
    @Mondoz
    @mind3x
    好的,改成 coalesce 已经在测试,谢谢。
    F281M6Dh8DXpD1g2
        11
    F281M6Dh8DXpD1g2  
       2017-12-25 19:20:27 +08:00
    可以先 df.repartition(20) 看看执行计划
    然后你就明白为啥这么慢了
    wudc
        12
    wudc  
    OP
       2017-12-25 19:28:13 +08:00
    @liprais 嗯,明白了,去掉 reparation 确实快了不少,谢谢!
    zhusimaji
        13
    zhusimaji  
       2017-12-25 22:43:30 +08:00 via iPhone
    @wudc 一般情况下不要指定分区数,因为这个都会自动计算出合理的分区,分区设置的过少,必然导致每个 job 处理的时间变长
    wudc
        14
    wudc  
    OP
       2017-12-26 13:46:32 +08:00
    @zhusimaji 嗯嗯,听你这么说我明白了,我分区是想防止过多结果文件的产生,现在看来有点画蛇添足了。
    wudc
        15
    wudc  
    OP
       2017-12-26 13:47:55 +08:00
    @zhusimaji 我这程序在处理大数据量的聚合时偶尔会报 OOM 内存溢出,您对此有什么比较好的解决方法吗?
    zhusimaji
        16
    zhusimaji  
       2017-12-26 15:23:43 +08:00
    @wudc 不知道你是不是在 yarn 上执行,如果内存够的情况下给每个 executer 分配内存大一点
    zhusimaji
        17
    zhusimaji  
       2017-12-26 15:26:06 +08:00
    oom 产生的原因很多,最好根据打印的 log 日志去找相对应的资料
    wudc
        18
    wudc  
    OP
       2017-12-26 16:24:21 +08:00
    @zhusimaji 是在 yarn 上,executor-cores、num-executors 和 executor-memory 已经设置成当前集群所允许的最大值了,我再想想吧,还是非常感谢你的指导。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     930 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 19:32 PVG 03:32 LAX 11:32 JFK 14:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86