
# Flume对接OBS
#### 概述
Flume是一个分布式的、可靠的和高可用的服务，用于收集、聚合以及移动大量日志数据，具体请参见[Apache Flume](https://flume.apache.org/)。OBS在大数据场景中可以替代Hadoop系统中的HDFS服务。
#### 注意事项
- 多sink写同一文件 OBS和HDFS在一致性保证上是有差别的：HDFS租约机制可以保证并发写同一个文件时不会产生一致性问题，但是OBS实现的HDFS协议不支持租约Lease机制（并发写同一个文件时将产生不可确定的状态），所以在flume场景下可以通过文件命名规则进行解决。
  如sink文件的命名规则：hostname-sinkname作为文件的前缀，如果一个主机上部署了多个flume agent，不同的agent要有不同的sinkname。
  
- flume日志配置 为了减少日志输出，在/opt/apache-flume-1.9.0-bin/conf/log4j.properties文件中增加配置：
  ```
  log4j.logger.com.obs=ERROR
  ```
  
- obsa写入时临时文件的目录配置 Flume写OBS时会先写入本地磁盘缓冲区，然后上传到OBS，如果对写入OBS有极致性能要求请选择高性能磁盘作为缓冲区，在core-site.xml文件中增加配置：
  ```
  <property>
  <name>fs.obs.buffer.dir</name>
  <value>xxx</value>
  </property>
  ```
  
 
#### 对接步骤
以flume 1.9版本为例。
1. 下载apache-flume-1.9.0-bin.tar.gz。
2. 安装flume。 
   解压apache-flume-1.9.0-bin.tar.gz到/opt/apache-flume-1.9.0-bin目录。
   - 已部署Hadoop的环境：无需额外操作，部署Hadoop请参见[Hadoop对接OBS](https://support.huaweicloud.com/bestpractice-obs/obs_05_1507.html)。
   
   
   
   - 未部署Hadoop的环境：
     1. 将hadoop中的相关jar包复制到/opt/apache-flume-1.9.0-bin/lib目录下，包含hadoop-huaweicloud-xxx.jar。
     
     2. 将添加了OBS相关配置的core-site.xml文件复制到/opt/apache-flume-1.9.0-bin/conf目录下。
      
   
   
   
   
3. 验证是否对接成功。 
   示例：以flume内置的StressSource为source，以file为channel，以obs为sink。
   1. 创建flume配置文件：sink2obs.properties。
      ```
      agent.sources = r1
      agent.channels = c1
      agent.sinks = k1
      agent.sources.r1.type = org.apache.flume.source.StressSource
      agent.sources.r1.channels = c1
      agent.sources.r1.size = 1024
      agent.sources.r1.maxTotalEvents = 100000
      agent.sources.r1.maxEventsPerSecond = 10000
      agent.sources.r1.batchSize=1000
      agent.sources.r1.interceptors = i1
      agent.sources.r1.interceptors.i1.type = host
      agent.sources.r1.interceptors.i1.useIP = false
      agent.channels.c1.type = file
      agent.channels.c1.dataDirs = /data/agent/flume-data
      agent.channels.c1.checkpointDir = /data/agent/flume-checkpoint
      agent.channels.c1.capacity = 500000
      agent.channels.c1.transactionCapacity = 50000
      agent.sinks.k1.channel = c1
      agent.sinks.k1.type = hdfs
      agent.sinks.k1.hdfs.useLocalTimeStamp = true
      agent.sinks.k1.hdfs.filePrefix = %{host}_k1
      agent.sinks.k1.hdfs.path = obs://obs-bucket/flume/create_time=%Y-%m-%d-%H-%M
      agent.sinks.k1.hdfs.fileType = DataStream
      agent.sinks.k1.hdfs.writeFormat = Text
      agent.sinks.k1.hdfs.rollSize = 0
      agent.sinks.k1.hdfs.rollCount = 1000
      agent.sinks.k1.hdfs.rollInterval = 0
      agent.sinks.k1.hdfs.batchSize = 1000
      agent.sinks.k1.hdfs.round = true
      agent.sinks.k1.hdfs.roundValue = 10
      agent.sinks.k1.hdfs.roundUnit = minute
      ```
      
   
   2. 执行以下命令，启动flume agent。 **./bin/flume-ng agent -n agent -c conf/ -f conf/sink2obs.properties**
      
   
   
   
   
 
