【Flume】Flume实践之采集文件内容上传至HDFS

18 篇文章 0 订阅
6 篇文章 0 订阅

1. 需求

       使用Flume从文件夹中采集数据并上传到HDFS中。要完成这个任务就需要使用在采集数据时使用Spooling Directory Source组件;传输数据时为了保证数据没有丢失风险,使用File Channel组件;输出数据时使用HDFS Sink。

2. 配置

       Flume各个组件的参数很多,因此通常复制官网的各组件样例程序并参照参数表进行修改。

2.1 Source

       Source组件使用Spooling Directory Source,本次实践需要指定两个参数,分别是:

  • type参数指定组件类型;
  • spoolDir参数指定要采集数据的源文件夹。

       根据需求编写的Source配置如下:

a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /data/log/studentDir

2.2 Channel

       Channel组件使用File Channel,本次实践需要指定三个参数,分别是:

  • type参数指定组件类型;
  • checkpointDir参数指定存放检查点文件的目录;
  • dataDirs 表示存放数据的目录。

       根据需求编写的Channel配置如下:

a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /data/soft/apache-flume-1.9.0-bin/data/studentDir/checkpoint
a1.channels.c1.dataDirs = /data/soft/apache-flume-1.9.0-bin/data/studentDir/data

2.3 Sink

       Sink组件使用HDFS Sink,本次实践需要指定八个参数,分别是:

  • type参数指定组件类型;
  • path参数指定最终数据要上传到的HDFS目录地址;
  • filePrefix参数指定存放数据的文件前缀;
  • fileType参数指定存放文件的类型,共有三种:SequenceFile、DataStream和CompressedStream,其中SequenceFile在Hadoop的MapReduce任务解决小文件问题时使用过;
  • writeFormat参数指定写文件的格式,有两种:Text和Writable(默认),如果后期想使用Hive或者Impala操作这份数据的话,必须在生成数据之前设置为Text,Text表示是普通文本数据;
  • rollInterval参数指定Sink间隔多长将临时文件滚动成最终目标文件,以秒为单位,默认值为30s。如果设置成0,则表示不根据时间来滚动文件(滚动roll指的是,Sink将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据);
  • rollSize参数指定当临时文件达到多大时(单位:bytes),滚动成目标文件,默认值为1024。如果设置成0,则表示不根据临时文件大小来滚动文件;
  • rollCount参数指定当events数据达到该数量时候,将临时文件滚动成目标文件,默认值为10。如果设置成0,则表示不根据events数据来滚动文件。

       根据需求编写的Sink配置如下:

a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://bigData01:9000/flume/studentDir
a1.sinks.k1.hdfs.filePrefix = stu-
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.rollInterval = 3600
a1.sinks.k1.hdfs.rollSize = 134217728
a1.sinks.k1.hdfs.rollCount = 0

2.4 完整的配置代码

       将上述三个组件的配置完成后,再将其连接起来(设置Source后接的Channel和Sink前接的Channel),完整代码如下:

# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Describe/configure the source
a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /data/log/studentDir

# Describe the sink
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /data/soft/apache-flume-1.9.0-bin/data/studentDir/checkpoint
a1.channels.c1.dataDirs = /data/soft/apache-flume-1.9.0-bin/data/studentDir/data

# Use a channel
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://bigData01:9000/flume/studentDir
a1.sinks.k1.hdfs.filePrefix = stu-
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.rollInterval = 3600
a1.sinks.k1.hdfs.rollSize = 134217728
a1.sinks.k1.hdfs.rollCount = 0


# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

3. 实践

       在运行Flume之前应该先检查建立采集数据的文件夹和文件,且系统此时直接启动会报错提示找不到SequenceFile,虽然我们已经把fileType改为了DataStream,但是Flume默认还是会加载这个类。这个问题的解决思路有两种:

  • 第一种解决思路:把SequenceFile相关的jar包都拷贝到Flume的lib目录下。但后续还会报错缺少HDFS相关的jar包,再拷贝对应的jar包即可。
  • 第二种解决思路:把这个节点设置为Hadoop集群的一个客户端节点,即在这个节点上配置Hadoop的框架。

       解决了这个问题后,在a1.sinks.k1.hdfs.path路径的机器上开启Hadoop服务框架,即可启动Flume服务采集信息并上传,运行过程如下:

  • 运行Flume
