OI
OI是一个告警系统。用flume收集OC client上传的数据,然后传到spark,spark再对数据进行分析,生成一些metrics键值对,然后发到graphite做显示,seyren定期去graphite查询metrics键值对,当某个metrics超过伐值的时候报警给分析人员,分析人员再对相应的日志进行分析,找出异常的原因。
拓扑框架:
Performance调优环境:
一台机器部署了log server,收集OC client上传的日志。同时部署了一个flume agent将log日志传给spark的executor
两台机器部署spark的worker,运行的时候每个worker会启动一个executor,用于启动avro flume receiver和运行driver提交的task。Flume receiver用于接收flume agent的传递过来的数据。
一台机器部署master,上面还会运行driver,graphite和seyren。Driver用于spark task,提交到executor运行。
软件架构:
OI系统的主要分为三层
1.Spark层:调用spark的相应函数,如果map,flatmap,reduce等,spark会按照这些函数生成相应的task,提交给spark executor
2.业务层:用于处理log日志,将log转换成相应的metrics
3.数据库层:将top10的异常日志存储到数据库,方便分析人员查看
4.Graphite交互层:用于将metrics发送给graphite
遇到的问题:
1.在运行大概5,6个小时左右,driver或者work会抛出Stackoverflow的错误
分析的步骤:
(1)查看栈信息,发现一直在做scala list的序列化,开始怀疑是不是scala list序列化会导致栈溢出的问题,网上查看相关资料发现确实有某个版本的scala list会导致堆溢出问题,但spark不是用那个版本,排除这个可能性
(2)查看日志上下文,发现是在序列化或反序列化task的时候抛出这个错误的。查看源代码,定位到相应的代码,然后修改源代码,让在出错的时候,把需要反序列化的byte数组写到文件。
(3)写测试代码,解析byte数组,查看到底反序列化了那些对象。发现RDD的依赖过长,Duration 3的RDD会依赖Duration 2的RDD,Duration 2的RDD会依赖Duration 1的RDD
(4)查看源代码,发现UpdateStateByKey方法,会生成一个StateDStream(保持状态的DStream),这个DStream在计算RDD的时候会获取前一个Duration的RDD,然后和parent RDD做一个cogroupe,这样当前计算的RDD就会依赖前一个Duration。如果这个依赖一直存在的话就会发生StackOverFlow。
解决方案:
减少UpdateStateByKey方法的调用次数,程序中只调用一次(只调用一次的时候会将RDD的关联切断,如果调用两次,只有最后一个UpdateStateByKey生成的RDD的依赖关系会被切断)
2.Flume死锁的问题
在Flume运行一段时间后,发现flume agent不再tail log日志了。
分析的步骤:
(1)查看日志,发现某个线程在运行一段时间后没有相应的日志打出,猜测线程可能死了,或者被死锁
(2)用Jstack工具打出thread dump,发现有两个线程死锁了
(3)分析源代码发现了死锁
线程1
While(queue.size() == 0){
Syncronized(takeLock){
takeLock.wait()
}
}
线程2
While(queue.size() == capacity){
Syncronized(putLock){
putLock.wait()
}
}
对项目提出的优化:
1.写了专门用来监控performance相关参数的软件OI-Performance,在graphite上能够很好的展示这些属性,便于观察,监控的属性有SystemCpuLoad,ProcessCpuLoad,HeapMemoryUsage,GC的时间,disk util,network,以及一些业务属性
2.修改了spark中的storage level,减少了内存占用量
3.调整了JVM中new-ratio的比例,延长变量在新生代中存活的时间,减少full GC的时间
4.减少了collector这部环节,让agent直接发送数据到flume,让压缩过的数据直接传输到spark,减少了磁盘的读写以及内存的开销
5.减少了Avro格式转换成Seven自定义对象的环节,OI直接从generic record获取数据
6.替换flume的channel类型,让flume使用Memory Channel,减少磁盘的读写
为甚么选择flumehttp://www.kankanews.com/ICkengine/archives/89351.shtml
1.原来有一个系统叫lsps,做log日志收集,存储到hdfs中,然后做数据挖掘的,为了和这套系统兼容,保证数据收集部分功能和代码的一致性,重用了那套机制。那套机制就是用flume做的
2.Flume有高可靠性,扩展性,能够保证日志不丢失
3.Flume的配置和部署都很简单,修改配置后,可以自动加载
4.Flume提供了丰富的sink和source,对不同格式的日志可以很方便的切换,只支持thrift client向scribe发送数据。
为什么选择spark
Spark streaming和storm的区别是(两者都是分布式流处理框架)http://www.jdon.com/46591 :
1.Spark支持保持状态
2.Spark有数据平滑窗口(sliding window),而后者需要自己去维护这个窗口
3.Spark是需要到一个duration才开始处理数据,storm是实时处理数据,有数据就处理。Storm只有秒内的延迟
4. 在Storm中,每个单独的记录当它通过系统时必须被跟踪,所以Storm能够至少保证每个记录将被处理一次,但是在从错误中恢复过来时候允许出现重复记录。这意味着可变状态可能不正确地被更新两次。另一方面,Spark Streaming只需要在批级别进行跟踪处理,因此可以有效地保证每个mini-batch将完全被处理一次,即便一个节点发生故障。简而言之,如果你需要秒内的延迟,Storm是一个不错的选择,而且没有数据丢失。如果你需要有状态的计算,而且要完全保证每个事件只被处理一次,Spark Streaming则更好。Spark Streaming编程逻辑也可能更容易,因为它类似于批处理程序(Hadoop),特别是在你使用批次(尽管是很小的)时
5. Spark Streaming一个好的特性是其运行在Spark上. 这样你能够你编写批处理的同样代码,这就不需要编写单独的代码来处理实时流数据和历史数据
整套环境的failover机制
1.logserver那台机器的故障
(1)宕机 oc client会连接到其他log server,上传的数据可能会有部分丢失
(2)Flume 的source或者sink线程挂掉的话,不会重新启动
(3)当网络出现问题的时候,sink数据发送会失败,但会不断重试
2.Worker宕机
Receiver不会在其他地方启动
会重新在另外一个executor上启动task
3.master宕机
利用zookeeper来保证另一个master可以接着继续运行
相关推荐
7. 维护与保养:建议定期检查和保养的项目,确保系统长期稳定运行。 通过深入学习这本FANUC-OI TD用户手册,操作者不仅可以掌握系统的日常使用,还能了解高级功能和故障处理技巧,提升工作效率,保证加工精度,从而...
Go-OI-wiki的内容丰富多样,包括但不限于以下几个核心部分: 1. **基础知识**:这部分主要介绍了编程竞赛中必备的编程语言知识,如Go语言的基本语法、数据结构和算法。Go语言以其简洁的语法和高效的性能,常在编程...
### FANUC-OI-TD 系统概述与操作指南 #### 一、概要 FANUC-OI-TD 是一款由日本发那科公司(FANUC Corporation)生产的数控系统,主要用于控制机床的自动化加工过程。该系统集成了先进的控制技术和用户友好的界面...
### FANUC-OI系统CF卡传输程序步骤详解 #### 一、背景介绍 FANUC-OI系统是广泛应用于工业自动化领域的数控系统之一。在实际应用过程中,常常需要通过CF卡来传输程序或者备份系统数据。本文将详细介绍如何利用CF卡在...
开源项目-mtojek-oi.zip,Fast ordered data intersection tool, grep request logs more efficiently, 11 min to <50 ms
【描述】"FANUC Series oi-MC operators manual" 描述了该手册是针对FANUC OI-MC系列的操作员指南,内容涵盖了系统的安装、设置、编程、故障诊断以及日常维护等多个方面。OI-MC系列是FANUC公司推出的一款先进的数控...
NOIP初赛模拟试题-by-OI-Store(c++).pdf
"FANUC-Oi和PC机的数据传输方法" FANUC-Oi数控系统是近两年来FANUC公司推出的新一代CNC,与OC、OD相比拟,无论是硬件还是软件功能都有很大的提高。集成化的CNC一改原来的大板结构,给人一种全新的感觉,特别是在...
总之,算法和数据结构是计算机科学的基石,深入学习和理解"Algorithm-OI-Template.zip"中的内容,对于提升个人技术水平、拓宽职业发展道路具有重要意义。无论是初学者还是经验丰富的开发者,都应该持续关注并提升这...
"OI-codes-master"文件目录很可能包含了这些挑战的代码实现,涵盖多种编程语言,如C++、Python或Java。 1. **排序算法**:在"Algorithm-OI-codes.zip"中,我们可能会找到快速排序、归并排序、堆排序等经典排序算法...
标题 "cnc-machining-center-oi-MF_FANUCCNC_cncmachining_源码.zip" 提供的信息表明,这是一个与数控机床加工中心(CNC Machining Center)操作界面(OI)相关的源代码文件,使用的控制系统是FANUC CNC。...
文件列表中的“cnc-lathe-oi-MF.pdf”可能是手册的PDF文档,其中将包含以上所有或部分内容,以图文并茂的方式详细解释FANUC MF数控系统的操作流程和技巧。学习和理解这份手册将有助于操作者有效地利用FANUC CNC车床...
在"oi-master"这个压缩包中,可能包含了oi框架的源代码、示例项目、文档和其他相关资源。通过研究这些内容,开发者可以更深入地了解oi的内部机制和使用方法,从而快速上手并利用这个框架构建自己的CLI应用。 总之,...
标题中的"oi-MF"通常是指FANUC公司的Oi-MF控制系统,这是一个专门用于CNC铣床和加工中心的高级操作界面。FANUC是全球领先的CNC系统制造商,以其稳定性和可靠性而著称。 CNC Fanuc Machining oi-MF系统集成了先进的...
使用以下命令运行pi-oi: java -jar pi-oi.jar 介绍 Raspberry Pi机器是我今年最有趣的东西。 为什么会很有趣? 我认为,由于它很小且非常强大,因此它可以运行以我喜欢的语言(例如Java,Javascript(Nodejs),...
在深入探讨Fanuc Oi系统的培训资料之前,我们先来了解一下Fanuc Oi系统的基本概念。Fanuc Oi系统是日本发那科公司...希望以上内容能帮助到正在学习或即将开始学习Fanuc Oi系统的朋友,祝大家学习顺利,技术日臻完善!
斯沃数控仿真软件7.2版数控加工中心车床铣床编程仿真模拟教程斯沃系统手册FANUC-OI-TC编程和操作说明提取方式是百度网盘分享地址
### FANUC-OI系统报警说明 #### 一、后台编辑报警 1. **BP/S 报警(070、071、072、073、074、085、086、087)** - **报警信息**:“BP/S alarm” - **报警说明**:此报警与一般程序编辑中发生的P/S号报警相同,...