近期做实时的处理一部分数据,数据在mysql中,但实现方案为kafka+jstorm的方式处理,因此需要把mysql的数据先加载到kafka,同时需要把这份数据备份到hdfs中,因此就想到采用flume的方式,一个数据来源实现数据的多分分发;因此自己也花点时间把这个配置分享出来
flume简要描述:http://www.cnblogs.com/zhangyinhua/p/7803486.html
具体实现方式如下:
一,下载flume-ng-sql-source-1.4.1.jar,放入flume的lib目录下
链接:https://pan.baidu.com/s/1krRxL3vi1PcTqVN_pF3Pug 密码:fkod
二,将mysql驱动jar包放入flume的lib目录下(mysql5.5)
链接:https://pan.baidu.com/s/1sZv2b70mbBqcr4mrBLAbTQ 密码:cbxj
三,flume配置文件
a1.channels = ch-1 ch-2
a1.sources = src-1
a1.sinks = KAFKA HDFS
###########sql source#################
# For each one of the sources, the type is defined
a1.sources.src-1.type = org.keedio.flume.source.SQLSource
a1.sources.src-1.hibernate.connection.url = jdbc:mysql://10.1.40.104:3306/ibrain
# Hibernate Database connection properties
a1.sources.src-1.hibernate.connection.user = root
a1.sources.src-1.hibernate.connection.password = root
#这个参数很重要,默认false,如果设为false就不会自动查询
a1.sources.src-1.hibernate.connection.autocommit = true
#声明mysql的hibernate方言
a1.sources.src-1.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
#声明mysql驱动
a1.sources.src-1.hibernate.connection.driver_class = com.mysql.jdbc.Driver
#查询间隔,单位毫秒
a1.sources.src-1.run.query.delay=5000
a1.sources.src-1.hibernate.columns.to.select = *
#表里面的某个字段,用来判断增量
a1.sources.src-1.hibernate.incremental.column.name =submit_time
#声明保存flume状态的文件夹位置
a1.sources.src-1.status.file.path = /opt/
a1.sources.src-1.status.file.name = syncDataToHdfsAndKafka.status
#声明从第一条数据开始查询
a1.sources.src-1.start.from = 2012-07-28 00:00:0.0000000
#sql语句自定义,但是要注意:增量只能针对查询字段的第一个字段,如下面的SUBMIT_TIME,经测试系统默认如此.
#$@$表示增量列上一次查询的值,记录在status文件中
#查询sql不能加";",不然会报错
a1.sources.src-1.custom.query = select SUBMIT_TIME,ID,ENTRANCE_GUARD_ID,ENTRANCE_GUARD_TYPE,ENTRANCE_GUARD_STATUS,ID_CARD,NAME,EXAM_SITE_ID,FACE_IDENTIFY_RESULT,FACE_IDENTIFY_MESSAGE,FACE_BASE64,ENTRY_TYPE from T_ZCKJ_MJ_MJSJ where SUBMIT_TIME > to_timestamp('$@$','yyyy-mm-dd hh24:mi:ss.ff6')
#设置分批参数
a1.sources.src-1.batch.size = 1000
a1.sources.src-1.max.rows = 1000
#设置c3p0连接池参数
a1.sources.src-1.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
a1.sources.src-1.hibernate.c3p0.min_size=1
a1.sources.src-1.hibernate.c3p0.max_size=10
######数据通道定义##########
#数据量不大,直接放内存。其实还可以放在JDBC,kafka或者磁盘文件等
a1.channels.ch-1.type = memory
# 通道队列的最大长度
a1.channels.ch-1.capacity = 1000
# putList和takeList队列的最大长度,sink从capacity中抓取batchsize个event,放到这个队列。所以此参数最好比capacity小,比sink的batchsize大。 # 官方定义:The maximum number of events the channel will take from a source or give to a sink per transaction.
a1.channels.ch-1.transactionCapacity = 1000
a1.channels.ch-1.byteCapacityBufferPercentage = 20
#默认值的默认值等于JVM可用的最大内存的80%,可以不配置
a1.channels.ch-1.byteCapacity = 68435456
a1.channels.ch-1.keep-alive = 60
a1.channels.ch-1.capacity = 1000000
a1.channels.ch-2.type = memory
a1.channels.ch-2.capacity = 1000
a1.channels.ch-2.transactionCapacity = 1000
a1.channels.ch-2.byteCapacityBufferPercentage = 20
a1.channels.ch-2.byteCapacity = 68435456
a1.channels.ch-2.keep-alive = 60
a1.channels.ch-2.capacity = 1000000
#####配置hdfs sink 数据持久化备份###############
a1.sinks.HDFS.type = hdfs
#/**存放数据的hdfs目录*/
a1.sinks.HDFS.hdfs.path = hdfs://cdh2:8020/flume/oracle/topic/test_%Y%m%d
#文件前缀。默认值FlumeData
a1.sinks.HDFS.hdfs.filePrefix=prefix_%Y%m%d
#文件后缀
a1.sinks.HDFS.hdfs.fileSuffix=prefix_%Y%m%d
#文件格式, 有3种格式可选择:SequenceFile, DataStream or CompressedStream
a1.sinks.HDFS.hdfs.fileType = DataStream
a1.sinks.HDFS.hdfs.writeFormat = Text
#设置文件存储数据多大的时候生成下一个文件,建议设置成128M和块大小相同;默认值1024,单位是字节。设置为0的话表示不基于文件大小
a1.sinks.HDFS.hdfs.rollSize = 268435456
#设置滚动时间,每隔多少时间生成一个文件.如果设置成0,则禁止滚动,可以使所有数据被写到一个文件中.单位是s;单位是秒,默认30秒。
a1.sinks.HDFS.hdfs.rollInterval = 3600
#设置文件多少行时,滚动生成下一个文件,设置成0时禁止滚动
a1.sinks.HDFS.hdfs.rollCount = 0
######配置kafka sink ##############################
a1.sinks.KAFKA.type = org.apache.flume.sink.kafka.KafkaSink
#kafka话题名称
a1.sinks.KAFKA.kafka.topic = topic_mengjin_result
#kafka的地址配置
a1.sinks.KAFKA.kafka.bootstrap.servers = 10.1.80.4:9092,10.1.80.7:9092,10.1.80.8:9092
#设置序列化方式
a1.sinks.KAFKA.serializer.class=kafka.serializer.StringEncoder
a1.sinks.KAFKA.kafka.producer.acks = 1
a1.sinks.KAFKA.flumeBatchSize = 20
######绑定sources sinks###########
a1.sources.src-1.channels=ch-1 ch-2
a1.sinks.HDFS.channel = ch-1
a1.sinks.KAFKA.channel = ch-2
四 启动程序
bin/flume-ng agent \
-c conf \
-n a1 \
-f /opt/flume.conf \
-Dflume.root.logger=DEBUG,console
注:由于我上述的配置文件放在的目录为:/opt/flume.conf