1 flume配置
1.1 flume-env.sh
export JAVA_OPTS="-Xms100m -Xmx1000m"
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
2 logback集成
logback-flume-appender插件
** logback.xml相关配置**
下图中我将trace级别的日志输出到flume中,因为平常项目中,我们经常用的是info、error、debug
<property resource="properties/config.properties" />
<!-- hadoop目录格式为:/%Y%m%d/%{application}/%{dir} 对应application配置节和additionalAvroHeaders中的dir,其中dir可以为不配置 -->
<appender name="flume" class="com.gilt.logback.flume.FlumeLogstashV1Appender">
<!-- 此项是连接flume节点的ip和端口 -->
<flumeAgents>${flume.agents}</flumeAgents>
<flumeProperties>connect-timeout=4000;request-timeout=8000</flumeProperties>
<batchSize>100</batchSize>
<reportingWindow>1000</reportingWindow>
<!-- 此项配置avro头部信息,dir标识目录 -->
<additionalAvroHeaders>dir=logs</additionalAvroHeaders>
<!-- 此项配置当前应用 -->
<application>${domain}</application>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.dzmsoft.framework.log.service.impl.LogServiceImpl" level="TRACE" >
<appender-ref ref="flume" />
</logger>
这里直接将日志写入到hadoop中,可以在控制台中看到对应的文件
下载后,可以看到里面的数据,里面只会记录,我们需要的数据。
去掉了
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%message%n%ex</pattern>
</layout>
因为logback-flume-appender数据发送body内容异常
这个问题在单进程写日志的时候不会出现,在2个以上的进程时出现event的body数据异常,导致flume的自定义sink中无法解析数据
原因是body中在正常的数据末尾,出现很多空串或者其他的数据,导致解析失败。
分析日志后,发现header中的message数据正常,但body出现问题。怀疑是layout格式化时出现的问题,去掉logback.xml中的layout节点后,数据不再出现异常。
《Flume构建高可用、可扩展的海量日志采集系统》描述数据一旦写入HDFS就不可改变,HDFS中的文件只支持追加的方式,一旦一个文件被创建并写入数据,该文件可以被追加或删除,但是不能改变该文件中的数据。
而Hbase尽管运行在HDFS上,但是Hbase支持对任何写入数据的更新操作,非常类似传统的数据库系统。
这样的特性,也可以理解hdfs存储日志较为合适,存放业务数据并不合适
如果log写入hdfs增加channel,则需要增加配置
hdfs-agent.sources = hdfs-source
hdfs-agent.channels = hdfs-channel
hdfs-agent.sinks = hdfs-sink
# source
hdfs-agent.sources.hdfs-source.type=avro
hdfs-agent.sources.hdfs-source.bind=0.0.0.0
hdfs-agent.sources.hdfs-source.port=36001
# channel
hdfs-agent.channels.hdfs-channel.flumeBatchSize = 100
hdfs-agent.channels.hdfs-channel.type = org.apache.flume.channel.kafka.KafkaChannel
hdfs-agent.channels.hdfs-channel.kafka.bootstrap.servers = bwsc68:9092,bwsc68:9092,bwsc70:9092
hdfs-agent.channels.hdfs-channel.kafka.topic = hdfs_flume
hdfs-agent.channels.hdfs-channel.kafka.consumer.group.id = hdfs_flume_channel
#hdfs-agent.channels.hdfs-channel.kafka.dcm-workorder-channel.kafka.consumer.auto.offset.reset = latest
# sink
hdfs-agent.sinks.hdfs-sink.type=hdfs
hdfs-agent.sinks.hdfs-sink.hdfs.path=hdfs://bwsc65:9000/flume/%{application}/%{dir}/%Y%m%d
hdfs-agent.sinks.hdfs-sink.hdfs.fileType=DataStream
hdfs-agent.sinks.hdfs-sink.hdfs.writeFormat=Text
hdfs-agent.sinks.hdfs-sink.hdfs.round=true
hdfs-agent.sinks.hdfs-sink.hdfs.rollInterval=0
hdfs-agent.sinks.hdfs-sink.hdfs.rollSize=10240
hdfs-agent.sinks.hdfs-sink.hdfs.rollCount=0
# assemble
hdfs-agent.sources.hdfs-source.channels = hdfs-channel
hdfs-agent.sinks.hdfs-sink.channel = hdfs-channel
通过HDFS管理工具HDFS Explorer,这个工具可以更为容易看到hdfs中的内容,这里可以看到我的文件都是很小的,莫非是我的数据流量本来就不大?