目前我们使用的一个 b 端软件的报错日志分散在集群各处,现在想把它收集到一个地方然后统一丢进 Kafka 提供给下游业务进行消费。

我想到了 flume,之前让同事搭建的这次自己想多了解一些细节于是就开搞了。

首先还是下载 flume 的客户端,这里我使用最新版本 1.9.0

curl -O http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz
tar -zvf apache-flume-1.9.0-bin.tar.gz

设置需要的 java 环境,注意路径自定义一下,没有 java 自己下个 java8

export JAVA_HOME=/opt/java8
PATH=$PATH:$JAVA_HOME/bin

在 apache-flume-1.9.0-bin/conf 我们可以找到对应的配置文件模版,1.9.0 的模版大概长这样

# The configuration file needs to define the sources,
# the channels and the sinks.
# Sources, channels and sinks are defined per agent,
# in this case called 'agent' agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink # For each one of the sources, the type is defined
agent.sources.seqGenSrc.type = seq # The channel can be defined as follows.
agent.sources.seqGenSrc.channels = memoryChannel # Each sink's type must be defined
agent.sinks.loggerSink.type = logger #Specify the channel the sink should use
agent.sinks.loggerSink.channel = memoryChannel # Each channel's type is defined.
agent.channels.memoryChannel.type = memory # Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.memoryChannel.capacity = 100

我们复制一份当作操作的 conf

mv flume-conf.properties.template flume-conf.properties

从上面的配置文件中我们不难发现

source channel 和 sink 都是单独定义的项,他们都需要配置一个这个配置文件里面生效的名字,以及其他的基于这个名字的配置。

比如这里我的需求是将某文件里面的新增信息读出来包装为事件,先发到 channel 等待处理,我可以配置一个 Taildir Source 来处理这个任务。

flume 为我们准备了非常多的现成的 sources channel 和 sink ,他们都具有不同的功能可以直接提供给我们使用,具体可以参考一下对应版本的官方文档。

这里我们只谈一下这次用到的 Taildir Source

agent.sources = sensorsInvalidRecordsFile
agent.channels = file
agent.sinks = kafkaSink # For each one of the sources, the type is defined
agent.sources.sensorsInvalidRecordsFile.type = TAILDIR
agent.sources.sensorsInvalidRecordsFile.filegroups = f1
agent.sources.sensorsInvalidRecordsFile.filegroups.f1 = /sa_cluster/logs/sp/extractor/invalid_records
agent.sources.sensorsInvalidRecordsFile.headers.f1.fileName = invalid_records
agent.sources.sensorsInvalidRecordsFile.headers.f1.logType = sensorsInvalidRecords
agent.sources.sensorsInvalidRecordsFile.channels = file
agent.sources.positionFile = ~/.flume/taildir_position.json

头三行先申明一下这里配置的 sources channels sinks 各为什么名字。这里我们可以留意到,所有的组件都被命名为复数,这就意味着我们可以同时申明多个 sources ,只需要将其配置行用空格依次分割即可

agent.sources = s1 s2 s3

这样即可同时生成三个 source。

这里的配置我们指定了一个实例,并且对这个实例上的属性就行初始化。

然后我们继续配置一个 channel 。这里配置一个 file channel,将从 source 里面抽出来的 event 都落盘防止数据丢失。

# Each channel's type is defined.
agent.channels.fileC.type = file
agent.channels.fileC.dataDirs = ~/.flume/file-channel/data
agent.channels.fileC.useDualCheckpoints = true
agent.channels.fileC.backupCheckpointDir = ~/.flume/file-channel/backup_checkpoint

最后我需要定义一个可以将 channel 里面的数据读出来,并且放到 kafka 里面去的 sink。找了一下正好有一个叫 kafka sink 的 sink 可以满足我

可以看到和 apache hadoop 生态结合得比较好的 flume 为什么成为抽取日志的首选,或者优先考虑的对象,就是其对生态的友好和提供足够多的开箱即用的功能。

agent.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink
agent.sinks.kafkaSink.channel = fileC
agent.sinks.kafkaSink.kafka.bootstrap.servers = 10.171.97.1:9092, 10.163.13.219:9092, 10.170.249.122:9092
agent.sinks.kafkaSink.topic = flume-topic-sensors-invalid-records
agent.sinks.kafkaSink.producer.acks = -1
agent.sinks.kafkaSink.producer.compression.type = snappy

将 kafka 集群信息配置上去。

最后一步我们来启动 flume-ng

/bin/flume-ng agent -n agent -c conf -f /home/flume_self/apache-flume-1.9.0-bin/conf/flume-conf.properties -Dflume.root.logger=INFO,console

-n 是名称

-c 是配置

-f 是配置地址

最好用 nohup 或者 supervisor 对任务进行管理。

