前言
通常情况下,我们将日志数据通过logstash收集到es,然后用kibana进行实时查询,可视化分析,这就是我们常用的elk架构。但是基于elk的日志分析,通常比较常用的是实时分析,日志存储一段时间就会删掉。那么在一些情况下,我需要将日志数据也存储一份到hdfs用来做大数据分析,这部分日志的存储时间会比存在es中久很多。
运维一般收集日志到hdfs经常会使用两种工具,一种是flume,一种是logstash,本文介绍logstash如何收集日志到hdfs。
logstash hdfs插件安装
logstash如果想收集日志到hdfs需要安装hdfs插件,官方安装命令如下
../bin/logstash-plugin install logstash-output-webhdfs
如果安装不成功或者直接卡着不动了,原因可能是防火墙挡掉了logstash默认的gem源,这个时候可以尝试换成淘宝的源
$ cd /opt/service/logstash/ $ vim Gemfile #source "https://rubygems.org" source https://ruby.taobao.org/
如果更换完源还是不行,就需要自己手动安装了
- 去https://github.com/logstash-plugins/logstash-output-webhdfs下载zip包
- 解压到本地某个目录
- 在logstash目录下的Gemfile文件中,进行如下修改
gem "logstash-output-webhdfs" 改为 gem "logstash-output-webhdfs", :path => "/root/logstash-output-webhdfs/"
- 配置文件修改完成,继续执行如下命令安装插件即可
../bin/logstash-plugin install logstash-output-webhdfs
配置文件设置
注意:logstash启动用户需要有配置文件中webhdfs段path参数目录的写入权限
input{ file{ path=>["/opt/log/data.log"] start_position=>"beginning" codec=>"json" #不处理120天以前的数据,默认为一天 ignore_older => "10368000" sincedb_path => "/opt/service/logstash-2.3.4/test_sincedb" } } output{ elasticsearch{ hosts=>["192.168.201.7:9200","192.168.201.5:9200","192.168.201.6:9200"] index=>"test_log-%{+YYYY-MM}" } webhdfs { workers => 2 host => "192.168.201.4" # namenode节点 port => "50070" # webhdfs端口 user => "hdfs" #以这个用户的权限去写hdfs path => "/test_logstash/logstash-%{+YYYY}-%{+MM}-%{+dd}.log" # 按天创建log codec => "json" } }
结果验证
logstash启动之后,只要有日志进入,就可以在hdfs的相应目录看到写入的文件,且此文件是按照logstash配置的规则按天生成
[hdfs@task1-sandbox ~]$ hdfs dfs -ls /test_logstash Found 1 items -rw-r--r-- 1 hdfs hadoop 392222 2018-07-17 19:42 /test_logstash/logstash-2018-07-17.log