Flume---大数据协作框架

flume是什么

Apache Flume是一个分布式的、可靠的、易用的系统,可以有效地将来自很多不同源系统的大量日志数据收集、汇总或者转移到一个数据中心存储。

Apache Flume的作用不仅限于日志汇总,因为数据源是可以自定义的,Flume也可以被用于传输大量的事件数据,包括但不限于网络流量数据、社交媒体产生的数据、电子邮件和几乎所有可能的数据源。

安装flume

  
  
  
  1. tar -zxvf flume-ng-1.5.0-cdh5.3.6.tar.gz -C /opt/cdh-5.3.6

  2. vi flume-env.sh

  3. export JAVA_HOME=/opt/modules/jdk1.7.0_67

架构图

<img src="https://github.com/lilang-jianxin/images/blob/master/flume/flume%E6%9E%B6%E6%9E%84%E5%9B%BE.PNG?raw=true" alt="!image" />

flume特点

flume的数据流由事件(Event)贯穿始终。事件是Flume的基本数据单位,它携带日志数据(字节数组形式)并且携带有头信息,这些Event由Agent外部的Source生成,当Source捕获事件后会进行特定的格式化,然后Source会把事件推入(单个或多个)Channel中。可以把Channel看作是一个缓冲区,它将保存事件直到Sink处理完该事件。Sink负责持久化日志或者把事件推向另一个Source。

flume可靠性

当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Besteffort(数据发送到接收方后,不会进行确认)。

flume的一些核心概念

Agent使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。

Client生产数据,运行在一个独立的线程。

Source从Client收集数据,传递给Channel。

Sink从Channel收集数据,运行在一个独立线程。

Channel连接 sources 和 sinks ,这个有点像一个队列。

Events可以是日志记录、 avro 对象等。

Flume提供了大量内置的Source、Channel和Sink类型。不同类型的Source,Channel和Sink可以自由组合。组合方式基于用户设置的配置文件,非常灵活。比如:Channel可以把事件暂存在内存里,也可以持久化到本地硬盘上。Sink可以把日志写入HDFS, HBase,甚至是另外一个Source等等

flume的使用

  • 设置代理
    Flume代理配置存储在本地配置文件中。这是一个遵循Java属性文件格式的文本文件。一个或多个代理的配置可以在同一个配置文件中指定。配置文件包括代理中每个源,宿和通道的属性以及它们如何连接在一起以形成数据流。

  • 小例子

  
  
  
  1. example.conf:单节点Flume配置

  2. #将该代理商的组件命名为

  3. a1.sources  =  r1

  4. a1.sinks  =  k1

  5. a1.channels  =  c1

  6. #描述/配置源

  7. a1.sources.r1.type  =  netcat

  8. a1.sources.r1.bind  =  hadoop.jianxin.com

  9. a1.sources.r1.port  =  44444

  10. #描述sink

  11. a1.sinks.k1.type  =  logger

  12. #使用缓冲内存中事件的通道

  13. a1.channels.c1.type  =  memory

  14. a1.channels.c1.capacity  =  1000

  15. a1.channels.c1.transactionCapacity  =  100

  16. #将信源和信宿绑定到信道

  17. a1.sources.r1.channels  =  c1

  18. a1.sinks.k1.channel  =  c1

启动方式

  
  
  
  1. bin / flume-ng agent --conf conf --conf -file example.conf --name a1 -Dflume.root.logger = INFOconsole

