使用Flume将日志导入OSS

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介:

前言

Apache Flume是一个高可用、高可靠的分布式日志采集、聚合与传输的系统。它基于流式的数据传输,架构简单、灵活。它简单可扩展的模型,也适合在线的数据分析。

image
上图是它的简单数据流模型。Flume的数据流由Event贯穿始终,这个Event由外部的Source生成(如Web Server),携带日志数据并带有一些额外的信息。Source捕获到Event后会进行格式化,然后会推送到一个或者多个Channel中。可以认为Channel是一个Event的缓冲区,它将负责保存Event直到Sink处理完该事件。

Flume的核心运行组件是Agent,一个Agent是一个JVM,是一个完整的数据收集工具。Flume的Agent由三部分组成:Source、Channel和Sink。其中,Flume目前支持了很多种类型的Sink: HDFS Sink、HBase Sink、Thrift Sink、Avro Sink、Elastic Search Sink等。本文主要介绍如何使用HDFS Sink使Flume能够将数据导入到OSS。

配置

配置主要分三块:Java、Hadoop、Flume。配置Java比较简单,设置好JAVA_HOME即可。

Hadoop

首先需要下载Hadoop(以3.0.1版本为例)。Hadoop从2.9.1与3.0.0开始支持OSS,作为默认支持的文件系统。Hadoop的配置可以参考这篇文章。主要是修改$HADOOP_HOME/ etc/hadoop/core-site.xml配置文件,并且配好fs.oss.endpoint、fs.oss.accessKeyId、fs.oss.accessKeySecret和fs.oss.impl。

Flume

下载Apache Flume 1.8.0,并且修改conf目录下的文件

mv conf/flume-conf.properties.template cpnf/flume-conf.properties
mv conf/flume-env.sh.template conf/flume-env.sh

修改conf/flume-env.sh文件,添加JAVA_HOME与FLUME_CLASSPATH,其中,需要将HADOOP的lib与conf目录放入到FLUME_CLASSPATH里面。示例如下

