Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spark streaming gc设置问题_Java_Apache Spark_Garbage Collection_Jvm_Spark Streaming - Fatal编程技术网

Java Spark streaming gc设置问题

Java Spark streaming gc设置问题,java,apache-spark,garbage-collection,jvm,spark-streaming,Java,Apache Spark,Garbage Collection,Jvm,Spark Streaming,我的逻辑如下 使用createDirectStream在Kafka中按日志类型获取主题 重新分区后,通过各种处理来处理日志 使用combineByKey为每种日志类型创建一个字符串(使用StringBuilder) 最后,按日志类型保存到HDFS 有很多添加字符串的操作,所以GC经常发生 在这种情况下,如何更好地设置GC ////////////////////// 有各种各样的逻辑,但我认为在做combineByKey时有一个问题 rdd.combineByKey[StringBuilder]

我的逻辑如下

  • 使用createDirectStream在Kafka中按日志类型获取主题

  • 重新分区后,通过各种处理来处理日志

  • 使用combineByKey为每种日志类型创建一个字符串(使用StringBuilder)

  • 最后,按日志类型保存到HDFS

  • 有很多添加字符串的操作,所以GC经常发生

    在这种情况下,如何更好地设置GC

    //////////////////////

    有各种各样的逻辑,但我认为在做combineByKey时有一个问题

    rdd.combineByKey[StringBuilder](
        (s: String) => new StringBuilder(s),
        (sb: StringBuilder, s: String) => sb.append(s),
        (sb1: StringBuilder, sb2: StringBuilder) => sb1.append(sb2)
    ).mapValues(_.toString)
    

    使用该
    combineByKey
    表达式可以做的最简单、影响最大的事情是调整所创建的
    StringBuilder
    的大小,以便在将字符串值合并到它时,它不必扩展其支持字符数组;通过从旧的备份阵列复制到新的备份阵列,调整大小会放大分配速率并浪费内存带宽。作为猜测,我会说选择结果数据集记录的字符串长度的第90个百分位

    第二件要注意的事情是(在收集了一些中间值的统计数据之后),当您调用
    sb1.append(sb2)
    时,您的合并器函数选择
    StringBuilder
    实例,该实例可以容纳另一个实例

    要注意的一件好事是使用Java8;当字符串和字符串缓冲区上有繁重的工作时,它的优化会产生显著的不同


    最后但并非最不重要的一点是,配置文件以查看您实际在何处度过周期。此工作负载(不包括您正在执行的任何其他自定义处理)不需要将大量对象(如果有)升级到旧代,因此,您应该确保年轻一代有足够的大小,并以并行方式收集。

    使用该
    combineByKey
    表达式可以做的最简单、影响最大的事情是调整您创建的
    StringBuilder
    的大小,以便在将字符串值合并到其中时不必扩展其支持字符数组;通过从旧的备份阵列复制到新的备份阵列,调整大小会放大分配速率并浪费内存带宽。作为猜测,我会说选择结果数据集记录的字符串长度的第90个百分位

    第二件要注意的事情是(在收集了一些中间值的统计数据之后),当您调用
    sb1.append(sb2)
    时,您的合并器函数选择
    StringBuilder
    实例,该实例可以容纳另一个实例

    要注意的一件好事是使用Java8;当字符串和字符串缓冲区上有繁重的工作时,它的优化会产生显著的不同

    最后但并非最不重要的一点是,配置文件以查看您实际在何处度过周期。此工作负载(不包括您正在执行的任何其他自定义处理)不需要将大量对象(如果有)升级到旧代,因此您应该确保年轻代具有足够的大小,并并行收集