zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/moonlightml/p/9908183.html
Copyright © 2011-2022 走看看