Scala 带BZIP2编解码器的Spark saveAsTextFile导致内存泄漏
我正在使用EMR5.5.0(Java1.8.0_121)上的Spark2.1.0和Thread作为资源管理器 我遇到了spark的一个问题,几个小时后,执行器在用完所有已配置容器的物理内存后被Thread杀死。 我发现这个问题的根源与Bzip2Codec有关,具体来说是:rdd.saveAsTextFile(路径,classOf[Bzip2Codec]) 如果删除压缩或将其更改为其他压缩编解码器,则不会产生问题 本人谨此陈辞:Scala 带BZIP2编解码器的Spark saveAsTextFile导致内存泄漏,scala,apache-spark,memory-leaks,spark-streaming,bzip2,Scala,Apache Spark,Memory Leaks,Spark Streaming,Bzip2,我正在使用EMR5.5.0(Java1.8.0_121)上的Spark2.1.0和Thread作为资源管理器 我遇到了spark的一个问题,几个小时后,执行器在用完所有已配置容器的物理内存后被Thread杀死。 我发现这个问题的根源与Bzip2Codec有关,具体来说是:rdd.saveAsTextFile(路径,classOf[Bzip2Codec]) 如果删除压缩或将其更改为其他压缩编解码器,则不会产生问题 本人谨此陈辞: spark-submit \ --deploy-mode clu
spark-submit \
--deploy-mode cluster \
--master yarn \
--executor-memory 1g \
--num-executors 1 \
--conf spark.yarn.executor.memoryOverhead=384 \
--conf spark.yarn.submit.waitAppCompletion=false \
--conf spark.streaming.backpressure.enabled=true \
--conf spark.streaming.kafka.maxRatePerPartition=300 \
--conf spark.streaming.dynamicAllocation.enabled=false \
--conf spark.dynamicAllocation.enabled=false \
--class com.kafkaStreaming.main.Main \
/path/to/jar.jar
它自己的代码非常简单,它从Kafka接收流并运行foreachRDD将其保存到S3:
import kafka.serializer.StringDecoder
import org.apache.hadoop.io.compress.BZip2Codec
import org.joda.time.format.DateTimeFormat
import org.joda.time.{DateTime, DateTimeZone}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext, Time}
object Main {
def main(args: Array[String]) {
val outputDirectory = "s3://bucketName/sparkOutput/"
val topic = "TopicName"
val topicsSet = topic.split(",").toSet
val kafkaBroker = 10.0.0.10:9092
val kafkaParams = Map[String,String](("metadata.broker.list" -> kafkaBroker))
val batchInterval = 5
val sparkConf = new SparkConf().setAppName("sparkStreaming_tests")
val ssc = new StreamingContext(sparkConf, Seconds(batchInterval))
val stream = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](
ssc, kafkaParams, topicsSet)
stream.map(_._2).foreachRDD {( rdd,time:Time) =>
val batchTime=new DateTime(time.milliseconds)
rdd.saveAsTextFile(
outputDirectory +
"/" + "part_date=" + batchTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd")) +
"/" + "part_hour=" + batchTime.toString(DateTimeFormat.forPattern("HH")) +
"/" + batchTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))
, classOf[BZip2Codec])
}
ssc.start()
ssc.awaitTermination()
}
}
在谷歌搜索时,我遇到了一个Jira:
有人遇到过这个问题吗?
对于这个问题是否有任何已知的解决方法