`
wbj0110
  • 浏览: 1603546 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

设计一套实时分布式日志流收集平台(tail Logs --->HDFS)

阅读更多
目前业界大概这么几个开源的分布式日志系统,notify+rsync,Facebook 的Scribe,apache的chukwa,linkin的kafa和cloudera的flume。
之所以自己设计一台这么一个平台,而没有采用开源,主要是基于这么考虑
   1、以上这几种开源日志系统,虽然提供了日志tail实时输出的功能,但是在tail进程宕掉后,无法从收集的点开始收集,只能重新开始,这样有很多重复的日志
   2、这几种开源的日志系统功能比较全面,但是对我们平台来说,只用部分的功能,设计一个简单可用可控的平台是我们的一个目标
这篇文章讲述了笔者以前自己设计的一个日志收集平台的技术细节,在电商开放平台中有应用到。
应用场景是这样的,
平台中各个应用客户端会实时产生大量的日志,需要实时把各个应用客户端的日志收集起来,发送到分布式文件系统中,供后续的数据挖掘和分析。
数据会收集到HDFS中,每天定时生成一个文件(文件前缀为日期,后缀为序列号从0开始),并且当文件的大小超多一定大小时,自动生成一个新的文件,文件前缀为当前日期,后缀为当前序列号递增。
系统的运行架构图,以及相关说明

 

说明如下:
1、首先启动一个日志扫描线程(扫描日志目录),当有本地日志文件生成的时,会生成一个日志tail任务,放到日志tail队列中等待调度。
2、对任务队列中的tail任务从线程池获取一个tail线程,该线程的职责是tail日志文件,输出到MQ中。在输出到MQ的同时,把当前的行号LSN记录到LSN Store中, 这里有一个考虑是如果日志tail线程宕掉,可以从宕掉时的日志行开始tail(seek操作)。
3、Collector节点启动多个线程从MQ中获取日志数据,并梳理日志的类别(操作日志,访问日志,业务日志等),根据不同的类型写到HDFS中不同的文件。如果在写入过程中,出现错误(比如HDFS暂时不可访问,这里有告警机制),那么就暂存在本地,等待恢复正常后,批量导入到HDFS中。
4、Lsn记录器,记录日志当前tail到哪一行了,在tail时,先写入Lsn Buffer中,是append方式,当超过一定的100M大小或者一定时间间隔时,就写到LSN File,只写最后的行号,并清除buffer。
     这样做的好处是,append数据到buffer(而不是update操作)的内存操作非常快。宕机恢复,在查询时,先从buffer查找,如果buffer中不存在,再从File中查找。
5、对于HDFS文件名称的切换按照以下策略进行
   每天定时生成一个文件(文件前缀为日期,后缀为序列号从0开始),并且当文件的大小超多一定大小时,自动生成一个新的文件,文     件前缀为当前日期,后缀为当前序列号递增。
    实现了两个Trigger,分别为SizeTriger(在调用HDFS输出流写的同时,count该流已经写入的大小总和,若超过一定大小,则创建新的文件和输出流,写入操作指向新的输出流,同时close以前的输出流)和TimeTriger(开启定时器,当到达该点时,自动创建新的文件和输出流,新的写入重定向到该流中,同时close以前的输出流)。
 
附带HDFS flush写数据说明:
HDFS操作过程中,只有在流flush(当数据包满的时,会自动flush;或者手动flush)和关闭的时候,才真正的写数据到datenode的硬盘上,那么对于HDFS来讲,默认的packet是64K,当超过数据超过64K时,会自动进行输出到dataNode的输出流中。
调用close时候,会自动把未构成一个packet的数据,也输出到dataNode输出流中写到datanode硬盘,完成后汇报给NameNode(当然datanode中的数据大小超过一个块如64M的时候,也会向NameNode汇报)
分享到:
评论

相关推荐

    详解Docker容器的日志处理

    Docker有很多的日志插件,默认使用 json-file,只有使用json-file时,sudo docker logs -f 才可以显示,输入以下命令查看docker日志插件: $ sudo docker info | grep Logging 这里先说明一下,当容器运行时,...

    File-Tail-0.99.3.tar.gz

    这在处理大量日志文件或需要实时监控特定数据流时尤其有用。 File-Tail-0.99.3.tar.gz是一个压缩包,包含了项目的源代码文件。".tar.gz"是Unix/Linux系统中常见的文件打包格式,它先用tar命令将多个文件打包成一个...

    HDFS基本命令.docx

    HDFS(Hadoop Distributed File System)是一种分布式文件系统,提供了对大规模数据的存储和管理能力。在HDFS中,基本命令是最基础也是最常用的命令,掌握这些命令是使用HDFS的基础。本节我们将详细介绍HDFS中的基本...

    windows下使用tail命令-tail2win

    `tail`命令在Linux中用于查看文件的尾部内容,它对于实时监控日志文件、追踪程序运行状态等非常有用。`tail2win`就是这样一个工具,它将`tail`命令的功能带到了Windows环境中。 标题"windows下使用tail命令-tail2...

    表,队列,栈实验设计

    list->head = list->tail = node; node->next = node->pre = NULL; } else { node->next = NULL; node->pre = list->tail; list->tail->next = node; list->tail = node; } list->count++; } ``` - 插入...

    分布式日志查询系统-BeanWatch.rar

    分布式日志查询系统BeanWatch是针对系统...其压缩包中的Rtail可能是用于收集和转发日志的组件,类似于Unix的Tail命令,但具有更强大的分布式能力和实时性。了解并使用这类工具,对于优化系统监控和故障排查至关重要。

    tail -f for windows 32/64

    总结来说,`tail -f for windows 32/64` 提供了一个方便的工具,使得在 Windows 环境中可以像在 Linux 中一样实时监控文件变化,这对于开发者和系统管理员来说是一个强大的工具,尤其在处理日志文件和实时数据流时。...

    window系统 tail -f 功能 界面操作

    实现window系统下 类似 Linux 命令行 tail -f 功能.使用C#语言开发,占用资源小。如有问题可留言

    websocket日志实时推送

    总的来说,WebSocket日志实时推送通过结合WebSocket协议的实时通信能力、Linux的`tail -f`命令对日志的实时监控,以及Java的WebSocket服务端编程,实现了高效、实时的日志推送。这种技术在监控系统、分布式环境、...

    k8stail:Kubernetes Pod的tail -f体验

    k8stail使您可以实时监视指定名称空间中的所有pod的日志流或标签,如tail -f 。 目录 选项 发展 作者 执照 要求 Kubernetes 1.3或以上 安装 使用自制软件(仅适用于OS X) 公式可从dtan4 / homebrew-dtan4获得...

    windows下可用的tail工具,看日志首选,win7/win10可用。

    在Linux中,`tail -f`命令常用来实时跟踪一个正在更新的日志文件,每当文件有新的内容追加时,`tail`会立即显示出来。Windows下的这个`tail.exe`工具提供了相同的功能,允许用户在Win7或Win10系统中实时监控日志文件...

    tail-for-windows.zip

    总结起来,`tail-for-windows.zip`是一个为Windows平台提供实时日志监控功能的工具,包括核心的`tail.exe`执行文件、详尽的`manual.html`用户手册以及必要的`License Agreement.txt`许可协议。通过这个工具,Windows...

    我使用过的Linux命令之tailf - 跟踪日志文件/更好的tail -f版本

    然而,对于实时监控动态更新的日志文件,`tail -f`选项则更为实用。本篇文章将深入探讨`tail -f`的功能以及一个增强版的实现——`tailf`。 `tail -f`命令的工作原理是,它会持续地读取指定文件的末尾,并在文件有新...

    DOS下可以使用的tail -f 工具

    之后,你就可以在DOS命令行窗口中像使用Linux的`tail -f`一样,输入`windows_tail -f <filename>`来追踪文件的实时变化了。 在具体使用时,例如,如果你有一个名为`app.log`的日志文件,你可以在DOS命令行输入以下...

    File-Tail-Scribe

    **File-Tail-Scribe** 是一个专用于收集和处理日志文件的工具模块,它在IT行业中被广泛用于监控和分析系统、应用或服务产生的日志数据。在现代的运维和开发环境中,日志文件是排查问题、追踪系统行为、进行性能优化...

    Windows 下 tail 查看日志命令工具

    在Windows操作系统中,通常我们使用的是图形化界面来管理和查看文件,但在Linux系统中,有一个非常实用的命令行工具——`tail`,它用于查看文件的末尾内容,特别是对于实时监控日志文件非常有用。在Windows环境下,...

    now-logs将您的now.sh日志流传输到您的终端

    `now-logs` 是一个专为 Node.js 开发者设计的命令行实用程序,它允许用户方便地将 `now.sh` 平台上的应用程序日志实时传输到本地终端。`now.sh` 是 Zeit(现已被 Vercel 收购)提供的一个全球云部署服务,它使得...

    tiaoyuebiao.rar_跳跃表

    while (list->level > 1 && list->header->forward[list->level - 1] == list->tail) { list->level--; } } } ``` 7. **遍历跳跃表**:从头节点开始,依次访问每个节点。 ```c void traverse(SkipList* list) ...

    综教楼后的那个坑用双向链表实现

    head->left = tail->right = NULL; head->right = tail; tail->left = head; q = head; ``` 3. **读取输入并构建链表**: ```c for (i = 0; i ; i++) { p = (NODE*)malloc(sizeof(NODE)); p->no = i; ...

    c语言 数据结构 课程设计 通讯录制作源码

    tail->pre->next = li->top; pre->next->pre = tail; tail->next = pre->next; pre->next = tail; tail->pre = pre; } ``` - 实现了对双向循环链表中的节点按名字顺序排序的功能。 - 使用了冒泡排序的思想...

Global site tag (gtag.js) - Google Analytics