bin/flume-ng agent --name a1 --conf conf --conf-file conf/file2hdfs.conf -Dflume.root.logger=INFO,console
  • 检查HDFS的上传结果
    可以看到文件后有一个.tmp的后缀,是因为当前该文件并未达到配置中设置的滚动的要求,后续的数据依旧要写入到该文件。若要去掉这个后缀那根据配置需要等待1h或者等文件达到128M,除去配置的条件外,我们也可以强制关闭这个Agent来达到目的。但需要注意一点,当我们再重启Agent后,并不会给这个文件再给加上.tmp后缀,每次停止之前都会把所有的文件解除占用状态,下次启动的时候如果有新数据,则会产生新的文件,这其实仅仅模拟了自动切文件的效果。
[root@bigData01 soft]# hdfs dfs -ls /flume/studentDir
Found 1 items
-rw-r--r--   1 root supergroup         65 2023-02-03 06:23 /flume/studentDir/stu-.1675376620835.tmp
[root@bigData01 soft]# hdfs dfs -cat /flume/studentDir/*
jack    18      male
jessic  20      female
tom     17      male
  • 检查数据源文件
    为了防止重复读取同一个文件,Flume会在读取过的文件加上COMPLETED后缀,再不关闭Flume的前提下再加入一个class2.dat文件,会发现该文件立即读取并写入HDFS文件中。
[root@bigData02 studentDir]# ll
total 4
-rw-r--r--. 1 root root 65 Feb  3 05:31 class1.dat.COMPLETED
[root@bigData02 studentDir]# vi class2.dat
[root@bigData02 studentDir]# ll
total 8
-rw-r--r--. 1 root root 65 Feb  3 05:31 class1.dat.COMPLETED
-rw-r--r--. 1 root root 15 Feb  3 06:26 class2.dat.COMPLETED
-------------------------------------------------------------------
[root@bigData01 soft]# hdfs dfs -cat /flume/studentDir/*
jack    18      male
jessic  20      female
tom     17      male
Chaoql	23	male
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用Flume采集HDFS上的文件,你需要使用Flume的Spooling Directory Source。这个source会监视一个指定目录中的文件,当有新的文件到达时,会将文件内容读取到Flume的Event中,然后将这些Event发送到指定的Channel中。 以下是一个简单的Flume配置文件示例,用于采集HDFS上的文件: ``` # 定义一个agent agent.sources = spoolDir agent.channels = memoryChannel agent.sinks = hdfsSink # 配置spoolDir source agent.sources.spoolDir.type = spooldir agent.sources.spoolDir.spoolDir = /path/to/hdfs/directory agent.sources.spoolDir.fileHeader = true agent.sources.spoolDir.basenameHeader = true agent.sources.spoolDir.batchSize = 1000 agent.sources.spoolDir.batchTimeout = 1000 # 配置memoryChannel channel agent.channels.memoryChannel.type = memory agent.channels.memoryChannel.capacity = 10000 agent.channels.memoryChannel.transactionCapacity = 1000 # 配置hdfsSink sink agent.sinks.hdfsSink.type = hdfs agent.sinks.hdfsSink.hdfs.path = hdfs://namenode:8020/path/to/hdfs/directory agent.sinks.hdfsSink.hdfs.filePrefix = %{basename} agent.sinks.hdfsSink.hdfs.useLocalTimeStamp = true agent.sinks.hdfsSink.hdfs.fileType = DataStream agent.sinks.hdfsSink.hdfs.writeFormat = Text agent.sinks.hdfsSink.hdfs.rollInterval = 3600 agent.sinks.hdfsSink.hdfs.rollSize = 0 agent.sinks.hdfsSink.hdfs.rollCount = 0 # 配置source和sink之间的channel agent.sources.spoolDir.channels = memoryChannel agent.sinks.hdfsSink.channel = memoryChannel ``` 在这个示例中,我们使用Spooling Directory Source来监视HDFS上的一个目录。当有新的文件到达时,Flume会将文件内容读取到Event中,并将这些Event发送到Memory Channel中。然后,HDFS Sink会从Memory Channel中读取Event,并将其写入HDFS文件中。 注意,这个示例中的配置文件只是一个简单的示例。你需要根据实际情况对其进行修改,以适应你的具体需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaoql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值