日志分析并行分解设计与实现

上传人:工**** 文档编号:488214236 上传时间:2023-07-31 格式:DOCX 页数:22 大小:126.57KB
返回 下载 相关 举报
日志分析并行分解设计与实现_第1页
第1页 / 共22页
日志分析并行分解设计与实现_第2页
第2页 / 共22页
日志分析并行分解设计与实现_第3页
第3页 / 共22页
日志分析并行分解设计与实现_第4页
第4页 / 共22页
日志分析并行分解设计与实现_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《日志分析并行分解设计与实现》由会员分享,可在线阅读,更多相关《日志分析并行分解设计与实现(22页珍藏版)》请在金锄头文库上搜索。

1、任务就是要完成一个日志分析应用。需求没 有很明确,只是要有这么一个东西能够满足 分析收集后的日志,将分析后的原始数据入 库,作为后期分析和统计使用。在动手做之前,我还是给这个应用作了最 基本的需求定义:灵活配置(输入源,输出 目标,分析器的实现等),高效(并行任务 分解)。就这两点能够做到,那么将来需求 如何变化都可以适应。Tiger的Concurrent 包是满足后面那项最好的实现,里面的线程 池,异步服务调用,并发控制都能够极好的 完成并行任务分解的 工作。 J2SE 7 的Concurrent 包中将会增加 fork-join 风格 的并行分解库,其实这个是更细粒度的任务 分解,同时能够

2、在当前多 CPU 的情况下提高 执行效率,充分利用 CPU 的一种实现。背景:由于服务路由应用访问量十分大,即时的 将访问记录入库对于路由应用本身以及数 据库来说无疑都会产生很大的压力和影响。因此考虑首先将访问信息通过log4j记录在 本地(当然自己需要定制一下 Log4j 的 Appender和Filter),然后通过服务器的 定时任务脚本来将日志集中到日志分析应 用所在的机器上(这里通过配置可以决定日 志是根据什么时间间隔来产生新文件)。日志分析应用就比较单纯的读取日志,分析日 将即时统计信息存入到集中式缓存志,输出分析结果(包括写入数据库或者是1Memcached 中)。网络结构图如下:

3、Concurrent 概述:看 Java 的 Doc 很 容 易 就 理 解 了Concurrent,这里我只是大致的说一下几个自己在应用中使用的接口:BlockingQueue :看看名字就知道了,阻 塞式队列,可以设置大小。适合于生产者和 消费者模式,生产者在队列满时阻塞,消费 者在队列空时阻塞。在日志分析应用开发中 被用于分析任务(生产者)和输出任务(消 费者)之间的分析结果存储通道。Callable:任何需要执行的任务都可以 定义成Callable,类似于线程的Runnable 接口,可以被 Service Executor 指派给内 部的线程异步执行,并且返回对象或者抛出 异常。在日

4、志分析应用开发中,非定时性的任务都定义成为此类型。ConcurrentMap:这个以前常常使用,因为效率要远远Collections.synchronizedCollection 和 synchronized。后面还会提到实践中的几个 实用的技巧来防止在高并发的情况下出现 问题。在日志分析应用中,此类型的 Map 作 为保存日志文件分析状态的缓存(日志文件 分为两种状态:分析中,分析结束。如果不 存在于 Map 中就认为尚未分析,那么将其纳 入 Map 然后启动分析处理线程工作,如果存 在于 Map 中标示为分析中,那么将不会再分 析此文件,如果分析结束并且被输出,将会 标示此文件分析结束,异

5、步清理线程将会定 时根据策略删除或移动文件)。ExecutorService :内置线程池,异步执行 指派任务,并可以根据返回的 Future 来跟 踪执行情况。在日志分析应用开发中,被用 于非定时性任务执行。ScheduledExecutorService :内置线程池, 定时异步执行指派任务,并可以根据返回的Future 来跟踪执行情况。在日志分析应用开 发中,被用于定时性任务执行。以上就是被使用到的接口,具体实现策略配 置就不在此赘述了。整体结构设计:11整体设计还是基于开始设定的两个原则 : 灵活配置,高效性(任务分解,并行流水线执 行)。说到任务分解又会想起读书时候的离 散数学中关键

6、路径等等。任务分解还是要根 据具体情况来分析和设计,不然并行不但不 会提高效率,反而还降低了处理效率。就日志分析来看,主要的处理过程可以分成这么几个任务:1 检查日志来源目录,锁定需要分析的 隔执行)。文件。执行需要时间很短,可通过定时间2 分析已经被锁定的日志文件,产生分 析结果。(执行需要时间根据日志文件大小 来决定,因此需要线程异步执行,结果根据 设定拆分成细粒度包,降低输出线程等待时 间)。3 检查分析结果队列。(执行需要时间 很短,当前是配置了 SingleThreadExecutor 来执行检查阻塞队列的工作,同时获取到分 析结果包以后立刻创建线程来执行输出任 务)4 输出分析结果

