V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wudc
V2EX  ›  程序员

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

  •  
  •   wudc · 2017-12-25 16:25:23 +08:00 · 7045 次点击
    这是一个创建于 2551 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司这边有个数据聚合的任务,聚合的过程中遇到了数据倾斜,通过局部聚合和全局聚合的方式解决,速度提升了很多,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),现在程序在跑
    liprais
        3
    liprais  
       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 已经在测试,谢谢。
    liprais
        11
    liprais  
       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   ·   实用小工具   ·   1753 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:31 · PVG 00:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.