首先创建三台虚拟机,我的是192.168.100.202,192.168.100.203,192.168.100.204
所使用的版本信息
1.确保系统已经安装jdk环境
略
2.搭建zookeeper
配置环境,刷新环境变量source /etc/profile
写入到jdk配置后就行
export ZK_HOME=/usr/zk/zookeeper-3.4.14
export PATH= Z K H O M E / b i n : ZK_HOME/bin: ZKHOME/bin:PATH保存退出,刷新配置
Zookeeper配置
[root@localhost zookeeper-3.4.11]# cd conf 进入zk配置
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg 修改名称为zoo.cfg
[root@localhost conf]# vim zoo.cfg
打开配置,修改
dataDir= dataDir=/usr/local/hadoop/zookeeper-3.4.14/data
最下面配置
server.0=192.168.100.202:2888:3888
server.1=192.168.100.203:2888:3888
server.2=192.168.100.204:2888:3888
解释
server.X=A:B:C
X-代表服务器编号
A-代表ip
B和C-代表端口,这个端口用来系统之间通信
保存退出
下一步配置myid这里需要每个机器中都配置
找到Zookeeper目录,新建data文件夹,并且在data文件夹下面创建一个文件,叫myid,并且在文
件里写入server.X对应的X cd data vim myid
#直接在myid里面写 X 即可
#比如我配置的三个server,myid里面写的X就是所对应的X 如下三台机器分别填写自己对应的server.X server.0=192.168.100.202:2888:3888【192.168.100.202服务器上面的myid填写0】
server.1=192.168.100.203:2888:3888【192.168.100.203服务器上面的myid填写1】
server.2=192.168.100.204:2888:3888【192.168.100.204服务器上面的myid填写2】
保存退出
如192.168.100.204的myid
启动zookeeper
zkServer.sh start 启动
zkServer.sh status 查看状态出现follower或者leder标识成功
3.kafka配置
安装kafka解压到自定义文件下,配置环境变量并配置环境变量同zookeeper
修改server.properties
修改log.dirs日志存储地址
/usr/kafka/kafka_2.12-2.20/data/log,这里如果没有需要创建,可自定义
broker.id=1;//三台分别是 1 2 3
zookeeper.connect=192.168.100.202:2181,192.168.100.203:2181,192.168.100.204:2181/kafka
启动kafka
//启动线程并写入日志
kafka-server-start.sh /usr/local/kafka_2.11-0.9.0.1/config/server.properties > /usr/local/kafka_2.11-0.9.0.1/logs/logs/test.log &test.log自定义文件名称 & 后台运行
三台虚拟机均开启kafka
4.Flume的安装
下载安装包,安装完成之后同样配置环境变量
修改配置文件 cd /usr/flume/conf 使用ll命令查看配置文件夹中的内容。复制配置文件并更改, cp flume-env.sh.template flume-env.sh。 编辑该配置该配置文件 vi flume-env.sh。
更改jdk位置
验证是否安装成功 查看版本信息
我们使用的是Spool Source的方式,对目录进行监控,然后把监控到的信息通过kafka进行传输.
对应的配置文件为
a1.sources = r1 r2
a1.sinks = k1 k2
a1.channels = c1 c2#####source
a1.sources.r1.type = spooldir
a1.sources.r1.channels = c1
a1.sources.r1.spoolDir = /usr/local/hadoop/test
a1.sources.r1.fileHeader = true
#####sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
#设置kafka的主题topic
a1.sinks.k1.topic = kafka_spooldir_test
#设置消费者编码为UTF-8
a1.sinks.k1.custom.encoding=UTF-8
#绑定kafka主机以及端口号
#a1.sinks.k1.kafka.bootstrap.servers = 192.168.100.202:9092,192.168.100.203:9092 a1.sinks.k1.brokerList = 192.168.100.202:9092,192.168.100.203:9092,192.168.100.204:9092
#设置kafka序列化方式
a1.sinks.k1.serializer.class = kafka.serializer.StringEncoder#use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1#####source
a1.sources.r2.type = spooldir
a1.sources.r2.channels = c2
a1.sources.r2.spoolDir = /usr/local/hadoop/mytest
a1.sources.r2.fileHeader = true
#Describe the sink
a1.sinks.k2.type = org.apache.flume.sink.kafka.KafkaSink
#设置kafka的主题topic
a1.sinks.k2.topic = kafka_spooldir_test1
#设置消费者编码为UTF-8
a1.sinks.k2.custom.encoding=UTF-8
#绑定kafka主机以及端口号
#a1.sinks.k1.kafka.bootstrap.servers = 192.168.100.202:9092,192.168.100.203:9092 a1.sinks.k2.brokerList = 192.168.100.202:9092,192.168.100.203:9092,192.168.100.204:9092
#设置kafka序列化方式 a1.sinks.k2.serializer.class = kafka.serializer.StringEncoder
#####channels
a1.channels.c2.type = memory
a1.channels.c2.capacity = 1000
a1.channels.c2.transactionCapacity = 100#Bind the source and sink to the channel
a1.sources.r2.channels = c2
a1.sinks.k2.channel = c2
使用命令,启动flume agent
flume-ng agent -n a1 -c …/conf/ -f kafka_spool.conf -Dflume.root.logger=INFO,console
打开kafka的消费者对kafka_spooldir_test 和kafka_spooldir_test1这两个topic进行消费,即可以对响应目录下的文件内容进行监听,一个文件的一行内容会发出kafka的消息,flume默认一条消息的大小是2k,当我们所需的一条消息大小大于2k时,flume将分作两条进行发送,这样不利于消息的解析.找到flume源码包org\apache\flume\serialization类
因此,接下来就可以修改源码,将上面代码中的2048,改成更大的值,更改完成之后,可以用maven编译然后替换flume/lib里面的flume-ng-core包