7、,如果输出成功,将分 析过的日志文件在日志文件状态缓存中的 状态更新为已分析。(执行时间根据输出情NV况来定,当前实现的是批量输出到数据库中 根据配置来批量提交入库,后续还会考虑实 时统计到集中式 Cache 作为监控使用)。5 清理分析日志文件。(执行时间较短,设定了定时线程池执行清理任务,根据策略配置来执行清理和移动文件任务,并且清除NR在日志文件状态缓存中的信息)根据上面的分解可以看到,其实在单线程工 作的过程中,容易造成阻塞而影响性能的主 要是读取,分析和写出这三个过程的协调, 一个一个读取分析和写出,性能一定低于读 取和分析并行工作,而分析完毕才写出,性 能一定低于分析部分,写出部分

8、。同时由于细分各个任务,因此任务与任务之 间的耦合度降低,可以运行期获取具体的任 务实现配置,达到灵活配置的目的。面就具体的看看整个流程,以及其中的一 些细节的说明,这里根据下图中的序号来逐 一描述: 1 配置了 Schedule Executor 来检查日 志所属目录中的日志文件,Execu tor的线程 池大小以及检查时间间隔都根据配置来设Tip:定时任务可以设置delay时间,那么可 以根据你的任务数量以及时间间隔来设定 每一个任务的 delay 时间,均匀的将这些任 务分布,提高效率。2 当 Read Schedule 被执行时,将会去 检查 Analysis Log File Sta

9、te Concurrent Cache (也就是上面提到的ConcurrentMap ) 中是否存在此文件,如果不存在证明尚未分 析,需要将其置入Cache,如果已经存在就 去查询其他文件。Tip:这里用了一点小技巧, get然后再put,但是这样可能就会在高并发的情况下出现问题,因为这两个操作不是 一 个原子操作。 ConcurrentMap 提 供了 putIfAbsent 操作,这个操作意思就是说如 果需要 put 的 key 没有存在于 Map 中,那么 将会把key,value存入,并且返回null,如果已经存在了 key 那么就返回 key 在 map 已 (resources.p

10、utIfAbsent(filename, null)就可以把两个操作合并成为一个操作。经对应的值if3 日志读取的工作线程完成锁定文件以 后,就将后续的工作交给 Log AnalysisNXService Executor 来创建分析任务异步执 行分析操作,日志读取工作线程任务就此完 成。4 Log Analysis Schedule 是运行期装 载具体的接口实现类(采用的就是类似于JAXP 等框架使用的 META-INF/services读取工厂类,载入接口实现)。 AnalysisSchedule执行的主要任务就是分析文件,并到Block Queue中,提供给输出线程使用。5. Recei

11、ver主要工作就是守候着Block Queue,当有数据结果产生就创建 Write Schedule来异步执行输出。6 Log Writer Service Executor 根据 配置来决定内置线程池大小,同时在Receiver 获 取 到 数 据 包 时 产 生 WriteSchedule 来异步执行输出工作。7 Write Schedule 和 Analysis Schedule 一样可以运行期装载接口实现类, 这样提供了灵活的输出策略配置。Tips:在数据库输出的时候需要配置批量提 交记录最大数,分批提交提高性能,也防止 过大结果集批量提交问题。8 写出完成以后需要更新锁定文件的状 态

12、,标示成为已经分析成功。这里还遗留一1点问题,在一个日志文件分包的过程中每一 个包都回记录隶属于哪一个分析文件,文件 的最后一个数据包将会被标示。在输出成功 以后会去检查哪些包是文件最后数据包,更 新此文件为已分析成功,如果出现异常,那 么将会把这些文件状态清除,接受下一次的1有做到事务一致,如果出现部分成功可能会 重复分析和记录。9 最后就是 Clean Schedule 被定时执行 根据策略来删除或者移动已经被分析过的 文件。Tips:ScheduledExecutorService 内部可以 配置线程池,当执行定时任务比较耗时,线 程池中的线程都被占用的情况下,定时任务 将不会准确的按时

13、执行,因此设计过程中需 要注意的是,定时任务一般是简短的工作任 务,如果比较耗时,那么应该结合 ScheduledExecutorService 和 ExecutorService,定时任务完成必要工作 以后将耗时工作转交给 ExecutorService 创 建的即时 执行异步 线程去处 理, 保证 Schedule Executor 正常工作。IO LO用炖/Name: Author Version:Ciedted. Upzktcc:Lc Anal/zor gzgnohu1.03306 +22 :a c?ut or:Log A&xLyziz:Voriwr Pool(Ind implemen

14、tion at rurilirnoh 9 ?、f1iin eludeLo名 ArtklYziz ServiceI1Execulor3: create jnaltzchadukAnalysis Log File StateConcurraxt Cache9: do clesn cehfiduiainoludeLok Cleas.S chc dilclxccutcrLog Clan Vorlcerfool4: jddtcsuft pjgQQ t3: updjtc sri3yccBlock Queue oXnalyzi sad I.ogKesulto6; crajtfi oulpui schedule Loq ynt Service ExecutorLos Vrit AforrP林? ?find im pl emeriti on at runtime7: twite result ioded IAnolrsi, Rcsuli RacivcrI 6: 9*t rsto-at p*atdeal ( BB j Cache Socket ):cd anah.izer /LogAnal yzer Confi g-re co rd MaxCount: int= 1CD-readChecMnterval ini = EO-readerTh

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号