flume1.8.0安装配置
记一次linux上安装配置flume1.8.0过程
1、安装jdk
需要1.6以上版本
参考文章 https://segmentfault.com/a/11...
2、下载flume
从官网下载压缩包:http://flume.apache.org/downl...
选择apache-flume-1.8.0-bin.tar.gz,选择镜像地址开始下载,如:wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz
3、解压并安装
- 解压
tar -zxvf apache-flume-1.8.0-bin.tar.gz
- 安装:
mv apache-flume-1.8.0-bin /opt/flume-1.8.0
(放到想要安装的目录下,目录名保存为flume-1.8.0,如/opt)
4、配置
修改配置文件:
vi /opt/flume-1.8.0/conf/flume.conf
此配置文件,配置了两个source:s1和s2,一个channel,一个sink。s1监听目录/data/log目录,并把信息写入c1,s2监听本机所有ip(0.0.0.0)的80端口,信息也写入c1,k1从c1读取数据,写入flume的日志。
- 配置文件说明:
配置项名称 | 作用 | 举例 |
agent1 | flume节点名称,启动时通过参数命令-name指定 | |
agent1.sources | 监听的源,可以有多个,空格隔开即可,用于收集数据并发送到channel | agent1.sources=s1 s2 |
agent1.channels | 临时通道,可以有多个,空格隔开,存放source收集的数据,sink从这里读取数据 | agent1.channels=c1 |
agent1.sinks | 接收器,可以有多个,空格隔开,从channel读取数据,并发送给目标 (比如kafka 或者hdfs或者另一个flume) | agent1.sinks=k1 |
agent.sources.s1.type | 源的类型,s1是源名称,可以是目录、日志文件、或者监听端口等。 常用的source的类型包括avro、exec、netcat、spooldir和syslog等. 具体请参考官网http://flume.apache.org/Flume... | agent.sources.s1.type=spooldir agent.sources.s2.type=avro |
agent1.sources.s1.channels | 监听数据要写入的channel名称 | agent1.sources.s1.channels=c1 |
agent1.channels.c1.type | 通道的类型,c1为通道名称,此处memory表示为常用的memory-channel, 同时也有其他类型的channel,如JDBC、file-channel、custom-channel等, 具体请参考官网http://flume.apache.org/Flume... | agent1.channels.c1.type=memory |
agent1.sinks.k1.type | 接收器类型,k1为接收器名称,此处logger表示直接写入日志, 常用的包括avro、logger、HDFS、Hbase以及file-roll等, 具体参考官网http://flume.apache.org/Flume... | agent1.sinks.k1.type=logger |
5、启动
/opt/flume-1.8.0/bin/flume-ng agent --conf conf --conf-file conf/flume.conf --name agent1 -Dflume.root.logger=INFO,console
- 启动命令参数说明:
参数 | 作用 | 举例 |
–conf 或 -c | 指定配置文件夹,包含flume-env.sh和log4j的配置文件 | –conf conf |
–conf-file 或 -f | 配置文件地址 | --conf-file conf/flume.conf |
–name 或 -n | agent(flume节点)名称 | --name agent1 |
6、错误说明
- 监听端口被占用:
java.net.BindException:地址已在使用
- 接收协议与client发送数据协议不一致:
设置为avro 时,可能会出现这样的错误。比如:flume接收avro,client发送tcp,可把avro改为netcat
sink读不到数据:
若两个sink读取同一个c1 同一个消息,每次只有一个sink读取成功。 channel 的内容只输出一次,同一个event 如果sink1 输出,sink2 不输出;如果sink1 输出,sink1 不输出。 最终 sink1+sink2=channel 中的数据 ![clipboard.png](/img/bVX0Vf)
错误记录
1、Caused by: java.lang.NullPointerException:Excepted timestamp in the Flume event headers, but it was null...
- 原因:
写入到hdfs时使用到了时间戳来区分目录结构,flume的消息组件event在接受到之后在header中没有发现时间-戳参数,导致该错误发生 解决办法:
有三种解决办法:(重启生效)- 为source添加timestamp拦截器,没调event头中加入时间戳(效率会慢点)agent1.sources.source1.interceptors.t1.type=timestamp
- 为sink使用本地时间戳agent1.sinks.sink1.hdfs.useLocalTimeStamp=true即可(如果客户端与flume集群时间不一致,数据时间会不准确)
- 在想source发送event时,讲时间戳参数添加到event的header中即可,header是一个map,添加时mapkey为timestamp
2、org.apache.hadoop.security.AccessControlException: Permission denied: user=flume, access=WRITE, inode="/flume":hdfs:supergroup:drwxr-xr-xr...
- 原因:
flume用户没有hdfs读写权限,查看hdfs目录发现没有/flume: 解决办法:
- 新建hdfs存储目录,如/flume (需要先su hdfs 否则没有权限)
- 授权:用户权限和读写权限
hadoop fs -chown -R flume:flume /flume
hadoop fs -chmod -R 777 /flume
3、Configuration must specify a spooling derectory
- 原因:
spoolDir=/data/... spoolDir区分大小写