常用的source

  • NetCat source:用来监听一个指定端口,并将接收到的数据的每一行转换为一个事件。

  • avro source:avro可以监听和收集指定端口的日志,使用avro的source需要说明被监听的主机ip和端口号

  
  
  
  1. #将该代理商的组件命名为

  2. a1.sources  =  r1

  3. a1.sinks  =  k1

  4. a1.channels  =  c1

  5. #描述/配置源

  6. a1.sources.r1.type  =  avro

  7. a1.sources.r1.bind  =  hadoop.jianxin.com

  8. a1.sources.r1.port  =  3306

  9. #描述sink

  10. a1.sinks.k1.type  =  logger

  11. #使用缓冲内存中事件的通道

  12. a1.channels.c1.type  =  memory

  13. a1.channels.c1.capacity  =  100

  14. a1.channels.c1.transactionCapacity  =  10

  15. #将信源和信宿绑定到信道

  16. a1.sources.r1.channels  =  c1

  17. a1.sinks.k1.channel  =  c1

  • exec source:可以通过指定的操作对日志进行读取,使用exec时需要指定shell命令,对日志进行读取


  • Spooling-directory source:可以读取文件夹里的日志,使用时指定一个文件夹,可以读取该文件夹中的所有文件,当出现新文件时会读取该文件并获取数据.需要注意的是该文件夹中的文件在读取过程中不能修改,同时文件名也不能修改。


  1. spoolDirectory是监控目录,不能为空,没有默认值。这个source不具有监控子目录的功能,也就是不能递归监控。如果需要,这需要自己去实现,http://blog.csdn.net/yangbutao/article/details/8835563 这里有递归检测的实现;


  2. completedSuffix是文件读取完毕后给完成文件添加的标记后缀,默认是".COMPLETED";


  3. deletePolicy这是是否删除读取完毕的文件,默认是"never",就是不删除,目前只支持"never"和“IMMEDIATE”;


  4. fileHeader是否在event的Header中添加文件名,boolean类型, 默认false


  5. fileHeaderKey这是event的Header中的key,value是文件名


  6. batchSize这个是一次处理的记录数,默认是100;


  7. inputCharset编码方式,默认是"UTF-8";


  8. ignorePattern忽略符合条件的文件名


  9. trackerDirPath被处理文件元数据的存储目录,默认".flumespool"


  10. deserializerType将文件中的数据序列化成event的方式,默认是“LINE”---org.apache.flume.serialization.LineDeserializer


  11. deserializerContext这个主要用在Deserializer中设置编码方式outputCharset和文件每行最大长度maxLineLength。


常见的channel

  • memory channel:内存

  
  
  
  1. a1.channels = c1

  2. a1.channels.c1.type = memory

  3. a1.channels.c1.capacity = 10000

  4. a1.channels.c1.transactionCapacity = 10000

  5. a1.channels.c1.byteCapacityBufferPercentage = 20

  6. a1.channels.c1.byteCapacity = 800000

  • Kafka Channel

  
  
  
  1. a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel

  2. a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092

  3. a1.channels.channel1.kafka.topic = channel1

  4. a1.channels.channel1.kafka.consumer.group.id = flume-consumer

  • File Channel

