• spark性能调优--jvm调优(转)


    一.问题切入

    调用spark 程序的时候,在获取数据库连接的时候总是报  内存溢出 错误

    (在ideal上运行的时候设置jvm参数 -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=1024M,不会报错)

    二.jvm参数 和 saprk 参数 和内存四区 解读

    1.内存四区

       1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

       2、堆区(heap:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回  收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

       3、数据区:主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。

            全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的  另一块区域。 程序结束后有系统释放

            常量区:常量字符串就是放在这里的。 程序结束后由系统释放

       4、代码区:存放函数体的二进制代码。

    参考: http://blog.csdn.net/wu5215080/article/details/38899259

    2.jvm 参数

    -Xms512m -Xmx1024m-XX:PermSize=512m -XX:MaxPermSize=1024M

    -Xms                            JVM初始分配的堆内存                                               默认是设备物理内存的 1/64   

    -Xmx                            JVM最大允许分配的堆内存,按需分配                        默认是设备物理内存的 1/4  

    -XX:PermSize               JVM初始分配的非堆内存                                            默认是设备物理内存的 1/64

    -XX:MaxPermSize        JVM最大允许分配的非堆内存                                      默认是设备物理内存的 1/4  

    参考: http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html

    3.spark参数

      -- driver-memory : driver运行的内存大小,默认1G  driver:sparkcontext ,sqlContext等运行的地方, sparkcontext ,sqlContext 一般运行在栈内存

      -- executor-memory : executor的内存大小,默认1G   executor: rdd 等运行的地方 ,rdd 一般运行在栈内存    

    conf spark.storage.memoryFraction=0.3     spark用于缓存rdd的内存百分比(剩下的内存用来保证任务运行时各种其它内存空间的需要),默认0.6(和运行在堆或栈没有关系)

    得出:

    栈内存   正比于 driver-memory : 内存被 sparkcontext,sqlContext 等固定占用,和数据库连接没有多大关系

    栈内存  正比于  executor-memory ;  executor-memory 分两种: rdd 和其他(包含获取获取 数据库连接的内存)

    三.问题分析和解决

    方向:增大executor-memory 和减小 conf spark.storage.memoryFraction 的值 ,根据具体环境而定

    命令方式:

    nohup spark-submit

    --masteryarn 

    --executor-memory 1024M

    --confspark.storage.memoryFraction=0.3

    --classcom.xiaopeng.bi.gamepublish.GamePublishKpi

    /home/hduser/projs/xiaopeng_bi.jar60 >> /home/hduser/projs/logs/gamepublishkpi.log &

    代码方式:

     val sparkConf = newSparkConf().setAppName(this.getClass.getName.replace("$",""))

         .set("spark.default.parallelism", "60") //  1. 调节并行度

         .set("spark.serializer","org.apache.spark.serializer.KryoSerializer") // 3.序列化方式

         .set("spark.shuffle.consolidateFiles", "true")// 4. shuffle 过程中  合并小文件

         .set("spark.storage.memoryFraction", "0.4");// 5.cache占用的内存占比

         .set("spark.sql.shuffle.partitions", "60")// 6.shuffle 时 partion的个数
    ---------------------
    作者:kequanjade
    原文:https://blog.csdn.net/keyuquan/article/details/72629605

  • 相关阅读:
    HDS推出HUS中端阵列 文件、块和对象统一存储
    Volume Shadow Copy Service(VSS)如何工作
    vmware备份
    vdp介绍
    DFS研究
    重设域管理员密码-window server 2008 R2
    Using LACP with a vSphere Distributed Switch 5.1
    To LACP or not to LACP (on a 5.1 vDS)
    iSCSI Network Designs: Part 5 – iSCSI Multipathing, Host Bus Adapters, High Availability and Redundancy
    Multipathing for Software iSCSI
  • 原文地址:https://www.cnblogs.com/moonlightml/p/9908183.html
Copyright © 2020-2023  润新知