华为云MRS(Flume+OBSA-HDFS+并行文件桶的配置方法–大数据存算分离解决方案之)

Flume 是一个分布式的、可靠的和高可用的服务,用于收集、聚合以及移动大量日志数据。具体请参见:http://flume.apache.org/

OBS是华为云的对象存储服务,OBS支持S3对象存储协议,同时也支持HDFS协议,在大数据场景中可以替代hadoop系统中的HDFS服务,本文用于描述flume如何对接使用OBS。

OBS服务有对象桶和并行文件桶两种选择,在大数据场景下建议选择并行文件桶。

操作步骤

以flume 1.9版本为例

1. 下载flume

http://flume.apache.org/download.html

2. 安装flume:支持写数据到OBS

(1)解压apache-flume-1.9.0-bin.tar.gz到apache-flume-1.9.0-bin目录

(2)在部署了Hadoop的环境中(设置了HADOOP_HOME等环境变量)

  • 按照下述文档配置hadoop环境
https://github.com/huaweicloud/obsa-hdfs/blob/master/release/doc/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1OBSA-HDFS%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.pdf

(3)在没有部署Hadoop的环境中

  • 下载hadoop并按照下述文档配置hadoop环境
https://github.com/huaweicloud/obsa-hdfs/blob/master/release/doc/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1OBSA-HDFS%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.pdf
  • 将hadoop中的相关jar包复制到 apache-flume-1.9.0-bin/lib 目录下,包含hadoop-huaweicloud-xxx.jar
  • 将配置好的core-site.xml文件复制到flume根目录/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/agent/flume-data

agent.channels.c1.checkpointDir = /data/agent/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桶名/flume/dc/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

注意事项

1. 多sink写同一文件

OBS和HDFS在一致性保证上是有差别的:

HDFS租约机制可以保证并发写同一个文件时不会产生一致性问题,但是OBS实现的HDFS协议不支持租约机制(并发写同一个文件时将产生不可确定的状态),所以在flume场景下可以通过文件命名规则进行解决,例如

sink文件的命名规则:hostname-sinkname作为文件的前缀,如果一个主机上部署了多个flume agent,不同的agent要有不同的sinkname

2. flume日志配置

为了减少无谓的日志输出,可以在flume根目录/conf目录下的log4j.properties文件中增加如下配置:

log4j.logger.org.apache.hadoop.fs.obs=ERROR

log4j.logger.com.obs=ERROR

3. obsa写入时临时文件的目录配置

Flume写obs时会先写入本地磁盘缓冲区,然后上传到obs,如果对写入obs有极致性能要求请选择高性能磁盘作为缓冲区,在core-site.xml文件中增加如下配置:

<property>

<name>fs.obs.buffer.dir</name>

<value>xxx</value>

</property>

原文:https://bbs.huaweicloud.com/forum/thread-122228-1-1.html