某人视频中提到的 Spark Streaming 优化的几点事项
某人,并未提他的名字,是因为看的视频是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 优化的几点事项的更多相关文章
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- 转:Sharethrough使用Spark Streaming优化实时竞价
文章来自于:http://www.infoq.com/cn/news/2014/04/spark-streaming-bidding 来自于Sharethrough的数据基础设施工程师Russell ...
- Spark Streaming实践和优化
发表于:<程序员>杂志2016年2月刊.链接:http://geek.csdn.net/news/detail/54500 作者:徐鑫,董西成 在流式计算领域,Spark Streamin ...
- 某人在企业中遇到的Spark问题记录[持续更新]
https://github.com/ssg-7max/ssg 目前 ssg内公司内部 spark streaming 处理数据源是kafka 目前遇到最大的问题是,会延迟,例如我们配置1分钟让窗口计 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark Streaming+Kafka
Spark Streaming+Kafka 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端, ...
- Spark streaming消费Kafka的正确姿势
前言 在游戏项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从kafka中不 ...
随机推荐
- hdu 2044 一只小蜜蜂...(简单dp)
一只小蜜蜂... Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 5_Singleton 游戏开发中的单例模式
强制类只有一个实例 提供全局的访问 ###为什么使用: ``` 如果没有地方访问这个类,则不会创建实例 静态类在main之前实例化, 可以尝试Lazy initialization 派生单例类, 获得 ...
- 数据交换格式XML和JSON对比
1.简介: XML:extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组 ...
- tensorflow CUDA 9.0安装成功
berli@berli-dev:~/tensorflow$ bazel-bin/tensorflow/examples/label_image/label_image 2017-12-18 00:04 ...
- [原]NYOJ-开灯问题-77
大学生程序代写 //http://acm.nyist.net/JudgeOnline/problem.php?pid=77 /*题目77题目信息运行结果本题排行讨论区开灯问题 时间限制:3000 ms ...
- oracle rac搭建
(一)环境准备 主机操作系统 windows10 虚拟机平台 vmware workstation 12 虚拟机操作系统 redhat 5.5 x86(32位) :Linux.5.5.for.x86. ...
- UIButton常见用法
//UIButton是iOS中用来响应用户点击的控件,既可以显示文字,也可以显示图片,也可以处理用户交互 //UIButton的创建,一般采用类方法来创建,不需要释放 //UIButton 也是UIC ...
- 数据库:mysql 获取刚插入行id[转]
我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但在多线程情况下,就不行了. 下面介 ...
- Dexdump 无法正常反编译问题
WIN环境下无法正常运行,提示Unable open XXX as zip 解决方案:使用APKTOOL + JD-GUI进行替代反编译
- 【总结整理】JavaScript的DOM事件学习(慕课网)
事件:在文档或者浏览器窗口中发生的一些,特定的交互瞬间 HTML和JavaScript的交互通过事件 来实现 比如:1.滚动条向下滑动,加载图片 2.图片轮播,鼠标由2-5页调换 本章内容1.理解事件 ...