某人,并未提他的名字,是因为看的视频是1年前的,视频里他吹得厉害。我看视频时,查了一下他在视频里说的要做到的东西,结果上网一查,就看到了很多人说他骗了钱后,就不管交了学费的人了。真假无从查起。但是无风不起浪。也真没查到他说的要做出来的东西发布出来。所以这里不那人的名字了。只把他说的知识拿过来,做些笔记。

一。Batch中Task处理时间大

Spark Streaming 的处理模式是按照 Batch Duration 进行 Micro Batch Computation 的,且如果上一批数据没有处理完的话是不会处理下一批数据的!! 这会导致几个结果:

1. 如果前面一个 Batch 数据量突然间特别大的话,就会导致计算的高度延迟,使得当前的 Batch 不能够得得到及时的计算

2. 在一个 Batch 处理的时候,如果 Task 处理的时间波动比较大(例如说:数据倾斜、数据的峰值,出错等),其它的 Task都已经处理完了,所以整个 Batch 处理就只是在等待这个Task处理完成,却不能够使用 Memory 和 Cores 等资源处理下一个 Batch 任务,会形成资源浪费。

3. JVM GC的巨大负担

解决方法: 不要等待。意思就是:无论 Batch Duration数据大小和处理的复杂度,都会立即完成当前 Batch的处理,然后立即去处理下一个 Batch的任务。

怎么做:Spark Streaming 的业务处理逻辑放在线程池中。Spark Streaming程序执行的时候业务逻辑就是以 Task 的方式放在线程池中的,所以可以最大化地复用线程,从而最佳化的使用硬件资源。模拟代码:

dstream.foreachRDD(rdd => {

rdd.foreachPartition( item => {

//业务逻辑处理部分,使用线程池。需要注意的是:线程数受限于物理硬件,所以需要根据实际情况设定线程池中的并发 Task 的个数

})

})

二。zookeeper 的 connection timeout 时间和Session timeout 的时间

在处理大数据量的情况下,GC 的时间很有可能要十几秒,这时,如果设置的 timeout 时间比较短的话(默认的connection timeout 是10秒,Session timeout 时间是6秒),就会出问题。

三。Spark on YARN

大的公司一般采用这种方式,因为还有其它的框架运行在YARN上,YARN 统一管理计算资源的分配。为了确保 Spark 能分配到足够的资源,推荐 https://mapr.com/blog/label-based-scheduling-hadoop-clusters/

四。Backpressure

设置限流器,每次Job结束后,计算吞吐量,更新限流器的值。可以看 JobScheduler, ReceiverInputDStream,RateController, RateLimiter,ReceiverTracker中的源码

五。在 End to End 的流处理程序中,把流处理的结果放入 Hbase。

往 HBase 中存储数据的过程如下: 对于每一次的数据插入操作都会放在内存的缓存 MemStore 中,MemStore达到上限的时候,HBase会将其中的数据输出到本地的名称为 StoreFile 的文件中。在HBase中是通过 Column Family 来组织数据的(其数据结构为 Store),也就是说每个 Column Family 中有一个Store, 而一个 Store 中有很多来自 StoreFile的文件,HBase的工作机制是当StoreFile达到一定上限的时候会使用线程对这些小的 StoreFile 合并成为大的 File。这就导致 HBase 插入数据非常高效。所以 HBase在生产环境下是;Streaming外部存储的一种非常理想的选择,尤其是在数据量特别大的时候且J2ee或者移动端要实时查询海量的 Spark Streaming处理结果就特别适合。

操作 HBase 的时候每次都是基于 Table 进行操作的,HTable 是 HBase 的客户端, HTable 的弊端在于适合单表操作,但是在多线程的读写操作下不是线程安全的。执行 Put 操作,如果是多个线程共享一个 HTable 实例的话,由于不是线程安全的,这会导致写到缓存区数据冲突。其实匀们在这里已经使用了线程池来维护 HTable,这个问题基本已经不存在了,但其实还是有一个非常重要的性能消耗点可以优化。在内部创建 HTable 的时候需要 HConnection,这个实例对象的创建是非常耗时的(其实 HTable是轻量级的消耗),此时此时我们可以做以下的考虑: 1. 只有一个 HConnection 实例对象,所有的 HTable 都基于穿上实例对象; 2. 基于 HConnection 对象实例,让所有的线程来共享。