再去目标 kafka-manager 之类的工具上去看下是否发送成功即可!

到此为止我们的目标就达成了。感觉还是蛮简单的,就是随便配置一下配置就可以完成工作,需要定制化的工作 flume 也支持利用一些勾子读取到数据然后进行 etl 或者修改之后再发送。还是比较灵活。希望早点遇到类似需求再玩一下。

Reference:

https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html    Flume user_guide

https://juejin.im/post/5be4e549f265da61441f8dbe    Apache Flume 入门教程

https://www.mtyun.com/library/how-to-install-flume-on-centos7    在 CentOS7 上安装 Flume

Flume 实战,将多台机器日志直接收集到 Kafka的更多相关文章

  1. flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

    1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...

  2. polysh安装与使用-同时查看多台机器日志

    polysh简介 polysh 是一个交互式命令,可以在一台服务器上批量的对一批服务器进行处理,运行交互式命令.官方的简介如下: Polysh is a tool to aggregate sever ...

  3. 项目实战14—ELK 企业内部日志分析系统

    一.els.elk 的介绍 1.els,elk els:ElasticSearch,Logstash,Kibana,Beats elk:ElasticSearch,Logstash,Kibana ① ...

  4. Flume 实战练习

    前期准备 了解Flume 架构及核心组件 Flume 架构及核心组件 Source : 收集(指定数据源从哪里获取) Channel : 聚集 Sink : 输出(把数据写到哪里去) 学习使用 Flu ...

  5. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

  6. Oracle RAC中的一台机器重启以后无法接入集群

          前天有个同事说有套AIX RAC的其中一台服务器重启了操作系统以后,集群资源CSSD的资源一直都在START的状态,检查日志输出有如下内容: [    CSSD][1286]clssnmv ...

  7. 如何在同一台机器上安装多个MySQL的实例

    转自:'http://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的 ...

  8. ABP大型项目实战(2) - 调试与排错 - 日志 - 查看审计日志

    这是<ABP大型项目实战>系列文章的一篇.   项目发布到生产环境后难免会有错误. 那么如何进行调试和排错呢?   我看到俱乐部里有人是直接登陆生产服务器把数据库下载到开发机器进行调试排错 ...

  9. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

随机推荐

  1. bootstrap-switch使用,small、mini设置

    1.首先需要引用https://www.bootcss.com/p/bootstrap-switch/. bootstrap-switch插件库 2.先引用jquery文件,在引用bootstrap. ...

  2. ajax 执行成功以后返回的数据走的是error方法而不是success方法的问题

    今天在一个功能的时候发现写的ajax的方法执行后台代码成功后返回前台时执行的是error方法而不是success方法,代码如下 jQuery('#form').ajaxSubmit({ type: & ...

  3. React生命周期中应该做什么事

    React生命周期函数 装载组件触发 0.construct(props) 用来 props--->state 初始化state,并且把props转化为state 1.componentWill ...

  4. webpack 里的 import, exports 实现原理

    在使用 webpack 对脚本进行打包, 在开发中, 每个文件中都会使用 import 语句来导入一些功能,又会使用 export 语句导出一些功能,为了研究 import 和 export 原理,研 ...

  5. IT之快速提高效率的方法与思考

    前言 文章也没什么很高深的问题,大概花个5分钟能看完.是一些大家都知道的道理,作为提醒与总结. 关于提高方面的内容,一般都有个人的方法,但大致都一致.可分为几个步骤. 框架.工具使用相关 使用框架.工 ...

  6. npm安装时-S -D作用及区别

    -S 即--save(保存) 包名会被注册在package.json的dependencies里面,在生产环境下这个包的依赖依然存在 -D 即--dev(生产) 包名会被注册在package.json ...

  7. js 对象克隆方法总结(不改变原对象)

    1.通用对象克隆: function clone(obj){ let temp = null; if(obj instanceof Array){ temp = obj.concat(); }else ...

  8. CSS3 完善盒模型

    CSS3 改善了传统盒模型结构,增强了盒子构成要素的功能,扩展了盒模型显示的方式. 改善结构:为盒子新增轮廓区: 增强功能:内容区增强 CSS 自动添加内容功能,增强内容移除.换行处理:允许多重定义背 ...

  9. odex vdex art区别

    一.vdexpackage 直接转化的 可执行二进制码 文件:1.第一次开机就会生成在/system/app/<packagename>/oat/下:2.在系统运行过程中,虚拟机将其 从 ...

  10. uni-app结合PHP实现单用户登陆

    单用户登陆,即在一个应用中,同一个用户只能在线登陆一个,一个用户登陆,在其他设备上会被即时挤下线,确认后清空登陆该设备上的登陆装填并退回到登陆界面. uni-app是目前能通过使用vue.js框架只需 ...