精华内容
下载资源
问答
  • 大数据flume的概念原理和flume与kafka的简单对比一、flume的基本概念原理:二、flume与kafka的简单对比: 一、flume的基本概念原理: 1、Apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大...

    大数据flume的概念原理和flume与kafka的简单对比

    一、flume的基本概念原理:

    1、Apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。

    Flume组成架构:
    在这里插入图片描述
    2、Flume的组成部分:

    ①、Flume事件:
    事件作为Flume内部数据传输的最基本单元。它是由一个转载数据的字节数组(该数据组是从数据源接入点传入,并传输给传输器,也就是HDFS/HBase)和一个可选头部构成。

    ②、Flume Agent:
    Flume内部有一个或者多个Agent,然而对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端哪儿接收收集,或者从其他的 Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent.。

    Agent主要由:source,channel,sink三个组件组成。

    Source:
    从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等。

    Channel:
    channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性。并且它可以和任意数量的source和sink链接.。支持的类型有:JDBC channel,File System channel,Memort channel等。

    sink:
    sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地.。目标地可能是另一个sink,也可能HDFS,HBase。

    3、Flume的内部原理:
    在这里插入图片描述

    二、flume与kafka的简单对比:

    1、flume与kafka对比:

    (1)kafka和flume都是日志系统。kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能。flume分为agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如agent采用RPC(Thrift-RPC)、text(文件)等,storage指定用hdfs做。

    (2)kafka做日志缓存应该是更为合适的,但是 flume的数据采集部分做的很好,可以定制很多数据源,减少开发量。所以比较流行flume+kafka模式,如果为了利用flume写hdfs的能力,也可以采用kafka+flume的方式。

    温馨提示:该文章为本人自己创作,转载请标明出处。感谢各位!!!谢谢大家!!!
    本人联系方式:
    QQ:961094233
    邮箱:961094233@qq.com

    展开全文
  • Logstash概念原理、与Flume的对比

    万次阅读 2019-07-01 20:59:44
    Logstash概念 Logstash是一款开源的数据收集引擎,具备实时管道处理能力。简单来说,logstash作为数据源与数据存储分析工具之间的桥梁,结合ElasticSearch以及Kibana,能够极大方便数据的处理与分析。通过200多个...

    Logstash概念

    Logstash是一款开源的数据收集引擎,具备实时管道处理能力。简单来说,logstash作为数据源与数据存储分析工具之间的桥梁,结合ElasticSearch以及Kibana,能够极大方便数据的处理与分析。通过200多个插件,logstash可以接受几乎各种各样的数据。包括日志、网络请求、关系型数据库、传感器或物联网等等。

    Logstash工作过程

    在这里插入图片描述

    如上图,Logstash的数据处理过程主要包括:Inputs,Filters,Outputs 三部分,另外在Inputs和Outputs中可以使用Codecs对数据格式进行处理。这四个部分均以插件形式存在,用户通过定义pipeline配置文件,设置需要使用的input,filter,output,codec插件,以实现特定的数据采集,数据处理,数据输出等功能 。

    1. Inputs:用于从数据源获取数据,常见的插件如file, syslog, redis, beats 等
    2. Filters:用于处理数据如格式转换,数据派生等,常见的插件如grok, mutate, drop, clone, geoip等
    3. Outputs:用于数据输出,常见的插件如elastcisearch,file, graphite, statsd等
    4. Codecs:Codecs(编码插件)不是一个单独的流程,而是在输入和输出等插件中用于数据转换的模块,用于对数据进行编码处理,常见的插件如json,multiline。Logstash不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。

    Logstash简单实践

    我们使用Logstash输出一个 “hello world” 。在终端中,像下面这样运行命令来启动 Logstash 进程:

     # bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
    

    以上命令表示从控制台输入,然后通过Codec插件从控制台输出。然后终端在等待你的输入。敲入 Hello World,回车,查看结果:

    {
    	"@version" => "1",
    	"host" => "sdn-253",
    	"message" => "Hello World",
    	"@timestamp" => 2019-07-01T12:28:07.207Z
    }
    

    Logstash 就像管道符一样!你输入(就像命令行的 cat )数据,然后处理过滤(就像 awk 或者 uniq之类)数据,最后输出(就像 tee )到其他地方。数据在线程之间以 事件 的形式流传。Logstash会给事件添加一些额外信息。最重要的就是 @timestamp,用来标记事件的发生时间。 大多数时候,还可以见到另外几个:

    • host 标记事件发生在哪里。
    • type 标记事件的唯一类型。
    • tags 标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。
      你可以随意给事件添加字段或者从事件里删除字段。

    小贴士:每个 logstash 过滤插件,都会有四个方法叫 add_tag, remove_tag, add_field 和remove_field。它们在插件过滤匹配成功时生效。

    Logstash配置语法

    数据类型

    Logstash 支持少量的数据值类型:
    bool

    debug => true
    

    string

    host => "hostname"
    

    number

    port => 514
    

    array

    match => ["datetime", "UNIX", "ISO8601"]
    

    hash

    options => {
        key1 => "value1",
        key2 => "value2"
    }
    

    条件判断

    表达式支持下面这些操作符:
    相等: ==, !=, <, >, <=, >=
    正则: =~(匹配正则), !~(不匹配正则)
    包含: in(包含), not in(不包含)
    布尔操作: and(与), or(或), nand(非与), xor(非或)
    一元运算符:!(取反) ,()(复合表达式), !()(对复合表达式结果取反)
    通常来说,你都会在表达式里用到字段引用。比如:

    if "_grokparsefailure" not in [tags] {
    	...
    } else if [status] !~ /^2\d\d/ and [url] == "/noc.gif" {
    	...
    } else {
    	...
    }
    

    Logstash插件

    logstash插件功能很强大,下面会根据每个模块的情况,对常用插件进行分析。

    Input模块

    标准输入

    我们已经使用 stdin 输入Hello World了。这也应该是 logstash 里最简单和基础的插件了。 input { stdin { } }表示从控制台输入

    File插件

    从文件读取数据,如常见的日志文件。文件读取通常要解决几个问题:
    在这里插入图片描述
    logstash-input-file配置:
    在这里插入图片描述

    其中path匹配规则如下,路径必须使用绝对路径,不支持相对路径:
    /var/log/.log:匹配/var/log目录下以.log结尾的所有文件
    /var/log/**/
    .log:匹配/var/log所有子目录下以.log结尾的文件
    /var/log/{app1,app2,app3}/*.log:匹配/var/log目录下app1,app2,app3子目录中以.log结尾的文件

    file插件作为input例子如下:

    input {
        # file为常用文件插件,插件内选项很多,可根据需求自行判断
        file {
    	   # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
            path => "/var/lib/mysql/slow.log"
            # 要排除的文件
            exclude =>”*.gz”
            # 从文件开始的位置开始读,end表示从结尾开始读
            start_position => "beginning"
            # 多久之内没修改过的文件不读取,0为无限制,单位为秒
            ignore_older => 0  
            # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
            sincedb_path => "/dev/null"
            # type字段,可表明导入的日志类型
            type => "mysql-slow"
        }
    }
    

    Http插件

    input {
    	http { port => 端口号 }
    }
    

    Redis插件

    input {
        # redis插件为常用插件,插件内选项很多,可根据需求自行判断
        redis {
            # EVAL命令返回的事件数目,设置为5表示一次请求返回5条日志信息
    	   batch_count => 1 
            # logstash redis插件工作方式
            data_type => "list" 
            # 监听的键值
            key => "logstash-test-list" 
            # redis地址
            host => "127.0.0.1" 
            # redis端口号
            port => 6379 
            # 如果有安全认证,此项为认证密码
            password => "123qwe" 
            # 如果应用使用了不同的数据库,此为redis数据库的编号,默认为0。
            db => 0 
            # 启用线程数量
            threads => 1
          }
    }
    

    Filter模块

    Filter是Logstash功能强大的主要原因,它可以对Logstash Event进行丰富的处理,比如解析数据、删除字段、类型转换等等,常见的有如下几个:
    在这里插入图片描述

    Date插件

    date插件可以将日期字符串解析为日期类型,然后替换@timestamp字段或者指定其他字段:

    filter{
    	date {
    	    match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] 
             # 记录@timestamp时间,可以设置日志中自定的时间字段,如果日志中没有时间字段,也可以自己生成
             target=>“@timestamp”
             # 将匹配的timestamp字段放在指定的字段 默认是@timestamp
        }
    }
    

    Grok插件

    grok是filter最重要的插件,grok使用正则表达式来生成grok语法,grok支持许多默认的正则表达式规则,grok中常用patterns的配置路径:

    [logstash安装路径]\vendor\bundle\jruby\x.x\gems\logstash-patterns-core-x.x.x\patterns\grok-patterns
    

    grok语法

    %{SYNTAX:SEMANTIC}
    

    SYNTAX为grok pattern的名称,SEMANTIC为赋值字段名称。%{NUMBER:duration}可以匹配数值类型,但是grok匹配出的内容都是字符串类型,可以通过在最后指定为int或者float来强转类型:%{NUMBER:duration:int}

    自定义正则表达式
    例如,如下定义一个关键字为version的参数,内容为两位的数字。

    (?<version>[0-9]{2})
    

    自定义grok pattern
    我们通过pattern_definitions参数,以键值对的方式定义pattern名称和内容。也可以通过pattern_dir参数,以文件的形式读取pattern。

    filter {
    	grok {
    		match => {
    			"message" => "%{SERVICE:service}"
    		}
    		pattern_definitions => {
    			"SERVICE" => "[a-z0-9]{10,11}"
    		}
    	}
    }
    

    Dissect插件

    基于分隔符原理解析数据,解决grok解析时消耗过多cpu资源的问题。dissect语法简单,能处理的场景比较有限。它只能处理格式相似,且有分隔符的字符串。它的语法如下:

    1、%{}里面是字段
    2、两个%{}之间是分隔符。

    例如,有以下日志:

    Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool
    

    我想要把前面的日期和时间解析到同一个字段中,那么就可以这样来做:

    filter {
        dissect {
            mapping => {
            	"message" => "%{ts} %{+ts} %{+ts} %{src} %{prog}[%{pid}]: %{msg}"
            }
        }
    }
    

    Mutate插件

    mutate是使用最频繁的插件,可以对字段进行各种操作,比如重命名、删除、替换、更新等,主要操作如下:

    1、convert类型转换
    2、gsub字符串替换
    3、split、join、merge字符串切割、数组合并为字符串、数组合并为数组
    4、rename字段重命名
    5、update、replace字段内容更新或替换。它们都可以更新字段的内容,区别在于update只在字段存在时生效,而replace在字段不存在时会执行新增字段的操作
    6、remove_field删除字段

    Json插件

    将字段内容为json格式的数据解析出来,如果不指定target的话,那么filter会把解析出来的json数据直接放到根级别。配置实例如下:

    filter {
    	json {
    		source => "message"
    		target => "msg_json"
    	}
    }
    

    运行结果:

    {
        "@version": "1",
        "@timestamp": "2014-11-18T08:11:33.000Z",
        "host": "web121.mweibo.tc.sinanode.com",
        "message": "{\"uid\":3081609001,\"type\":\"signal\"}",
        "jsoncontent": {
            "uid": 3081609001,
            "type": "signal"
        }
    }
    

    Geoip插件

    GeoIP 库可以根据 IP 地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。语法如下:

    filter {
    	geoip {
    		source => "message"
    	}
    }
    

    运行结果:

    {
           "message" => "183.60.92.253",
          "@version" => "1",
        "@timestamp" => "2014-08-07T10:32:55.610Z",
              "host" => "raochenlindeMacBook-Air.local",
             "geoip" => {
                          "ip" => "183.60.92.253",
               "country_code2" => "CN",
               "country_code3" => "CHN",
                "country_name" => "China",
              "continent_code" => "AS",
                 "region_name" => "30",
                   "city_name" => "Guangzhou",
                    "latitude" => 23.11670000000001,
                   "longitude" => 113.25,
                    "timezone" => "Asia/Chongqing",
            "real_region_name" => "Guangdong",
                    "location" => [
                [0] 113.25,
                [1] 23.11670000000001
            ]
        }
    }
    

    Output模块

    标准输出

    标准输出多用于调试,配置示例:

    output {
        stdout {
            codec => rubydebug
        }
    }
    

    redis插件

    output {
         redis{  # 输出到redis的插件,下面选项根据需求使用
             batch => true
             # 设为false,一次rpush,发一条数据,true为发送一批
             batch_events => 50
             # 一次rpush发送多少数据
             batch_timeout => 5
             # 一次rpush消耗多少时间
             codec => plain
             # 对输出数据进行codec,避免使用logstash的separate filter
             congestion_interval => 1
             # 多长时间进项一次拥塞检查
             congestion_threshold => 5
             # 限制一个list中可以存在多少个item,当数量足够时,就会阻塞直到有其他消费者消费list中的数据
             data_type => list
             # 使用list还是publish
             db => 0
             # 使用redis的那个数据库,默认为0号
             host => ["127.0.0.1:6379"]
             # redis 的地址和端口,会覆盖全局端口
             key => xxx
             # list或channel的名字
             password => xxx
             # redis的密码,默认不使用
             port => 6379
             # 全局端口,默认6379,如果host已指定,本条失效
             reconnect_interval => 1
             # 失败重连的间隔,默认为1s
             timeout => 5
             # 连接超时的时间
             workers => 1
             # 工作进程
         }
    }
    

    elasticsearch插件

    output {
        # stdout { codec => "rubydebug" }
        # 筛选过滤后的内容输出到终端显示
        elasticsearch {  # 导出到es,最常用的插件
            codec => "json"
            # 导出格式为json
            hosts => ["127.0.0.1:9200"]
            # ES地址+端口
            index => "logstash-slow-%{+YYYY.MM.dd}"
            # 导出到index内,可以使用时间变量
            user => "admin"
            password => "xxxxxx"
            # ES如果有安全认证就使用账号密码验证,无安全认证就不需要
            flush_size => 500
            # 默认500,logstash一次性攒够500条的数据在向es发送
            idle_flush_time => 1
            # 默认1s,如果1s内没攒够500,还是会一次性把数据发给ES
        }   
    }
    

    Logstash配置实例

    logstash配置的时候,input和output都可以配置多个不同的入参。filter可以针对input里面的每个数据源做不一样的过滤,通过各自定义的type来匹配。配置示例如下:

    input{
          kafka{
            bootstrap_servers => ["192.168.110.31:9092,192.168.110.31:9093,192.168.110.31:9094"]
            client_id => "test"
            group_id => "test"
            auto_offset_reset => "latest" //从最新的偏移量开始消费
            consumer_threads => 5
            decorate_events => true //此属性会将当前topic、offset、group、partition等信息也带到message中
            topics => ["logq","loge"] //数组类型,可配置多个topic
            type => "bhy" //所有插件通用属性,尤其在input里面配置多个数据源时很有用
          }
    	file {
    	   # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
            path => "/var/lib/mysql/slow.log"
            # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
            sincedb_path => "/dev/null"
            # type字段,可表明导入的日志类型
            type => "mysql-slow"
        }
    }
    filter{
            if[type] == "bhy"{
                grok{
                   ........
                }
            }
            if[type] == "mysql-slow"{
                mutate{
                   ........
                }
            }
    }
    output {
            if[type] == "bhy"{
              elasticsearch{
                   hosts => ["192.168.110.31:9200"]
                   index => "school"
                   timeout => 300
                   user => "elastic"
                   password => "changeme"
              }
    
            }
            if[type] == "mysql-slow"{
                ........
            }
     }
    

    1、针对如下类型的log:

    Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool
    

    logstash的配置如下:

    input {
        file {
            path => "/home/songfeihu/logstash-6.2.3/config/test.log"
            # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
            start_position => "beginning"
            # 从文件开始的位置开始读,end表示从结尾开始读
            ignore_older => 0
            # 多久之内没修改过的文件不读取,0为无限制,单位为秒
            sincedb_path => "/dev/null"
            # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
        }
    }
    filter {
            dissect {
                    mapping => {
                            "message" => "%{ts} %{+ts} %{+ts} %{src} %{prog}[%{pid}]: %{msg}"
                    }
            }
            if "Starting" in [msg]{
                    grok{
                            match => {"msg" => "(?<test1>[a-zA-Z0-9]+).*"}
                    }
            }
           mutate {
                   remove_field => ["message"]
           }
    }
    output {
    	stdout{codec=>rubydebug}
    }
    

    output返回值:

    {
              "host" => "sdn-253",
          "@version" => "1",
        "@timestamp" => 2019-06-28T08:08:58.062Z,
               "msg" => "Starting system activity accounting tool",
             "test1" => "Starting",
                "ts" => "Apr 26 12:20:02",
              "path" => "/home/songfeihu/logstash-6.2.3/config/test.log",
               "src" => "localhost",
              "prog" => "systemd",
               "pid" => "1",
           "message" => "Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool"
    }
    

    2、针对如下log:

    <188>Mar 29 2019 16:57:30 BJQ-219-A1-ITCloud-FW-E8000E-1 %%01SEC/4/POLICYPERMIT(l)[1976979]:VSYS=public;
    

    logstash配置如下:

    input {
        stdin {    }
    }
    filter {
        grok {
            match => {
    	"message" => "\<(?<id>[0-9]+)\>(?<timestamp>([a-zA-Z]+)\s[0-9]{1,2}\s[0-9]{1,4}\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})\s%{HOSTNAME:hostname} \%\%(?<version>[0-9]{2})(?<model>[a-zA-Z0-9]+)\/(?<severity>[0-9])\/(?<brief>[a-zA-Z0-9]+)\S+:(?<description>.*)"
    	}
        }
    }
    output {
    stdout{codec=>rubydebug}
    }
    

    output输出如下:

    {
               "host" => "sdn-253",
                 "id" => "188",
          "timestamp" => "Mar 29 2019 16:57:30",
           "hostname" => "BJQ-219-A1-ITCloud-FW-E8000E-1",
              "brief" => "POLICYPERMIT",
         "@timestamp" => 2019-06-28T09:54:01.987Z,
           "severity" => "4",
           "@version" => "1",
            "version" => "01",
              "model" => "SEC",
            "message" => "<188>Mar 29 2019 16:57:30 BJQ-219-A1-ITCloud-FW-E8000E-1 %%01SEC/4/POLICYPERMIT(l)[1976979]:VSYS=public;",
        "description" => "VSYS=public;"
    }
    

    Flume

    Apache Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。Flume有两个版本,分别是Flume OG和Flume NG,目前用的都是FlumeNG。
    Flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。

    Flume的外部结构

    在这里插入图片描述

    如上图所示,数据发生器(如:facebook,twitter)产生的数据被服务器上的agent所收集,之后数据收容器从各个agent上汇集数据并将采集到的数据存入到HDFS或者HBase中。

    Flume事件

    事件作为Flume内部数据传输的最基本单元.它是由一个转载数据的字节数组(该数据组是从数据源接入点传入,并传输给传输器,也就是HDFS/HBase)和一个可选头部构成。
    典型的Flume 事件如下面结构所示:

    在这里插入图片描述

    Flume agent

    对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端哪儿接收收集,或者从其他的Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent. 如下图所示flume的基本模型:

    在这里插入图片描述
    Source

    从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等。

    Channel

    channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性.并且它可以和任意数量的source和sink链接. 支持的类型有: JDBC channel , File System channel ,Memort channel等.

    Sink

    sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地.目标地可能是另一个sink,也可能HDFS,HBase。当Sink写出event成功后,就会向Channel提交事务。Sink事务提交成功,处理完成的event将会被Channel删除。否则Channel会等待Sink重新消费处理失败的event。

    Interceptor

    拦截器是简单的插件式组件,设置在source和channel之间。source接收到的事件event,在写入channel之前,拦截器都可以进行转换或者删除这些事件。每个拦截器只处理同一个source接收到的事件。可以自定义拦截器。预定义的拦截器包含时间戳拦截器TimestampInterceptor、主机拦截器HostInterceptor、静态拦截器StaticInterceptor、正则过滤拦截器RegexExtractorInterceptor,通过使用不同的拦截器,实现不同的功能。
    但是以上的这些拦截器,不能改变原有日志数据的内容或者对日志信息添加一定的处理逻辑,当一条日志信息有几十个甚至上百个字段的时候,在传统的Flume处理下,收集到的日志还是会有对应这么多的字段,也不能对你想要的字段进行对应的处理。根据实际业务的需求,为了更好的满足数据在应用层的处理,通过自定义Flume拦截器,过滤掉不需要的字段,并对指定字段加密处理,将源数据进行预处理。减少了数据的传输量,降低了存储的开销。

    在这里插入图片描述

    Logstash和Flume对比

    1、Logstash比较偏重于字段的预处理,在异常情况下可能会出现数据丢失,只是在运维日志场景下,一般认为这个可能不重要;而Flume偏重数据的传输,几乎没有数据的预处理,仅仅是数据的产生,封装成event然后传输;传输的时候flume比logstash多考虑了一些可靠性。因为数据会持久化在channel中,数据只有存储在下一个存储位置(可能是最终的存储位置,如HDFS;也可能是下一个Flume节点的channel),数据才会从当前的channel中删除。这个过程是通过事务来控制的,这样就保证了数据的可靠性。
    2、Logstash有几十个插件,配置比较灵活,flume强调用户自定义开发;
    3、Logstash的input和filter还有output之间都存在buffer,进行缓冲;Flume直接使用channel做持久化
    4、Logstash性能以及资源消耗比较严重,且不支持缓存;

    在这里插入图片描述

    参考

    ELK logstash 配置语法(24th)
    ELK 之 Logstash
    使用logstash的logstash-input-kafka插件读取kafka中的数据
    logstash过滤器filter grok多种日志匹配使用心得
    一文快速上手Logstash
    logstash的各个场景应用(配置文件均已实践过)
    Logstash配置详解(不断更新)
    Logstash 最佳实践
    Logstash的介绍、原理、优缺点、使用、持久化到磁盘、性能测试
    数据采集:Flume和Logstash的工作原理和应用场景
    Flume日志采集系统与Logstash对比
    Flume概念与原理、与Kafka优势对比
    Flume构建日志采集系统
    大数据学习——flume拦截器
    日志采集系统flume和kafka有什么区别及联系,它们分别在什么时候使用,什么时候又可以结合?

    展开全文
  • Flume概念原理、与Kafka优势对比

    万次阅读 多人点赞 2018-03-27 11:30:15
    flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。其结构如下图所示:    2.应用场景  比如我们在做一个电子商务网站...

    1 .背景

          flume是由cloudera软件公司产出的可分布式日志收集系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一.

    2 .概述

       1.  什么是flume?

           apache Flume 是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来存储的工具/服务,或者数集中机制。flume具有高可用,分布式,配置工具,其设计的原理也是基于将数据流,如日志数据从各种网站服务器上汇集起来存储到HDFS,HBase等集中存储器中。其结构如下图所示:

          

      2.应用场景

          比如我们在做一个电子商务网站,然后我们想从消费用户中访问点特定的节点区域来分析消费者的行为或者购买意图. 这样我们就可以更加快速的将他想要的推送到界面上,实现这一点,我们需要将获取到的她访问的页面以及点击的产品数据等日志数据信息收集并移交给Hadoop平台上去分析.而Flume正是帮我们做到这一点。现在流行的内容推送,比如广告定点投放以及新闻私人定制也是基于次,不过不一定是使用FLume,毕竟优秀的产品很多,比如facebook的Scribe,还有Apache新出的另一个明星项目chukwa,还有淘宝Time Tunnel。

    3.Flume的优势

          1.  Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS,HBase

          2.  当收集数据的速度超过将写入数据的时候,也就是当收集信息遇到峰值时,这时候收集的信息非常大,甚至超过了系统的写入数据能力,这时候,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供一共平稳的数据.

         3.   提供上下文路由特征

         4.   Flume的管道是基于事务,保证了数据在传送和接收时的一致性.

         5.   Flume是可靠的,容错性高的,可升级的,易管理的,并且可定制的。 

    4. Flume具有的特征:

        1. Flume可以高效率的将多个网站服务器中收集的日志信息存入HDFS/HBase中

        2. 使用Flume,我们可以将从多个服务器中获取的数据迅速的移交给Hadoop中

        3. 除了日志信息,Flume同时也可以用来接入收集规模宏大的社交网络节点事件数据,比如facebook,twitter,电商网站如亚马逊,flipkart等

        4. 支持各种接入资源数据的类型以及接出数据类型

        5. 支持多路径流量,多管道接入流量,多管道接出流量,上下文路由等

        6. 可以被水平扩展

     3. Flume的结构

        1. flume的外部结构:

     

        

         如上图所示,数据发生器(如:facebook,twitter)产生的数据被被单个的运行在数据发生器所在服务器上的agent所收集,之后数据收容器从各个agent上汇集数据并将采集到的数据存入到HDFS或者HBase中

     2. Flume 事件

      事件作为Flume内部数据传输的最基本单元.它是由一个转载数据的字节数组(该数据组是从数据源接入点传入,并传输给传输器,也就是HDFS/HBase)和一个可选头部构成.

    典型的Flume 事件如下面结构所示:

    我们在将event在私人定制插件时比如:flume-hbase-sink插件是,获取的就是event然后对其解析,并依据情况做过滤等,然后在传输给HBase或者HDFS.

    3.Flume Agent

      我们在了解了Flume的外部结构之后,知道了Flume内部有一个或者多个Agent,然而对于每一个Agent来说,它就是一共独立的守护进程(JVM),它从客户端哪儿接收收集,或者从其他的 Agent哪儿接收,然后迅速的将获取的数据传给下一个目的节点sink,或者agent. 如下图所示flume的基本模型

    Agent主要由:source,channel,sink三个组件组成.

    Source:

       从数据发生器接收数据,并将接收的数据以Flume的event格式传递给一个或者多个通道channal,Flume提供多种数据接收的方式,比如Avro,Thrift,twitter1%等

    Channel:

     channal是一种短暂的存储容器,它将从source处接收到的event格式的数据缓存起来,直到它们被sinks消费掉,它在source和sink间起着一共桥梁的作用,channal是一个完整的事务,这一点保证了数据在收发的时候的一致性. 并且它可以和任意数量的source和sink链接. 支持的类型有: JDBC channel , File System channel , Memort channel等.

    sink:

      sink将数据存储到集中存储器比如Hbase和HDFS,它从channals消费数据(events)并将其传递给目标地. 目标地可能是另一个sink,也可能HDFS,HBase.

    它的组合形式举例:

    以上介绍的flume的主要组件,下面介绍一下Flume插件:

    1. Interceptors拦截器

       用于source和channel之间,用来更改或者检查Flume的events数据

    2. 管道选择器 channels Selectors

       在多管道是被用来选择使用那一条管道来传递数据(events). 管道选择器又分为如下两种:

       默认管道选择器:  每一个管道传递的都是相同的events

      多路复用通道选择器:  依据每一个event的头部header的地址选择管道.

    3.sink线程

       用于激活被选择的sinks群中特定的sink,用于负载均衡.
    4.Flume与Kafka对比

    1. kafka和flume都是日志系统,kafka是分布式消息中间件,自带存储,提供push和pull存取数据功能。flume分为agent(数据采集器),collector(数据简单处理和写入),storage(存储器)三部分,每一部分都是可以定制的。比如agent采用RPC(Thrift-RPC)、text(文件)等,storage指定用hdfs做。
    2. kafka做日志缓存应该是更为合适的,但是 flume的数据采集部分做的很好,可以定制很多数据源,减少开发量。所以比较流行flume+kafka模式,如果为了利用flume写hdfs的能力,也可以采用kafka+flume的方式。


    采集层 主要可以使用Flume, Kafka两种技术。

    FlumeFlume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展API.

    KafkaKafka是一个可持久化的分布式的消息队列。

    • Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题Topics。相比之下,Flume是一个专用工具被设计为旨在往HDFS,HBase发送数据。它对HDFS有特殊的优化,并且集成了Hadoop的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用kafka;如果数据被设计给Hadoop使用,使用Flume

     

    • 正如你们所知Flume内置很多的sourcesink组件。然而,Kafka明显有一个更小的生产消费者生态系统,并且Kafka的社区支持不好。希望将来这种情况会得到改善,但是目前:使用Kafka意味着你准备好了编写你自己的生产者和消费者代码。如果已经存在的Flume SourcesSinks满足你的需求,并且你更喜欢不需要任何开发的系统,请使用Flume

     

    • Flume可以使用拦截器实时处理数据。这些对数据屏蔽或者过量是很有用的。Kafka需要外部的流处理系统才能做到。

     

    • KafkaFlume都是可靠的系统,通过适当的配置能保证零数据丢失。然而,Flume不支持副本事件。于是,如果Flume代理的一个节点崩溃了,即使使用了可靠的文件管道方式,你也将丢失这些事件直到你恢复这些磁盘。如果你需要一个高可靠行的管道,那么使用Kafka是个更好的选择。

     

    • FlumeKafka可以很好地结合起来使用。如果你的设计需要从KafkaHadoop的流数据,使用Flume代理并配置KafkaSource读取数据也是可行的:你没有必要实现自己的消费者。你可以直接利用FlumeHDFSHBase的结合的所有好处。你可以使用Cloudera Manager对消费者的监控,并且你甚至可以添加拦截器进行一些流处理。

    FlumeKafka可以结合起来使用。通常会使用Flume + Kafka的方式。其实如果为了利用Flume已有的写HDFS功能,也可以使用Kafka + Flume的方式。

    ----------------------------------------------------<END>-------------------------------------------------------


    展开全文
  • 5、微程序控制器思维导图微程序控制器的设计思路微程序控制器的基本结构微程序控制器的工作原理概念对比程序与微程序指令与微指令主存储器与控制器存储器IR和uIR(MDR和CMDR)PC和uPC(MAR和CMAR) 思维导图 微程序控制...

    思维导图

    在这里插入图片描述

    微程序控制器的设计思路

    在这里插入图片描述

    1、一条指令对应多个微指令
    2、一条微指令对应多个微命令
    3、一条微命令对应一条微操作
    4、程序与指令:一个程序由多条指令构成
    5、微程序与微指令:一个微程序由多条微指令构成

    微程序控制器的基本结构

    在这里插入图片描述

    微程序控制器的工作原理

    在这里插入图片描述

    概念对比

    程序与微程序

    程序:由一系列的机器指令组成
    微程序:由一系列的微指令组成

    指令与微指令

    微指令:用于描述指令在各个阶段执行哪些操作

    主存储器与控制器存储器

    主存储器:存储机器指令
    控制器存储器:存放微指令序列,厂家集成ROM

    IR和uIR(MDR和CMDR)

    uIR:用与存放当前正在执行的微指令
    IR:用与存放当前正在执行的指令

    PC和uPC(MAR和CMAR)

    PC:指明下一条机器指令的地址
    uPC:指令下一条微指令的地址

    展开全文
  • 通信原理(百度) 同步通信:要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。 异步通信:异步通信在发送字符...
  • 一、概念 ThreadLocal:线程本地变量,以空间换时间的方式为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。可以理解为一个当前线程的map...
  • 一、概念 ReadWriteLock:见词知意,读写锁。正常业务中读操作往往比写操作更多,然后用独占锁去加锁,就会造成同样的读操作,只能排队等待,业务执行效率会降低,JDK1.5之后添加了读写锁ReadWriteLock,是一个接口...
  •  SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP ,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的 CGLB 代理方式 SecurityHandler这个通知类可以换成安全性...
  • RBD和QCOW2作为存储虚拟化中两个重要的磁盘格式代表,在概念和使用上都有很多相似的地方,但其内部实现原理稍有差别,本文主要对比两个磁盘格式在基本概念,快照,克隆等方面的不同
  • 参考文章:8位, 16位,24位,32位图片显示原理对比
  • js跨域问题浅析及解决方法优缺点对比什么是跨域?概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许...
  • 概述这几天就简单介绍一下GTID好了~这篇是概念篇..从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障...
  • 本单元使用结构化编程作为对比基础,简要介绍 OOP 语言的概念原理。 面向对象的语言遵循的编程模式不同于结构化编程语言,比如 C 和 COBOL。结构化编程范例是高度面向数据的:您拥有数据结构
  • 目录 梯度下降的场景假设 梯度下降 微分 ...转载地址可以结合我的博文Numpy梯度下载实现对比来看 梯度下降的场景假设 梯度 梯度下降算法的数学解释 梯度下降算法的实例 梯度下降算法的实现...
  • Storm 核心概念及工作原理

    千次阅读 2017-11-10 10:38:28
    Strom 简介Apache Storm(http://storm.apache.org)是由Twitter 开源的分布式实时计算系统,Storm 可以非常容易并且可靠的处理无线的数据流,对比Hadoop的批处理,Storm是一个实时的、分布式的、具备高容错的计算...
  • 我们在上篇文章已经对比了不同的存储系统之间的区别,本章开始逐步深入记录Ceph的学习和运用。 开源分布式存储系统的对比 Ceph简介 Ceph是一个分布式存储系统,提供对象,块和文件存储,是一个免费开源软件的存储...
  • 企业CDN缓存系统--varnish1.CDN缓存系统1.1 概念1.2 CDN的工作原理2.varnish2.1什么是varnish?2.2 varnish加速器与Squid加速器的对比2.3 varnish代理服务器的工作方式2.4 为什么要使用varnish加速缓存代理服务器?...
  • 一、Elasticsearch与Apache Lucene对比 1、Elasticsearch 优点: 对Lucence的封装,完全支持Apache Lucene 的接近实时的搜索 通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单 分布式实时...
  • 01.MongoDB基本概念原理

    千次阅读 2019-04-02 12:37:59
    一、MongoDB概述 1、mongoDB概述 MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写 2、NoSQL概述 ...NoSQL,指的是非关系型的数据库。...3、关系数据库对比非关系数据库 关系型数据库 ...
  • 多态的基本概念 多态是面向对象设计语言数据抽象和继承之外的第三个基本特征 多态性(polymorphism)提供接口与具体实现之间的另一层隔膜,从而将“what”和“how”分离开来,多态性改善了代码的可读和组织性,同时...
  • Hive-核心概念和架构原理(第一天) 一、核心概念 hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据映射成一张表,并提供SQL查询的功能。 HIVE与RMDBS数据库系统的区别 对比项 HIVE RMDBS 查询语言 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 780
精华内容 312
关键字:

对比原理概念