分享

spark streaming 涨内存排查过程与疑问

邓立辉 发表于 2016-4-27 17:03:33 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 14953
我用spark streaming +kafka +hbase在standalone上处理用户的一些查询。下面是我观察到的现象:
1、发现每次查询每个节点都会涨内存,只涨不降。
2、参考网上的spark gc优化,发现用哪种gc机制涨得都更厉害,而且gc耗时特备长。默认什么都不调整时涨得最慢,性能最好。
3、当我把节点内存由8g降到4g,gc的时间返回会很短。

4、我尝试把rdd的partition增多到原来1倍,这样每个partition中的数据就会降低一倍。这样内存涨得明显变慢了。


疑问:
1、配置SPARK_JAVA_OPTS,打开gc日志,但是在spark-root-org.apache.spark.deploy.master.Master-1-master30.out、spark-root-org.apache.spark.deploy.worker.Worker-1-master30.out、stderr、stdout都看不到gc的日志信息
2、为什么总量一样的数据,分区越多,内存涨得就越慢,难道是因为每个分区的数据多到一定程度就会走什么策略,导致涨内存。
3、我把程序抓了dump,用jhat分析了下,发现会有大量的rdd里的tuple没有释放,但是我都显示的调用rdd.unpersist(ture)了。而且我把用到的打的变量都置null了。这是为什么?


已有(2)人评论

跳转到指定楼层
sstutu 发表于 2016-4-27 23:01:19
spark本身比较吃内存的,如果没有释放的,肯定会只涨不降的。

对于分区,可能跟集群的并行度有关系,最大限度的利用集群,更深层的原因,正在查找。

配置SPARK_JAVA_OPTS,打开gc日志,但是在spark-root-org.apache.spark.deploy.master.Master-1-master30.out、spark-root-org.apache.spark.deploy.worker.Worker-1-master30.out、stderr、stdout都看不到gc的日志信息
需要运行spark程序,并且查看日志
$SPARK_HOME/conf/log4j.properties
日志位置
log4j.rootLogger=${spark.root.logger}


更多设置
spark.root.logger=WARN,console

log4j.rootLogger=${spark.root.logger}

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d (%t) [%p - %l] %m%n



回复

使用道具 举报

邓立辉 发表于 2016-4-28 09:17:53
sstutu 发表于 2016-4-27 23:01
spark本身比较吃内存的,如果没有释放的,肯定会只涨不降的。

对于分区,可能跟集群的并行度有关系,最 ...

我对比一个节点内存由3g涨到5.3g内存的变化,发现内存涨幅比较大的是这几个。 java.util.HashMap$Node
java.util.Hashtable$Entry
[Ljava.util.HashMap$Node;
[Ljava.util.concurrent.ConcurrentHashMap$Node
[Ljava.util.Hashtable$Entry;

光这几个涨了1.3g,但是我没有用到map,就用了个list。不知道是哪用到这些东西。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条