常见的sink

  • logger sink:将收集到的日志写到flume的log

  • avro sink:可以将接受到的日志发送到指定端口,供级联agent的下一跳收集和接受日志,使用时需要指定目的ip和端口

  
  
  
  1. a1.sinks=k1

  2. a1.sinks.k2.type = avro

  3. a1.sinks.k2.channel = c2

  4. a1.sinks.k2.hostname = hadoop03 (指定的主机名或ip)

  5. a1.sinks.k2.port = 16666  (指定的端口号)

  • hdfs sink:将收集到的日志写入到新创建的文件中保存起来,存储路径为分布式的文件系统hdfs的路径,同时hdfs创建新文件的周期可以是时间,也可以是文件的大小,还可以是采集日志的条数

  
  
  
  1. path:写入hdfs的路径,需要包含文件系统标识,比如:hdfs://namenode/flume/webdata/

  2. 可以使用flume提供的日期及%{host}表达式。

  3. filePrefix 默认值:FlumeData 写入hdfs的文件名前缀,可以使用flume提供的日期及%{host}表达式。

  4. fileSuffix:写入hdfs的文件名后缀,比如:.lzo .log等。

  5. inUsePrefix:临时文件的文件名前缀,hdfs sink会先往目标目录中写临时文件,再根据相关规则重命名成最终目标文件;

  6. inUseSuffi: 默认值:.tmp  临时文件的文件名后缀。

  7. rollInterval:  默认值:30  hdfs sink间隔多长将临时文件滚动成最终目标文件,单位:秒;

  8. 如果设置成0,则表示不根据时间来滚动文件;

  9. 注:滚动(roll)指的是,hdfs sink将临时文件重命名成最终目标文件,并新打开一个临时文件来写入数据;

  10. rollSize  默认值:1024 当临时文件达到该大小(单位:bytes)时,滚动成目标文件;

  11. 如果设置成0,则表示不根据临时文件大小来滚动文件;

  12. rollCount  默认值:10  events数据达到该数量时候,将临时文件滚动成目标文件;

  13. 如果设置成0,则表示不根据events数据来滚动文件;

  14. idleTimeout  默认值:0

  15. 当目前被打开的临时文件在该参数指定的时间(秒)内,没有任何数据写入,则将该临时文件关闭并重命名成目标文件;

  16. batchSize   默认值:100  每个批次刷新到HDFS上的events数量;

  17. codeC  文件压缩格式,包括:gzip, bzip2, lzo, lzop, snappy

  18. fileType  默认值:SequenceFile

  19. 文件格式,包括:SequenceFile, DataStream,CompressedStream 当使用DataStream时候,文件不会被压缩,不需要设置hdfs.codeC;当使用CompressedStream时候,必须设置一个正确的hdfs.codeC值;

  20. maxOpenFiles  默认值:5000 最大允许打开的HDFS文件数,当打开的文件数达到该值,最早打开的文件将会被关闭;

  21. minBlockReplicas  默认值:HDFS副本数   写入HDFS文件块的最小副本数。该参数会影响文件的滚动配置,一般将该参数配置成1,才可以按照配置正确滚动文件。

  22. writeFormat  sequence文件的格式。包含:Text, Writable(默认)

  23. callTimeout  默认值:10000 执行HDFS操作的超时时间(单位:毫秒);

  24. threadsPoolSize  默认值:10  hdfs sink启动的操作HDFS的线程数。

  25. rollTimerPoolSize  默认值:1  hdfs sink启动的根据时间滚动文件的线程数。

  26. kerberosPrincipal HDFS安全认证kerberos配置;

  27. kerberosKeytab

  28. HDFS安全认证kerberos配置;

  29. proxyUser  代理用户

  30. round 默认值:false  是否启用时间上的”舍弃”,这里的”舍弃”,类似于”四舍五入”,后面再介绍。如果启用,则会影响除了%t的其他所有时间表达式;

  31. roundValue  默认值:1   时间上进行“舍弃”的值;

  32. roundUnit  默认值:seconds 时间上进行”舍弃”的单位,包含:second,minute,hour

  33. a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S

  34. a1.sinks.k1.hdfs.round = true

  35. a1.sinks.k1.hdfs.roundValue = 10

  36. a1.sinks.k1.hdfs.roundUnit = minute

  37. 当时间为2015-10-16 17:38:59时候,hdfs.path依然会被解析为:

  38. /flume/events/20151016/17:30/00

  39. 因为设置的是舍弃10分钟内的时间,因此,该目录每10分钟新生成一个。

  40. timeZone

  41. 默认值:Local Time  时区。

  42. useLocalTimeStamp 默认值:flase  是否使用当地时间。

  43. closeTries:默认值:0

  44. hdfs sink关闭文件的尝试次数;

  45. 如果设置为1,当一次关闭文件失败后,hdfs sink将不会再次尝试关闭文件,这个未关闭的文件将会一直留在那,并且是打开状态。

  46. 设置为0,当一次关闭失败后,hdfs sink会继续尝试下一次关闭,直到成功。

  47. retryInterval

  48. 默认值:180(秒)

  49. hdfs sink尝试关闭文件的时间间隔,如果设置为0,表示不尝试,相当于于将hdfs.closeTries设置成1.

  50. Serializer  默认值:TEXT

  51. 序列化类型。其他还有:avro_event或者是实现了EventSerializer.Builder的类名。

  • Hbase sink:hbase是一种数据库,可以储存日志,使用时需要指定存储日志的表名和列族名,然后agent就可以将收集到的日志逐条插入到数据库中。

  
  
  
  1. tableName:要写入的HBase数据表名,不能为空;

  2. columnFamily:数据表对应的列簇名,这个sink目前只支持一个列簇,不能为空;

  3. batchSize:每次事务可以处理的最大Event数量,默认是100

  4. eventSerializerType:用来将event写入HBase,即将event转化为put。默认是org.apache.flume.sink.hbase.SimpleHbaseEventSerializer,还有一个是RegexHbaseEventSerializer,即适合HBaseSinkSerializer只有这俩,否则自己定制;

  5. serializerContext:是eventSerializerType的配置信息,就是配置文件中包含“serializer.”的项;

  6. 例子:

  7. agent1.sinks = k1

  8. agent1.sinks.k1.type = hbase

  9. agent1.sinks.k1.table = flume

  10. agent1.sinks.k1.columnFamily=fl_conf

  11. agent1.sinks.k1.serializer=org.apache.flume.sink.hbase.RegexHbaseEventSerializer

