Spark Streaming实时处理应用
1 框架一览
事件处理的架构图如下所示。
2 优化总结
当我们第一次部署整个方案时,kafka和flume组件都执行得非常好,但是spark streaming应用需要花费4-8分钟来处理单个batch。这个延迟的原因有两点,一是我们使用DataFrame来强化数据,而强化数据需要从hive中读取大量的数据; 二是我们的参数配置不理想。
为了优化我们的处理时间,我们从两方面着手改进:第一,缓存合适的数据和分区;第二,改变配置参数优化spark应用。运行spark应用的spark-submit命令如下所示。通过参数优化和代码改进,我们显著减少了处理时间,处理时间从4-8分钟降到了低于25秒。
/opt/app/dev/spark-1.5.2/bin/spark-submit \
--jars \
/opt/cloudera/parcels/CDH/jars/zkclient-0.3.jar,/opt/cloudera/parcels/CDH/jars/kafka_2.10-0.8.1.1.jar,\
/opt/app/dev/jars/datanucleus-core-3.2.2.jar,/opt/app/dev/jars/datanucleus-api-jdo-3.2.1.jar,/opt/app/dev/jars/datanucleus-rdbms-3.2.1.jar \
--files /opt/app/dev/spark-1.5.2/conf/hive-site.xml,/opt/app/dev/jars/log4j-eir.properties \
--queue spark_service_pool \
--master yarn \
--deploy-mode cluster \
--conf "spark.ui.showConsoleProgress=false" \
--conf "spark.driver.extraJavaOptions=-XX:MaxPermSize=6G -XX:+UseConcMarkSweepGC -Dlog4j.configuration=log4j-eir.properties" \
--conf "spark.sql.tungsten.enabled=false" \
--conf "spark.eventLog.dir=hdfs://nameservice1/user/spark/applicationHistory" \
--conf "spark.eventLog.enabled=true" \
--conf "spark.sql.codegen=false" \
--conf "spark.sql.unsafe.enabled=false" \
--conf "spark.executor.extraJavaOptions=-XX:+UseConcMarkSweepGC -Dlog4j.configuration=log4j-eir.properties" \
--conf "spark.streaming.backpressure.enabled=true" \
--conf "spark.locality.wait=1s" \
--conf "spark.streaming.blockInterval=1500ms" \
--conf "spark.shuffle.consolidateFiles=true" \
--driver-memory 10G \
--executor-memory 8G \
--executor-cores 20 \
--num-executors 20 \
--class com.bigdata.streaming.OurApp \ /opt/app/dev/jars/OurStreamingApplication.jar external_props.conf
下面我们将详细介绍这些改变的参数。
2.1 driver选项
这里需要注意的是,driver运行在spark on yarn的集群模式下。因为spark streaming应用是一个长期运行的任务,生成的日志文件会很大。为了解决这个问题,我们限制了写入日志的消息的条数, 并且用RollingFileAppender限制了它们的大小。我们也关闭了spark.ui.showConsoleProgress选项来禁用控制台日志消息。
通过测试,我们的driver因为永久代空间填满而频繁发生内存耗尽(永久代空间是类、方法等存储的地方,不会被重新分配)。将永久代空间的大小升高到6G可以解决这个问题。
spark.driver.extraJavaOptions=-XX:MaxPermSize=6G
2.2 垃圾回收
因为我们的spark streaming应用程序是一个长期运行的进程,在处理一段时间之后,我们注意到GC暂停时间过长,我们想在后台减少或者保持这个时间。调整UseConcMarkSweepGC参数是一个技巧。
--conf "spark.executor.extraJavaOptions=-XX:+UseConcMarkSweepGC -Dlog4j.configuration=log4j-eir.properties" \
2.3 禁用Tungsten
Tungsten是spark执行引擎主要的改进。但是它的第一个版本是有问题的,所以我们暂时禁用它。
spark.sql.tungsten.enabled=false
spark.sql.codegen=false
spark.sql.unsafe.enabled=false
2.4 启用反压
Spark Streaming在批处理时间大于批间隔时间时会出现问题。换一句话说,就是spark读取数据的速度慢于kafka数据到达的速度。如果按照这个吞吐量执行过长的时间,它会造成不稳定的情况。 即接收executor的内存溢出。设置下面的参数解决这个问题。
spark.streaming.backpressure.enabled=true
2.5 调整本地化和块配置
下面的两个参数是互补的。一个决定了数据本地化到task或者executor等待的时间,另外一个被spark streaming receiver使用对数据进行组块。块越大越好,但是如果数据没有本地化到executor,它将会通过网络移动到 任务执行的地方。我们必须在这两个参数间找到一个好的平衡,因为我们不想数据块太大,并且也不想等待本地化太长时间。我们希望所有的任务都在几秒内完成。
因此,我们改变本地化选项从3s到1s,我们也改变块间隔为1.5s。
--conf "spark.locality.wait=1s" \
--conf "spark.streaming.blockInterval=1500ms" \
2.6 合并临时文件
在ext4文件系统中,推荐开启这个功能。因为这会产生更少的临时文件。
--conf "spark.shuffle.consolidateFiles=true" \
2.7 开启executor配置
在你配置kafka Dstream时,你能够指定并发消费线程的数量。然而,kafka Dstream的消费者会运行在相同的spark driver节点上面。因此,为了从多台机器上面并行消费kafka topic, 我们必须实例化多个Dstream。虽然可以在处理之前合并相应的RDD,但是运行多个应用程序实例,把它们都作为相同kafka consumer group的一部分。
为了达到这个目的,我们设置20个executor,并且每个executor有20个核。
--executor-memory 8G
--executor-cores 20
--num-executors 20
2.8 缓存方法
使用RDD之前缓存RDD,但是记住在下次迭代之前从缓存中删除它。缓存那些需要使用多次的数据非常有用。然而,不要使分区数目过大。保持分区数目较低可以减少,最小化调度延迟。下面的公式是我们使用的分区数的计算公式。
# of executors * # of cores = # of partitions
Spark Streaming实时处理应用的更多相关文章
- 使用 Kafka + Spark Streaming + Cassandra 构建数据实时处理引擎
Apache Kafka 是一个可扩展,高性能,低延迟的平台,允许我们像消息系统一样读取和写入数据.我们可以很容易地在 Java 中使用 Kafka. Spark Streaming 是 Apache ...
- Storm介绍及与Spark Streaming对比
Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...
- spark streaming 实战
最近在学习spark的相关知识, 重点在看spark streaming 和spark mllib相关的内容. 关于spark的配置: http://www.powerxing.com/spark-q ...
- Spark Streaming和Flume-NG对接实验
Spark Streaming是一个新的实时计算的利器,而且还在快速的发展.它将输入流切分成一个个的DStream转换为RDD,从而可以使用Spark来处理.它直接支持多种数据源:Kafka, Flu ...
- spark streaming 实时计算
spark streaming 开发实例 本文将分以下几部分 spark 开发环境配置 如何创建spark项目 编写streaming代码示例 如何调试 环境配置: spark 原生语言是scala, ...
- Spark Streaming 原理剖析
通过源码呈现 Spark Streaming 的底层机制. 1. 初始化与接收数据 Spark Streaming 通过分布在各个节点上的接收器,缓存接收到的流数据,并将流数 据 包 装 成 Spar ...
- Spark Streaming 结合FlumeNG使用实例
SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似map.reduce.j ...
- 转:Sharethrough使用Spark Streaming优化实时竞价
文章来自于:http://www.infoq.com/cn/news/2014/04/spark-streaming-bidding 来自于Sharethrough的数据基础设施工程师Russell ...
- Spark Streaming连接TCP Socket
1.Spark Streaming是什么 Spark Streaming是在Spark上建立的可扩展的高吞吐量实时处理流数据的框架,数据可以是来自多种不同的源,例如kafka,Flume,Twitte ...
随机推荐
- url规范化:解决从baidu.com到www.baidu.com的
通过 301重定向可以实现 把www.baidu.com和baidu.com合并,并把之前的域名也一并合并. 有两种实现方法: 第一种方法是判断nginx核心变量host(别名功能): server ...
- Python:一些小知识
小知识点总结 一.Python2与Python3 的区别 1.Python2中可以加括号输出,也可不加输出 Python3中必须加 2.python2 中有xrange(生成器)也有range ...
- 不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证” 的解决办法
不能安装这个“安装 OS X EI Capitan”应用程序副本不能验证.它在下载过程中可能已遭破坏或篡改. 解决办法:修改系统时间. 1,查看你的dmg文件的创建日期 2,把你的系统日期修改到比这个 ...
- Windows XP和Wndows7误删除了注册表下.exe文件夹之修复办法
在桌面空白处鼠标右击选择“新建-文本文档”,然后将下面的代码复制粘贴进去;如图所示: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\. ...
- 【luogu P1402 酒店之王】 题解
题目链接:https://www.luogu.org/problemnew/show/P1402 菜 #include <queue> #include <cstdio> #i ...
- Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法
在安装 win10的时候,会出现这种提示:Windows 无法安装到这个磁盘.选中的磁 盘具有 MBR 分区表.在 EFI 系统上, Windows 只能安装到 GPT 磁盘.出现这种 情况主要是因为 ...
- DB数据源配置之抽象(〇)
DB数据源配置之抽象(〇) liuyuhang原创,未经允许禁止转载 DB数据源之SpringBoot+Mybatis踏坑过程实录(一) DB数据源之SpringBoot+MyBatis踏坑过程(二) ...
- linux系统基础之---RPM管理(基于centos7.4)
- Mysql读写分离,主从同步实现
随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,因此我们可以通过实现数据库的读写分离来提高系统的性能. 通过设置主从数据库实现读写分离,主库负责“写”操作,从库负责“读”操作,根据压力情况, ...
- 【ssh服务配置】
根据项目需求,搭建好拓扑图如下: 第一种验证方式:给予密码和用户名登录 Ssh server配置: 首先在服务器上创建一个rsa加密算法的秘钥对: 对ssh服务进行开启: 创建用户的虚拟终端登录界面: ...