zoukankan      html  css  js  c++  java
  • 日志分析系统——Hangout源码学习

    这两天看了下hangout的代码,虽然没有运行体验过,但是也算是学习了一点皮毛。

    架构浅谈

    Hangout可以说是java版的Logstash,我是没有测试过性能,不过据说是kafka这边性能要高出Logstash5倍。不知道真的假的,不过看代码,确实要比Logstash高效一点。

    关于input,filter,output的关系

    在Logstash里面,Input,filter,output是三个独立的部分,每个部分通过Buffer存储数据。

    但是Hangout没有采用这种思想,每个Input是独立的input对象。每个input对象又由decoder、filter、output组成。事件由Input搜集产生,然后经由filter进行过滤解析,再交给output输出。

    这样的关系,在组织结构上,使得filter、output与Input的关系变成了被包含的关系。

    关于buffer

    Logstash中input,filter,output之间都有一个Buffer用于暂存数据。所有的input数据会暂存到buffer里面,等待filter解析,filter解析后数据又会放入filter和output之间的Buffer,等待output去flush到目的地。

    在Hangout中,则是直接取消掉了buffer这一概念,使得事件由Input直接经过filter,直接交给output。性能上肯定是更快速了一些;但是这样也存在问题,就是每个input的数据不是同一存放的,filter、output其实会在不同的input中初始化多次,这就意味着其实浪费了一些资源,很多资源被重复利用了。

    代码学习

    下面是今天抽空整理的hangout的类图,可以提供点基本的代码提示。由于以前没怎么使用过反射,这次正好通过看代码学习了一下。通过反射的方式,使得初始化这种模块化程度很高的代码,变得十分容易:

    Iterator<Entry<String, Map>> inputIT = input.entrySet().iterator();
    while (inputIT.hasNext()) {
    	Map.Entry<String, Map> inputEntry = inputIT.next();
    	String inputType = inputEntry.getKey();
    	Map inputConfig = inputEntry.getValue();
    
    	Class<?> inputClass = Class.forName("com.ctrip.ops.sysdev.inputs." + inputType);
    	Constructor<?> ctor = inputClass.getConstructor(Map.class,ArrayList.class, ArrayList.class);
    	BaseInput inputInstance = (BaseInput) ctor.newInstance(inputConfig, configs.get("filters"), configs.get("outputs"));
    	inputInstance.emit();
    }
    

    其中inputIT是获得input配置集合,通过反射的方式拿到class

    Class.forName("com.ctrip.ops.sysdev.inputs." + inputType);
    

    设置它的构造方法,并初始化

    Constructor<?> ctor = inputClass.getConstructor(Map.class,ArrayList.class, ArrayList.class);
    BaseInput inputInstance = (BaseInput) ctor.newInstance(inputConfig, configs.get("filters"), configs.get("outputs"));
    

    最后使用emit方法,启动input输入

    inputInstance.emit();
    

    类图

    流程图

  • 相关阅读:
    [Audio processing] FFMPEG转音频格式和采样率
    [操作系统] OS X Yosemite U盘制作
    [基础] 广义线性回归
    [基础] 一些英文术语
    [经典] 在未排序数组中返回topK大的数
    [参数方法] 贝叶斯估计(待补充)
    [参数方法] 最小二乘
    [Theano] Theano初探
    font awesome的图标在WP8浏览器下无法显示的问题解决
    SQL 获取各表记录数的最快方法
  • 原文地址:https://www.cnblogs.com/xing901022/p/5625059.html
Copyright © 2011-2022 走看看