Spark Streaming 数据产生与导入相关的内存分析

  • 时间:
  • 浏览:1
  • 来源:uu直播快3平台

StorageLevel 的配置大大问题

Spark里除了这俩 Dynamic,还有有好多个那末来越多那末来越多Dynamic Allocation,也那末来越多那末来越多Executor数量会根据资源使用情况,自动伸缩。我其实 蛮喜欢Spark这俩特色的。具体的还不都都可以 查找下相关设计文档。

接下来一篇文章会讲这俩处置方案。

首先自然要说下currentBuffer,这俩60 ms期间你从Kafka接受的数据足够大,则足以把内存承包了。这俩currentBuffer使用的并都不 spark的storage内存,那末来越多那末来越多有限的用于运算存储的内存。 默认应该是 heap*0.4。除了把内存搞爆掉了,还有有好多个是GC。意味着receiver所在的Executor 极容易挂掉,处置传输速率也巨慢。 这俩你在SparkUI发现Receiver挂掉了,考虑有那末 这俩是这俩大大问题。

到目前为止,整个过程不想有那末来越多内存消耗,正常的有好多个线性调用。所有错综复杂的数据价值形式都隐含在 BlockGenerator 中。

启动Spark Streaming(后续缩写为SS)后,SS 会选择一台Executor 启动ReceiverSupervisor,这俩标记为Active情况。接着按如下步骤处置:

blockPushingThread 负责从 blocksForPushing 获取数据,这俩写入 BlockManager 。这里很蛋疼的事情是,blockPushingThread只写他自己所在的Executor的 blockManager,也那末来越多那末来越多每个batch周期的数据都不 被 有好多个Executor给扛住了。 这是意味着内存被撑爆的最大风险。 也那末来越多那末来越多说,每个batch周期接受到的数据最好暂且超过接受Executor的内存(Storage)的一半。这俩是你受的。我发现在数据量很大的情况下,最容易挂掉的那末来越多那末来越多Receiver所在的Executor了。  建议Spark-Streaming团队最好是能将数据写入到多个BlockManager上。

blocksForPushing

BlockGenerator 会错综复杂些,这里好多个点,

blocksForPushing 这俩是作为currentBuffer 和BlockManager之间的中转站。默认存储的数据最大还不都都可以 达到  10*currentBuffer 大小。一般不打这俩,除非你的 spark.streaming.blockInterval 设置的比10ms 还小,官方推荐最小也要设置成 60 ms,你就暂且搞对抗了。那末来越多那末来越多这块不想太担心。

我这篇文章会分好多个点来描述Spark Streaming 的Receiver在内存方面的表现。

另外还好多个值得注意的大大问题:

另外有点儿说明下,大伙仅仅讨论的是High Level的Kafka Stream,也那末来越多那末来越多输入流通过如下土辦法 创建:

步骤描述完了,大伙看看有好多个值得注意的地方。

currentBuffer

这俩不开启WAL的情况下。

blockPushingThread

我在部门尽力推荐使用Spark Streaming做数据处置,目前这俩应用在日志处置,机器学习等领域。这期间也遇到不少大大问题,尤其是Kafka在接受到的数据量非常大的情况下,会有这俩内存相关的大大问题。