日志收集系统chukwa协议分析

chukwa是apache下的一个开源项目。主要是用于日志收集分析,结合hadoop进行有效的日志处理和计算。下面这张图片描述的比较形象。

chunkwa

在这个架构中可以看出主要由agent,collector,hadoop,这样几块组成。而我现在要关注的就是agentcollector的交互部分。原来的日志收集系统是直接使用chukwa的一整套服务搭建起来的。但是这样子的系统有一个比较明显的缺点就是不能达到实时处理的要求。正常的情况下,日志处理的延时在5到10分钟左右。因此,需要在此基础上修改这样的架构。分析后发现,chukwa的agent还是比较好用的,拥有很多的配置方法,方便对服务器的调控。另外因为是线上服务器,也不可以随便换用agent。因为决定自己实现collector端,收集agent发过来的数据。因此就需要研究chunkwa传输的时候是怎么编码的。下面这张图片是我分析后得到的结果:

chunk

每一次,agent会发送一个package过来,这个package包括很多个chunk。其中开始的4个字节表示的int值表示这个package有多少个chunk。上面这张图片表示的就是一个chunk的各个字段组成。因为这是一个流的形式字符,需要根据java中的相应编码方式使用python进行解码。但是我查看了一下,python中没有直接支持的包,不过有一个struct扩展模块,通过对该扩展模块进行简单包装,就可以实现读取Int型,Long型,UTF字符等。代码如下:

# -*-coding: utf-8 -*-
from struct import *

class BinaryStream:
    def __init__(self,base_stream):
        self.base_stream = base_stream
        self.offset = 0

    def readBytes(self,length):
        string, =  unpack_from(str(length) + 's',self.base_stream[self.offset:])
        self.offset += calcsize(str(length) + 's')
        self.offset +=1
        return string

    def readUTF(self):
        length, = unpack_from('!H',self.base_stream[self.offset:])
        self.offset +=calcsize('!H')
        string, =  unpack_from(str(length) + 's',self.base_stream[self.offset:])
        self.offset +=calcsize(str(length) + 's')
        return string


    def readLong(self):
        num, = unpack_from('!Q',self.base_stream[self.offset:])
        self.offset +=calcsize('!Q')
        return num

    def readInt(self):
        num, =  unpack_from('!I',self.base_stream[self.offset:])
        self.offset += calcsize('!I')
        return num

使用这个方法就可以很简单的把收集到的package包中的chunk解码,并且提取其中的日志内容。通过这个方法基本上可以使得延时缩小到10秒以内。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/449587

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。