flume保存文件到hdfs的时候报错

博客主要讲述了flume配置sink向hdfs中写入文件时启动遇到的报错问题及解决办法。一是因缺少jar包导致的Failed to start agent错误,需将hadoop相关jar包拷贝到flume安装目录的lib下;二是运行时的HDFS IO error,要将hadoop-hdfs对应版本jar包也拷贝到flume的lib下。

一  、flume配置sink向hdfs中写入文件,在启动的时候遇到的报错问题

 

1. Failed to start agent because dependencies were not found in classpath. Error follows.

java.lang.NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$CompressionType

[ERROR - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:145)] Failed to start agent because dependencies were not found in classpath. Error follows.
java.lang.NoClassDefFoundError: org/apache/hadoop/io/SequenceFile$CompressionType
        at org.apache.flume.sink.hdfs.HDFSEventSink.configure(HDFSEventSink.java:239)
        at org.apache.flume.conf.Configurables.configure(Configurables.java:41)
        at org.apache.flume.node.AbstractConfigurationProvider.loadSinks(AbstractConfigurationProvider.java:413)
        at org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:98)
        at org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:140)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.io.SequenceFile$CompressionType
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 12 more

这是因为没有相应的的jar包导致的, 进入到/hadoop/share/hadoop/common/*.jar 和/hadoop/share/hadoop/common/lib/*.jar 拷贝到flume安装目录的lib下就可以。

2.  HDFS IO error

 

java.io.IOException: No FileSystem for scheme: hdfs

[WARN - org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:455)] HDFS IO error
java.io.IOException: No FileSystem for scheme: hdfs
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2385)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2392)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2431)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2413)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
        at org.apache.flume.sink.hdfs.BucketWriter$1.call(BucketWriter.java:243)
        at org.apache.flume.sink.hdfs.BucketWriter$1.call(BucketWriter.java:235)
        at org.apache.flume.sink.hdfs.BucketWriter$9$1.run(BucketWriter.java:679)
        at org.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator.java:50)
        at org.apache.flume.sink.hdfs.BucketWriter$9.call(BucketWriter.java:676)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

运行的时候还是会报找不到hdfs文件的错误,进入到hadoop的安装目录找到/share/hadoop/hdfs/hadoop-hdfs-2.6.0.jar(版本根据自己安装而定) 同样拷贝到flume的安装目录的lib下。再启动就可以了。

### 使用 Apache Flume 将实时数据采集到 HDFS 的配置教程 #### 1. 配置概述 Apache Flume 是一种分布式的、可靠的、高可用的服务,专门设计用于大规模的日志收集和传输。通过 Flume 可以将来自不同源的数据流式地写入目标存储系统,比如 HDFS。 以下是基于引用内容构建的一个完整的 Flume 数据采集到 HDFS 的配置示例[^1]。 --- #### 2. 创建必要的目录结构 为了确保 Flume 能够正常工作并记录状态信息,需预先创建所需的文件夹: - 在 `/usr/local/soft/apache-flume-1.9.0-bin/` 下创建 `log` 文件夹。 - 在该路径下进一步创建 `taildir_position.json` 文件,此文件用来保存读取文件的偏移量位置,防止重启后重复读取已处理过的数据[^3]。 ```bash mkdir -p /usr/local/soft/apache-flume-1.9.0-bin/log/ touch /usr/local/soft/apache-flume-1.9.0-bin/log/taildir_position.json ``` --- #### 3. 编辑 Flume 配置文件 假设我们希望监控某个日志文件的变化并将新增内容发送至 HDFS,则可以按照如下方式编写配置文件 `flume-conf.properties`: ```properties # 定义 agent 名称为 a1 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 配置 source (TailDir Source) a1.sources.r1.type = TAILDIR a1.sources.r1.positionFile = /usr/local/soft/apache-flume-1.9.0-bin/log/taildir_position.json a1.sources.r1.filegroups = f1 a1.sources.r1.filegroups.f1 = /usr/local/data/log/demo.log.* # 配置 channel (Memory Channel) a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 配置 sink (HDFS Sink) a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://namenode:8020/user/flume/logs/%Y%m%d a1.sinks.k1.hdfs.rollInterval = 60 a1.sinks.k1.hdfs.rollSize = 0 a1.sinks.k1.hdfs.rollCount = 0 a1.sinks.k1.hdfs.writeFormat = Text a1.sinks.k1.hdfs.fileType = DataStream # 绑定 source 和 sink 到同一个 channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 ``` 上述配置说明: - **Source**: 使用 TailDir Source 来监听指定路径下的多个日志文件变化,并自动跟踪新产生的文件[^5]。 - **Channel**: Memory Channel 存储临时事件缓冲区,支持快速吞吐但不持久化数据。 - **Sink**: HDFS Sink 把接收到的消息存放到远程 HDFS 中,按日期分区存放以便后续分析。 需要注意的是如果输入数据包含 JSON 格式字符串则应验证其合法性以免引发异常[^4]。 --- #### 4. 启动 Flume Agent 完成以上设置之后即可启动 Flume 并开始执行任务: ```bash bin/flume-ng agent --conf conf/ --name a1 --conf-file flume-conf.properties -Dflume.root.logger=INFO,console ``` 此时任何向 `/usr/local/data/log/demo.log.*` 添加的新行都会被立即捕获并通过管道传送到设定好的 HDFS 地址上。 --- #### 5. 常见问题排查 假如在实际操作过程中遇到诸如 `com.alibaba.fastjson.JSONException: not close json text...` 类型报错时,请核查原始日志是否存在非法字符或未闭合的大括号等问题。必要情况下可增加预处理器来清洗脏数据后再提交给下游组件处理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值