综合小案例

  
  
  
  1. #将该代理商的组件命名为

  2. a1.sources  =  r1

  3. a1.sinks  =  k1

  4. a1.channels  =  c1

  5. #描述/配置源

  6. a1.sources.r1.type  =  avro

  7. a1.sources.r1.bind  =  hadoop.jianxin.com

  8. a1.sources.r1.port  =  3306

  9. #描述sink

  10. a1.sinks.k1.type  =  logger

  11. #使用缓冲内存中事件的通道

  12. a1.channels.c1.type  =  memory

  13. a1.channels.c1.capacity  =  100

  14. a1.channels.c1.transactionCapacity  =  10

  15. #将信源和信宿绑定到信道

  16. a1.sources.r1.channels  =  c1

  17. a1.sinks.k1.channel  =  c1

  18. a2.sources=r2

  19. a2.sinks=k2

  20. a2.channels=c2

  21. #描述/配置源

  22. a2.sources.r2.type=exec

  23. a2.sources.r2.command=tail -f /opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6/logs/hive.log

  24. a2.sources.r2.shell=/bin/bash -c

  25. #使用缓冲内存中事件的通道

  26. a2.channels.c2.type=memory

  27. a1.channels.c2.capacity  =  100

  28. a1.channels.c2.transactionCapacity  =  10

  29. #描述sink

  30. a2.sinks.k2.type=hdfs

  31. a2.sinks.k2.hdfs.path=hdfs://hadoop.jianxin.com:9000/user/jianxin/flume/hive/date/%Y%m%d

  32. a2.sinks.k2.hdfs.fileType=DataStream

  33. a2.sinks.k2.hdfs.writeFormat=Text

  34. #Format for sequence file records. One of Text or Writable.

  35. #Set to Text before creating data files with Flume,

  36. #otherwise those files cannot be read by either Apache Impala (incubating) or Apache Hive.

  37. a2.sinks.k2.hdfs.batchSize=10

  38. #number of events written to file before it is flushed to HDFS

  39. a2.sinks.k2.hdfs.useLocalTimeStamp=true

  40. #将信源和信宿绑定到信道

  41. a2.sources.r2.channels=c2

  42. a2.sinks.k2.channel=c2

运行小案例

  
  
  
  1. #启动的会是a2source

  2. bin/flume-ng agent --conf conf --conf-file conf/conf.file --name a2 -Dflume.root.logger=INFO,console

  3. nohup bin/flume-ng agent --conf conf --conf-file conf/conf.file --name a2 -Dflume.root.logger=INFO,console > /data/flume-1.5.0-cdh5.3.6/flume.log 2>&1 &

参考 https://blog.csdn.net/wei_hhh/article/details/77838999 flume 官网 http://flume.apache.org/FlumeUserGuide.html


本文分享自微信公众号 - 我爱问读书(wawds_)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章