export JAVA_HOME=/usr/lib/jdk1.8.0_152
export FLUME_CLASSPATH=$HADOOP_HOME/etc/hadoop:$HADOOP_HOME/share/hadoop/common:$HADOOP_HOME/share/hadoop/hdfs:$HADOOP_HOME/share/hadoop/tools/lib/*

新增conf/hdfs.properties,在这个里面配置Source、Channel与Sink。假设我们想监控某个目录下新产生的文件,并把新产生的文件写到OSS里面去,我们可以这样配置:

LogAgent.sources = apache
LogAgent.channels = fileChannel
LogAgent.sinks = HDFS

#sources config
LogAgent.sources.apache.type = spooldir
LogAgent.sources.apache.spoolDir = /tmp/logs
LogAgent.sources.apache.channels = fileChannel
LogAgent.sources.apache.basenameHeader = true
LogAgent.sources.apache.basenameHeaderKey = fileName

#sinks config
LogAgent.sinks.HDFS.channel = fileChannel
LogAgent.sinks.HDFS.type = hdfs
LogAgent.sinks.HDFS.hdfs.path = oss://{Your Bucket Name}/logs/%Y%m%d
LogAgent.sinks.HDFS.hdfs.fileType = DataStream
LogAgent.sinks.HDFS.hdfs.writeFormat = TEXT
LogAgent.sinks.HDFS.hdfs.filePrefix = %{fileName}.%H:%M:%S
LogAgent.sinks.HDFS.hdfs.fileSuffix = .log
LogAgent.sinks.HDFS.hdfs.batchSize = 1000
LogAgent.sinks.HDFS.hdfs.rollSize = 0
LogAgent.sinks.HDFS.hdfs.rollCount = 0
LogAgent.sinks.HDFS.hdfs.rollInterval = 30
LogAgent.sinks.HDFS.hdfs.useLocalTimeStamp = true

#channels config
LogAgent.channels.fileChannel.type = memory
LogAgent.channels.fileChannel.capacity = 1000000
LogAgent.channels.fileChannel.transactionCapacity = 10000

注意修改 LogAgent.sinks.HDFS.hdfs.path配置项为用户自己在OSS上路径。

启动Agent

bin/flume-ng agent --conf-file  conf/hdfs.properties -c conf/ --name LogAgent -Dflume.root.logger=console

这个时候会发现抛出异常:

Exception in thread "SinkRunner-PollingRunner-DefaultSinkProcessor" java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
    at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:244)
    at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:85)
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:209)
    at org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystemStore.initialize(AliyunOSSFileSystemStore.java:150)
    at org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem.initialize(AliyunOSSFileSystem.java:318)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3288)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:123)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3337)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3305)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:476)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361)
    at org.apache.flume.sink.hdfs.BucketWriter$1.call(BucketWriter.java:260)
    at org.apache.flume.sink.hdfs.BucketWriter$1.call(BucketWriter.java:252)
    at org.apache.flume.sink.hdfs.BucketWriter$9$1.run(BucketWriter.java:701)
    at org.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator.java:50)
    at org.apache.flume.sink.hdfs.BucketWriter$9.call(BucketWriter.java:698)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

这个异常是由于Apache Flume使用的http client版本比较低的缘故,把flume lib目录下的httpclient-4.2.1.jar和httpcore-4.4.1.jar删除,重新启动即可。

然后我们往刚才配置的LogAgent.sources.apache.spoolDir里面放文件,使用如下命令

for((i=0;i<=5;i++)); do echo "Hello, world" >> /tmp/logs/sample.data.$i; sleep 30s; done

Flume会每隔30秒钟检查这个目录,最终的效果如下:
image

参考资料

  1. http://flume.apache.org/FlumeUserGuide.html
  2. https://yq.aliyun.com/articles/292792?spm=a2c4e.11155435.0.0.7ccba82fbDwfhK
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
4月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
96 0
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
53 2
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
56 1
|
3月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
183 9
|
4月前
|
存储 分布式计算 大数据
【Flume的大数据之旅】探索Flume如何成为大数据分析的得力助手,从日志收集到实时处理一网打尽!
【8月更文挑战第24天】Apache Flume是一款高效可靠的数据收集系统,专为Hadoop环境设计。它能在数据产生端与分析/存储端间搭建桥梁,适用于日志收集、数据集成、实时处理及数据备份等多种场景。通过监控不同来源的日志文件并将数据标准化后传输至Hadoop等平台,Flume支持了性能监控、数据分析等多种需求。此外,它还能与Apache Storm或Flink等实时处理框架集成,实现数据的即时分析。下面展示了一个简单的Flume配置示例,说明如何将日志数据导入HDFS进行存储。总之,Flume凭借其灵活性和强大的集成能力,在大数据处理流程中占据了重要地位。
111 3
|
7月前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56608 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
|
7月前
|
存储 运维 监控
运维编排最佳实践:将运维编排任务执行记录投递到OSS/SLS
运维编排服务(Operation Orchestration Service),简称OOS,是全面、免费的云上自动化运维平台,提供运维任务的管理和执行。典型使用场景包括:事件驱动运维,批量操作运维,定时运维任务,跨地域运维等,OOS为重要运维场景提供审批,通知等功能。OOS帮您实现标准化运维任务,从...
运维编排最佳实践:将运维编排任务执行记录投递到OSS/SLS
|
7月前
|
存储 分布式计算 监控
操作审计最佳实践:将阿里云操作日志持续投递到您的 SLS/OSS
操作审计(ActionTrail)帮助您监控并记录阿里云账号的活动,包括通过阿里云控制台、OpenAPI、开发者工具对云上产品和服务的访问和使用行为,记录为操作日志。 操作审计支持所有阿里云账号的免开通服务,默认为所有账号记录并存储近 90 天的日志。但在实际应用中,受法律法规和企业审计标准的要求,...
510 0
|
7月前
|
存储 运维 监控
通过 SLS 实现日志大数据入湖 OSS
数据湖技术在日志生态中扮演不可或缺的角色,而打通日志从生产端到数据湖的链路却比较复杂。本文将介绍基于 SLS 方案为日志入湖提供端到端(End-to-End)支持,帮助用户提升接入效率,并在费用、运维上有效降低成本。
291 1
通过 SLS 实现日志大数据入湖 OSS
|
7月前
|
监控 关系型数据库 MySQL
通过日志服务实现数据库MySQL入湖OSS实践
本文为您介绍如何使用日志服务来实现MySQL数据库入湖OSS。
278 0
通过日志服务实现数据库MySQL入湖OSS实践