1.技术选用
用到的技术有:flume, kafka, spark.
这里面其实存在生产者,消费者的关系。如下图:
用户在一个网站中产生的行为就是生产者, 被服务器采集到,服务器是一个消费者,
服务器保存的数据再被flume消费,这时服务器既是生产者又是消息者,
组件间就是这样的生产者消费者关系链。
2.技术搭建
flume的搭建
a. 官网下载 apache-flume-1.6.0-bin.tar.gz
b. 解压tar -zxvf apache-flume-1.6.0-bin.tar.gz, 放到/usr/soft/目录下
c. 进入conf目录下, cd /usr/soft/flume/conf
d. 复制flume-conf.properties.template成flume-conf.properties
e. 修改 flume-env.sh 配置文件,主要是JAVA_HOME变量设置
cp flume-env.sh.template flume-env.sh
vi flume-env.sh
export JAVA_HOME=/usr/soft/jdk1.8.0_73
f. 验证是否安装成功
进入bin目录运行命令:/usr/soft/flume/bin$ ./flume-ng version
有下面显示时说明安装成功
Flume 1.6.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
...
g. 按照例子测试flume
1.创建配置文件
cd /usr/soft/flume/conf
cp flume-conf.properties avro.conf
vi avro.conf
agent1.sources = avro-source1
agent1.channels = ch1
agent1.sinks = logger-sink1
# sources
agent1.sources.avro-source1.type = avro
agent1.sources.avro-source1.channels = ch1
agent1.sources.avro-source1.bind = s1
agent1.sources.avro-source1.port = 4141
# sink
agent1.sinks.logger-sink1.type = logger
agent1.sinks.logger-sink1.channel = ch1
# channel
agent1.channels.ch1.type = memory
agent1.channels.ch1.capacity = 1000
agent1.channels.ch1.transactionCapacity = 100
2. 启动flume agent
把flume配置到环境变量中
sudo vi /etc/environment
FLUME_HOME=/usr/soft/flume
PATH="/usr/soft/flume/bin:/usr/soft/spark/bin:$SCALA_HOME/bin"
使环境变量生效 source /etc/environment
进入/usr/soft/flume目录下
启动flume agent
hlf@s1:/usr/soft/flume$ bin/flume-ng agent -c conf -f conf/avro.conf -n agent -Dflume.root.logger=INFO,console
用jps查看是否启动了,如果启动了会显示一个名字叫 Application的进程
创建一个文件,我放在flume文件夹下,名字 hello_flume.log
内容是 hello flume spar
3.使用avro-client发送文件
hlf@s1:/usr/soft/flume$bin/flume-ng avro-client -c ./conf -H s1 -p 4141 -F hello_flume.log
3.flume配置参数
命令
参数 描述
help 打印帮助信息
agent 运行一个Flume Agent
avro-client 运行一个Avro Flume 客户端
version 显示Flume版本。
全局选项
参数 描述
--conf,-c <conf> 在<conf>目录使用配置文件。指定配置文件放在什么目录
--classpath,-C <cp> 追加一个classpath
--dryrun,-d 不真正运行Agent,而只是打印命令一些信息。
--plugins-path <dirs> 插件目录列表。默认:$FLUME_HOME/plugins.d
-Dproperty=value 设置一个JAVA系统属性值。
-Xproperty=value 设置一个JAVA -X的选项。
Agent选项
参数 描述
--conf-file,-f <file> 指定配置文件,这个配置文件必须在全局选项的--conf参数定义的目录下。(必填)
--name,-n <name> Agent的名称(必填)
--help,-h 帮助
Avro客户端选项
参数 描述
--rpcProps,-P <file> 连接参数的配置文件。
--host,-H <host> Event所要发送到的Hostname。
--port,-p <port> Avro Source的端口。
--dirname <dir> Avro Source流到达的目录。
--filename,-F <file> Avro Source流到达的文件名。
--headerFile,-R <file> 设置一个JAVA -X的选项。
启动Avro客户端要么指定--rpcProps,要么指定--host和--port。
4.遇到的问题
无法连接
当时avro是这样启动的
hlf@s1:/usr/soft/flume$ *bin/flume-ng avro-client -c . -H s1 -p 4141 -F hello_flume.log*
结果出现这问题
ERROR avro.AvroCLIClient: Unable to open connection to Flume. Exception follows.
org.apache.flume.FlumeException: NettyAvroRpcClient { host: s1, port: 4141 }:
RPC connection errorat org.apache.flume.api.NettyAvroRpcClient.connect(NettyAvroRpcClient.java:182)
at org.apache.flume.api.NettyAvroRpcClient.connect(NettyAvroRpcClient.java:121)
连接不上,一直以为是IP和端口的问题,先用ps -aux | grep 4141 发现端口没问题
之后修改conf目录下的avro.conf配置文件中的a1.sources.r1.bind = 0.0.0.0,
发现改成localhost, s1(这是我的hostname), IP地址:192.168.142.130都没有用。
修改了一下使用目录, 之前认为-c指的是要发送的文件的目录, 改成conf目录,发现结果不一样了,
这目录下要有flume-env.sh 和 log4j.properties 。
hlf@s1:/usr/soft/flume$ *bin/flume-ng avro-client -c ./conf -H s1 -p 4141 -F hello_flume.log*
再次发现问题:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/soft/flume/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/soft/hive/lib/hive-jdbc-1.0.1-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
查看好久, 其实并没有什么问题,原来不应该看这个窗口, 要看启动agent的那个窗口,纠结了好久 -_-!
在那窗口找到发送文件的内容
2016-09-24 00:44:00,880 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)]
Event: { headers:{} body: 68 65 6C 6C 6F 20 66 6C 75 6D 65 20 73 70 61 72 hello flume spar }
就是hello flume spar