日志接入es与hdfs流程
Filebeat
轻量级日志采集工具,代替logstash部署在采集机,可减轻采集机机器压力。
Filebeat解压即可使用。
Filebeat注册为系统服务:
PowerShell.exe -ExecutionPolicy UnRestricted -File install-service-filebeat.ps1
修改配置文件filebeat.yml
filebeat.prospectors:
- input_type: log
paths:
- C:\logs\*log
exclude_lines: ["^#"]
output.kafka:
hosts: ["x.x.x.x:6667"]
topic: beats
version: 0.10.0
Input参数
paths | /var/log/* /*.log |
encoding | 指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的。 |
input_type | 指定文件的输入类型log(默认)或者stdin |
exclude_lines | 在输入中排除符合正则表达式列表的那些行。 |
include_lines | 包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines执行完毕之后会执行exclude_lines。 |
exclude_files | 忽略掉符合正则表达式列表的文件(默认为每一个符合paths定义的文件都创建一个harvester)。 |
fields | 向输出的每一条日志添加额外的信息,比如"level:debug",方便后续对日志进行分组统计。默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,例如fields.level。 |
fields_under_root | 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。自定义的field会覆盖filebeat默认的field。 |
ignore_older | 可以指定Filebeat忽略指定时间段以外修改的日志内容,比如2h(两个小时)或者5m(5分钟)。 |
close_older | 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h,change只会在下一次scan才会被发现 |
force_close_files | Filebeat会在没有到达close_older之前一直保持文件的handle,如果在这个时间窗内删除文件会有问题,所以可以把force_close_files设置为true,只要filebeat检测到文件名字发生变化,就会关掉这个handle |
scan_frequency | Filebeat以多快的频率去prospector指定的目录下面检测文件更新(比如是否有新增文件),如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s。 |
document_type | 设定Elasticsearch输出时的document的type字段,也可以用来给日志进行分类。log |
harvester_buffer_size | 每个harvester监控文件时,使用的buffer的大小。16384 |
max_bytes | 日志文件中增加一行算一个日志事件,max_bytes限制在一次日志事件中最多上传的字节数,多出的字节会被丢弃。 |
multiline | 适用于日志中每一条日志占据多行的情况,比如各种语言的报错信息调用栈。 |
tail_files | 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容。 |
backoff | Filebeat检测到某个文件到了EOF之后,每次等待多久再去检测文件是否有更新,默认为1s。 |
max_backoff | Filebeat检测到某个文件到了EOF之后,等待检测文件更新的最大时间,默认是10秒。 |
backoff_factor | 定义到达max_backoff的速度,默认因子是2,到达max_backoff后,变成每次等待max_backoff那么长的时间才backoff一次,直到文件有更新才会重置为backoff。 |
spool_size | spooler的大小,spooler中的事件数量超过这个阈值的时候会清空发送出去(不论是否到达超时时间)。 |
idle_timeout | spooler的超时时间,如果到了超时时间,spooler也会清空发送出去(不论是否到达容量的阈值)。 |
registry_file | 记录filebeat处理日志文件的位置的文件 |
config_dir | 如果要在本配置文件中引入其他位置的配置文件,可以写在这里(需要写完整路径),但是只处理prospector的部分。 |
publish_async | 是否采用异步发送模式(实验功能)。 |
Kafka输出参数
hosts | ["localhost:9092"] |
topic | `%{[type]}` |
partition.hash | 策略默认为 hash。可选项还有 random 和 round_robin。 |
reachable_only | false |
version | 0.10.0 |
retry.max | 获取元数据最大尝试次数3 |
retry.backoff | Lead选举时等待间隔250ms |
refresh_frequency | 刷新元数据间隔10m |
worker | 线程数1 |
max_retries | 失败重试次数3 |
bulk_max_size | 单次请求数目2048 |
timeout | Broker响应超时时间30s |
broker_timeout | Ack超时时间10s |
channel_buffer_size | 每个broker缓存条数256 |
keep_alive | 0 |
compression | gzip |
max_message_bytes | Message最大字节1000000 |
required_acks | 可选项有 -1、0 和 1。分别代表:等待全部副本完成、不等待、 等待本地完成。 |
flush_interval | 两个producer调用等待时间 |
client_id | beats |
kafka
应用kafka缓冲数据及多消费的特点,可对同一份数据写入es及hdfs。
(HDP2.5,kafka0.10.0)
修改参数:
log.dirs
zookeeper.connect
Logstash
Logstash消费kafka中的数据,正则解析后写入es
修改配置:
config/jvm.options
-Xms256m
-Xmx1g
logstash.yml
http.host: "10.0.0.26"
http.port: 9678
新建conf/kafka2es.conf
input {
kafka {
bootstrap_servers => "10.0.0.26:6667"
group_id => "logstash"
topics => ["beats"]
codec => json
auto_offset_reset => "latest"
}
}
filter {
if [type] == "log" {
#ignore log comments
if [message] == "" or [message] == "null" {
drop {}
}
grok {
# check that fields match your IIS log settings
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IPORHOST:site} %{WORD:method} %{URIPATH:page} %{NOTSPACE:querystring} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clienthost} %{NOTSPACE:useragent} %{NOTSPACE:refer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:time_taken}"]
}
date {
match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
timezone => "Etc/UTC"
}
useragent {
source=> "useragent"
prefix=> "browser_"
}
mutate {
remove_field => ["log_timestamp","offset","input_type","tags","@version","beat.version"]
}
}
}
output {
elasticsearch {
hosts => "x.x.x.x:12200"
}
}
启动
bin/logstash -f conf/kafka2es.conf
Logstash配置参数
pipeline.batch.size | 每次接受的条数125 |
pipeline.batch.delay | 延迟时间5ms |
pipeline.workers | 2 |
pipeline.output.workers | 1 |
pipeline.unsafe_shutdown | |
queue.type | memory、persisted |
path.queue | Persisted数据存储目录 |
queue.page_capacity | Persisted每个文件大小250mb |
http.host | ip |
http.port | 端口 |
node.name | 主机名 |
path.data | data |
Kafka输入参数
add_field | |
auto_commit_interval_ms | Offset提交间隔5000 |
auto_offset_reset | earliest: 最早的 latest: 最近的 none: throw exception anything else: throw exception |
bootstrap_servers | host1:port1,host2:port2 |
check_crcs | 自动检查所消耗记录的CRC32。这确保没有发生消息的在线或磁盘损坏。此检查会增加一些开销,因此在寻求极高性能的情况下可能会禁用此检查。 |
client_id | logstash |
codec | plain |
connections_max_idle_ms | 关闭空闲连接 |
consumer_threads | 消费线程1,与分区对应调整 |
decorate_events | 添加kafka信息字段,false |
enable_auto_commit | Offset自动提交,true |
enable_metric | 指标收集,true |
fetch_max_wait_ms | 获取数据最大等待时间,应小于等于poll_timeout_ms |
fetch_min_bytes | 获取数据最小字节 |
group_id | logstash |
heartbeat_interval_ms | 检测consumer加入离开,大于1/3session.timeout.ms |
id | |
max_partition_fetch_bytes | 从每个分区fetch的消息大小限制 |
max_poll_records | Poll数量限制 |
metadata_max_age_ms | 以微秒为单位的时间,是在我们强制更新metadata的时间间隔。即使我们没有看到任何partition leadership改变 |
partition_assignment_strategy | 对于消费者Kafka提供的两种分配策略: range和roundrobin,由参数 partition.assignment.strategy指定,默认是range策略 |
poll_timeout_ms | 消费者获取消息等待时间100 |
receive_buffer_bytes | socket的接收缓冲区 |
reconnect_backoff_ms | 连接失败时,当我们重新连接时的等待时间。 |
request_timeout_ms | 消息发送的最长等待时间 |
retry_backoff_ms | 设置Producer在refresh metadata之前要等待的时间 |
send_buffer_bytes | socket的发送缓冲区 |
session_timeout_ms | 消费者超时时间这个值必须设置在broker configuration中的group.min.session.timeout.ms 与 group.max.session.timeout.ms之间。 |
topics | ["logstash"] |
topics_pattern | |
type |
Es输出参数
absolute_healthcheck_path | false |
action | index |
codec | plain |
doc_as_upsert | |
document_id | |
document_type | |
enable_metric | true |
failure_type_logging_whitelist | 失败白名单不写日志 |
flush_size | 小于pipline的bashsize |
healthcheck_path | |
hosts | ["127.0.0.1:9200","127.0.0.2:9200"] |
id | |
idle_flush_time | 1s,flush间隔时间 |
index | "logstash-%{+YYYY.MM.dd}" |
pipeline | |
pool_max | 1000 |
pool_max_per_route | 100 |
resurrect_delay | 5 |
retry_initial_interval | 2 |
retry_max_interval | 64 |
retry_on_conflict | 当执行索引和更新的时候,有可能另一个进程正在执行更新。这个时候就会造成冲突,这个参数就是用于定义当遇到冲突时重复执行的次数1 |
timeout | 写入es超时时间60s |
routing | %{foo} |
validate_after_inactivity | 10000 |
Flume
(hdp2.5,flume1.5.2)
Flume消费kafka中的数据,将原始数据分区存入hdfs(wasb),如果用logstash则会写入原生的hdfs而不会写入wasb。
新建配置
flume-conf.properties
#-------agent------
# 定义sources
agent.sources = kafkaSource
# 定义channels
agent.channels = memoryChannel
# 定义sinks
agent.sinks = hdfsSink
agent.sources.kafkaSource.channels = memoryChannel
agent.sinks.hdfsSink.channel = memoryChannel
#-------- kafkaSource-----------------
agent.sources.kafkaSource.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.kafkaSource.zookeeperConnect = x.x.x.x:2181/eskafka
agent.sources.kafkaSource.topic = beats
agent.sources.kafkaSource.groupId = hdfs
agent.sources.kafkaSource.kafka.consumer.timeout.ms = 10000
#------- memoryChannel-------------------------
agent.channels.memoryChannel.type = memory
agent.channels.memoryChannel.capacity=10000
agent.channels.memoryChannel.transactionCapacity=1000
#---------hdfsSink ------------------
agent.sinks.hdfsSink.type = hdfs
agent.sinks.hdfsSink.hdfs.path = /user/test/%Y%m%d
agent.sinks.hdfsSink.hdfs.writeFormat = Text
agent.sinks.hdfsSink.hdfs.fileType = DataStream
agent.sinks.hdfsSink.hdfs.rollInterval = 600
agent.sinks.hdfsSink.hdfs.rollSize = 128000000
agent.sinks.hdfsSink.hdfs.rollCount = 0
agent.sinks.hdfsSink.hdfs.idleTimeout = 600
agent.sinks.hdfsSink.hdfs.minBlockReplicas= 1
启动
nohup bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name agent &
Hdfssink参数
path | 写入hdfs的路径,需要包含文件系统标识,比如:hdfs://namenode/flume/webdata/,可以使用flume提供的日期及%{host}表达式。 |
filePrefix | 默认值:FlumeData 写入hdfs的文件名前缀,可以使用flume提供的日期及%{host}表达式。 |
fileSuffix | 写入hdfs的文件名后缀,比如:.lzo .log等。 |
inUsePrefix | 临时文件的文件名前缀,hdfs sink会先往目标目录中写临时文件,再根据相关规则重命名成最终目标文件; |
inUseSuffix | 默认值:.tmp 临时文件的文件名后缀。 |
rollInterval | 默认值:30 hdfs sink间隔多长将临时文件滚动成最终目标文件,单位:秒 如果设置成0,则表示不根据时间来滚动文件; |
rollSize | 默认值:1024 当临时文件达到该大小(单位:bytes)时,滚动成目标文件; 如果设置成0,则表示不根据临时文件大小来滚动文件; |
rollCount | 默认值:10 当events数据达到该数量时候,将临时文件滚动成目标文件; 如果设置成0,则表示不根据events数据来滚动文件; |
idleTimeout | 默认值:0 当目前被打开的临时文件在该参数指定的时间(秒)内,没有任何数据写入,则将该临时文件关闭并重命名成目标文件; |
batchSize | 默认值:100 每个批次刷新到HDFS上的events数量; |
codeC | 文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy |
fileType | 默认值:SequenceFile 文件格式,包括:SequenceFile, DataStream,CompressedStream 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC; 当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值; |
maxOpenFiles | 默认值:5000 最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭; |
minBlockReplicas | 默认值:HDFS副本数 写入HDFS文件块的最小副本数。 该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件。 |
writeFormat | 写sequence文件的格式。包含:Text, Writable(默认) |
callTimeout | 默认值:10000 执行HDFS操作的超时时间(单位:毫秒) |
threadsPoolSize | 默认值:10 hdfs sink启动的操作HDFS的线程数。 |
rollTimerPoolSize | 默认值:1 hdfs sink启动的根据时间滚动文件的线程数。 |
round | 默认值:false 是否启用时间上的"舍弃",这里的"舍弃",类似于"四舍五入",如果启用,则会影响除了%t的其他所有时间表达式; |
roundValue | 默认值:1 时间上进行"舍弃"的值; |
roundUnit | 默认值:seconds 时间上进行"舍弃"的单位,包含:second,minute,hour |
timeZone | 默认值:Local Time 时区。 |
useLocalTimeStamp | 默认值:flase 是否使用当地时间。 |
closeTries | 默认值:0 hdfs sink关闭文件的尝试次数; 如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,这个未关闭的文件将会一直留在那,并且是打开状态。 设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功。 |
retryInterval | 默认值:180(秒) hdfs sink尝试关闭文件的时间间隔,如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1. |
serializer | 默认值:TEXT 序列化类型。其他还有:avro_event或者是实现了EventSerializer.Builder的类名。 |