flume与hdfs集成排雷指南

先说一下环境,flume 1.9.0,hadoop 3.2.1,兼容没有问题,官方文档没什么好说的,足够详细,每一项后面都附带有例子,好评。但是在配置sink to hdfs的时候足足踩了不少雷,记录下来希望可以帮到更多的人。


错误最常见的还是java.lang.NoClassDefFoundError异常,出现这个提示100%是因为flume缺少相应的组件包,下面分别说一下缺少的内容,找到对应jar之后复制到{FLUME_HOME}/lib下即可。

org/apache/hadoop/io/SequenceFile$CompressionType

缺少hadoop-common-X.jar,目录在{HADOOP_HOME}/share/hadoop/common

com/ctc/wstx/io/InputBootstrapper

缺少woodstox-core-X.jar,目录在{HADOOP_HOME}/share/hadoop/common/lib

org/codehaus/stax2/XMLInputFactory2

缺少stax2-api-X.jar,目录在{HADOOP_HOME}/share/hadoop/common/lib

com.google.common.base.Preconditions.checkArgument

guava包版本不一致(通常是过低),从这里获取新版本并删除旧版{HADOOP_HOME}/share/hadoop/common/lib

org/apache/commons/configuration2/Configuration

缺少commons-configuration2-X.jar,目录在{HADOOP_HOME}/share/hadoop/common/lib

org/apache/hadoop/util/PlatformName

缺少hadoop-auth-X.jar,目录在{HADOOP_HOME}/share/hadoop/common/lib

org/apache/htrace/core/Tracer

缺少htrace-core4-X-incubating.jar,目录在{HADOOP_HOME}/share/hadoop/common/lib

No FileSystem for scheme: hdfs

缺少hadoop-hdfs-X.jarhadoop-hdfs-client-X.jar,目录在{HADOOP_HOME}/share/hadoop/hdfs

commons-lang3

可能还会出现commons-lang3一类的错误,日志太多已经找不到当时完整的错误提示了,这个只需要把{FLUME_HOME}/liblang-2.5的包删掉换成lang3的就可以,目录在{HADOOP_HOME}/share/hadoop/common/lib


org.apache.hadoop.ipc.RpcException

这个问题与以下两个问题类似:
RPC response exceeds maximum data length
RPC connect refused
检查flume的任务配置文件中hdfs.path是否正确,这里应填写namenode的rpc地址而不是http地址,务必注意hadoop3与hadoop2的端口变化

Operation category READ is not supported in state standby

此错误会出现在HDFS处于HA模式时,当flume任务配置文件中hdfs.path选择了处于standbynamenode时便会报告此错误,解决方法是将path指向处于active状态的namenode

java.net.UnknownHostException: mycluster

如果在flume的任务配置文件中hdfs.path指向的是HDFS集群地址则会出现此错误,将hadoop的core-site.xmlhdfs-site.xml复制到{FLUME_HOME}/conf目录下即可

当sink非logger类型时控制台不输出日志(包括错误日志)

在启动命令后面加上-Dflume.root.logger=INFO,console

source是文本文件但HDFS中保存的是16进制

flume任务配置中加上下面两行:

a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.fileType = DataStream
无法通过web上传/下载HDFS文件

首先要保证配置正确且可以通过命令上传文件,观察通过web下载HDFS文件时的请求url:
在这里插入图片描述
不用多解释了吧,去配host,上传同理。

要实现Flume将Linux文件夹中的JSON文件上传到HDFS上而不改变文件格式,你需要配置Flume的Agent来监控源目录,并将数据流式传输到HDFS sink。以下是一个简单的配置示例: 首先,确保你的系统中已经安装了FlumeHadoop,并且HDFS处于运行状态。 然后,创建一个Flume配置文件`flume-conf.properties`,配置内容大致如下: ``` # 定义agent的名字 agent1.name = Agent1 agent1.sources = Source1 agent1.sinks = Sink1 agent1.channels = Channel1 # 配置source:监控本地文件系统中的文件夹 agent1.sources.Source1.type = exec agent1.sources.Source1.command = tail -F /path/to/json/directory/*.json agent1.sources.Source1.channels = Channel1 # 配置sink:将数据写入HDFS agent1.sinks.Sink1.type = hdfs agent1.sinks.Sink1.hdfs.path = hdfs://namenode/path/to/hdfs/directory agent1.sinks.Sink1.hdfs.fileType = DataStream agent1.sinks.Sink1.hdfs.writeFormat = Text # 配置channel:用于source和sink之间的通信 agent1.channels.Channel1.type = memory agent1.channels.Channel1.capacity = 1000 agent1.channels.Channel1.transactionCapacity = 100 # 将source和sink与channel连接起来 agent1.sources.Source1.channels = Channel1 agent1.sinks.Sink1.channel = Channel1 ``` 在这个配置中,我们定义了一个名为`Agent1`的agent,它包含一个名为`Source1`的source,一个名为`Sink1`的sink和一个名为`Channel1`的channel。Source监控指定的文件夹,并将新创建的`.json`文件传输到channel。Sink则从channel读取数据,并将其以文本格式写入到指定的HDFS路径。 将上面的配置保存为`flume-conf.properties`文件,并确保修改`/path/to/json/directory`和`hdfs://namenode/path/to/hdfs/directory`为实际的源文件夹路径和HDFS目标路径。之后,启动Flume agent: ```shell flume-ng agent --conf /path/to/flume/conf --conf-file /path/to/flume-conf.properties --name Agent1 -Dflume.root.logger=INFO,console ``` 确保替换`/path/to/flume/conf`和`/path/to/flume-conf.properties`为你的实际Flume配置目录和配置文件路径。 请注意,上述配置是一个基本示例,实际情况可能需要根据你的具体需求和环境进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值