六。 Spark Streaming 的几个意见

1. Duration 设置大一点值

2. 开启2~5个Receiver

3. Spark Streaming 使用的Cores的数量 = concurrentJob的数量 * Receiver的数量 * BatchDuration / blockInterval

七。防DDos攻击

在处理DDos攻击的时候,肯定会使用到 Windows 窗口操作,updateStateByKey等。选定的窗口大小和滑动时间,以前的项目中设定的窗口大小是一个小时,滑动窗口是5分钟。  如何面对网络风暴?这个时候因为数量流量不稳定,所以要开启BackPressure机制。

随着服务的运行历史数据越来越多,此时如何高速地读写数据成为一个非常大的瓶颈。客户采用的是Redis,当时从长久服务的角度来看,个人建议采用HBase或者Canssandra。

某人视频中提到的 Spark Streaming 优化的几点事项的更多相关文章

  1. Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN

    Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...

  2. Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南

    Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...

  3. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  4. 转:Sharethrough使用Spark Streaming优化实时竞价

    文章来自于:http://www.infoq.com/cn/news/2014/04/spark-streaming-bidding 来自于Sharethrough的数据基础设施工程师Russell ...

  5. Spark Streaming实践和优化

    发表于:<程序员>杂志2016年2月刊.链接:http://geek.csdn.net/news/detail/54500 作者:徐鑫,董西成 在流式计算领域,Spark Streamin ...

  6. 某人在企业中遇到的Spark问题记录[持续更新]

    https://github.com/ssg-7max/ssg 目前 ssg内公司内部 spark streaming 处理数据源是kafka 目前遇到最大的问题是,会延迟,例如我们配置1分钟让窗口计 ...

  7. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  8. Spark Streaming+Kafka

    Spark Streaming+Kafka 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端, ...

  9. Spark streaming消费Kafka的正确姿势

    前言 在游戏项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不 ...

随机推荐

  1. yield生成器的经典案例

    如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到.用计算机程序输出斐波那契數列的前 N 个数是一个非常简单的问题 ...

  2. struts2 框架 的环境搭建 与配置

    一,Struts2简介: 1,来由:Struts(金属支架),在程序中表示起支撑作用的通用程序代码,Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的. 2,解释:St ...

  3. linux命令学习笔记(6):rmdir 命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录 被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.) ...

  4. CCSpriteBatchNode CCSpriteFrameCache

    3.27 精灵集合类(CCSpriteBatchNode) //以纹理来创建一个精灵集合对象 static CCSpriteBatchNode* createWithTexture(CCTexture ...

  5. netsh wlan start hostednetwork

    常用的无线网命令: 一.开启系统承载网络模块和新建无线网络命令: netsh wlan set hostednetwork mode=allow ssid=wifi key=12345678说明:ss ...

  6. Operating System-Thread(1)What and Why Thread &&进程和线程的对比

    开始线程(Thread)之旅,作为程序员,打交道更多的是线程,各种多线程程序,并行编程都是以线程为基础进行的.本文主要内容: What and Why Thread 进程和线程的对比 一.What a ...

  7. python中如何定义main方法

    我们有时写的python模块需要自己测试, 简单方法就是定义main函数, 然后测试自己的模块接口. def main():      test_yourCode() if __name__ == & ...

  8. css基础知识一

    1.CSS (Cascding Style Sheet)层叠样式表 级联样式表 样式表 2.CSS作用: 修改页面中元素的显示样式 能够实现内容与表现的分离 提高代码的可重用性和可维护性 3.导入CS ...

  9. OpenStack安装后检查流程总结

    安装后检查 1. 确保服务正常运行 首先查看服务的运行状态: #service xxx status 为防止对子服务有疏漏,可使用ps + grep 查看: # ps aux |grep xx 2. ...

  10. 通过能别的主机连接yum库

    本地有两台主机,分别为:192.168.2.131/24和192.168.2.132/24,本地yum源只能连接互联网: 这两台设备的虚拟机配置如下: 现有一台主机:172.16.254.88/16可 ...