基于Flume的美团日志收集系统(二)改进和优化

在《基于Flume的美团日志收集系统(一)架构和设计》中,我们详述了基于Flume的美团日志收集系统的架构设计,以及为什么做这样的设计。在本节中,我们将会讲述在实际部署和使用过程中遇到的问题,对Flume的功能改进和对系统做的优化。

1 Flume的问题总结

在Flume的使用过程中,遇到的主要问题如下:

a. Channel“水土不服”:使用固定大小的MemoryChannel在日志高峰时常报队列大小不够的异常;使用FileChannel又导致IO繁忙的问题;

b. HdfsSink的性能问题:使用HdfsSink向Hdfs写日志,在高峰时间速度较慢;

c. 系统的管理问题:配置升级,模块重启等;

2 Flume的功能改进和优化点

从上面的问题中可以看到,有一些需求是原生Flume无法满足的,因此,基于开源的Flume我们增加了许多功能,修改了一些Bug,并且进行一些调优。下面将对一些主要的方面做一些说明。

2.1 增加Zabbix monitor服务

一方面,Flume本身提供了http, ganglia的监控服务,而我们目前主要使用zabbix做监控。因此,我们为Flume添加了zabbix监控模块,和sa的监控服务无缝融合。

另一方面,净化Flume的metrics。只将我们需要的metrics发送给zabbix,避免 zabbix server造成压力。目前我们最为关心的是Flume能否及时把应用端发送过来的日志写到Hdfs上, 对应关注的metrics为:

  • Source : 接收的event数和处理的event数
  • Channel : Channel中拥堵的event数
  • Sink : 已经处理的event数

2.2 为HdfsSink增加自动创建index功能

首先,我们的HdfsSink写到hadoop的文件采用lzo压缩存储。 HdfsSink可以读取hadoop配置文件中提供的编码类列表,然后通过配置的方式获取使用何种压缩编码,我们目前使用lzo压缩数据。采用lzo压缩而非bz2压缩,是基于以下测试数据:

event大小(Byte)sink.batch-sizehdfs.batchSize压缩格式总数据大小(G)耗时(s)平均events/s压缩后大小(G)
54430010000bz29.1244868331.36
54430010000lzo9.1612273333.49

其次,我们的HdfsSink增加了创建lzo文件后自动创建index功能。Hadoop提供了对lzo创建索引,使得压缩文件是可切分的,这样Hadoop Job可以并行处理数据文件。HdfsSink本身lzo压缩,但写完lzo文件并不会建索引,我们在close文件之后添加了建索引功能。

/**
* Rename bucketPath file from .tmp to permanent location.
*/
private void renameBucket() throws IOException, InterruptedException {if(bucketPath.equals(targetPath)) {return;}final Path srcPath = new Path(bucketPath);final Path dstPath = new Path(targetPath);callWithTimeout(new CallRunner<Object>() {@Overridepublic Object call() throws Exception {if(fileSystem.exists(srcPath)) { // could blockLOG.info("Renaming " + srcPath + " to " + dstPath);fileSystem.rename(srcPath, dstPath); // could block//index the dstPath lzo fileif (codeC != null && ".lzo".equals(codeC.getDefaultExtension()) ) {LzoIndexer lzoIndexer = new LzoIndexer(new Configuration());lzoIndexer.index(dstPath);}}return null;}});
}

2.3 增加HdfsSink的开关

我们在HdfsSink和DualChannel中增加开关,当开关打开的情况下,HdfsSink不再往Hdfs上写数据,并且数据只写向DualChannel中的FileChannel。以此策略来防止Hdfs的正常停机维护。

2.4 增加DualChannel

Flume本身提供了MemoryChannel和FileChannel。MemoryChannel处理速度快,但缓存大小有限,且没有持久化;FileChannel则刚好相反。我们希望利用两者的优势,在Sink处理速度够快,Channel没有缓存过多日志的时候,就使用MemoryChannel,当Sink处理速度跟不上,又需要Channel能够缓存下应用端发送过来的日志时,就使用FileChannel,由此我们开发了DualChannel,能够智能的在两个Channel之间切换。

其具体的逻辑如下:

/**** putToMemChannel indicate put event to memChannel or fileChannel* takeFromMemChannel indicate take event from memChannel or fileChannel* */
private AtomicBoolean putToMemChannel = new AtomicBoolean(true);
private AtomicBoolean takeFromMemChannel = new AtomicBoolean(true);void doPut(Event event) {if (switchon && putToMemChannel.get()) {//往memChannel中写数据memTransaction.put(event);if ( memChannel.isFull() || fileChannel.getQueueSize() > 100) {putToMemChannel.set(false);}} else {//往fileChannel中写数据fileTransaction.put(event);}
}Event doTake() {Event event = null;if ( takeFromMemChannel.get() ) {//从memChannel中取数据event = memTransaction.take();if (event == null) {takeFromMemChannel.set(false);}} else {//从fileChannel中取数据event = fileTransaction.take();if (event == null) {takeFromMemChannel.set(true);putToMemChannel.set(true);}}return event;
}

2.5 增加NullChannel

Flume提供了NullSink,可以把不需要的日志通过NullSink直接丢弃,不进行存储。然而,Source需要先将events存放到Channel中,NullSink再将events取出扔掉。为了提升性能,我们把这一步移到了Channel里面做,所以开发了NullChannel。

2.6 增加KafkaSink

为支持向Storm提供实时数据流,我们增加了KafkaSink用来向Kafka写实时数据流。其基本的逻辑如下:

public class KafkaSink extends AbstractSink implements Configurable {private String zkConnect;private Integer zkTimeout;private Integer batchSize;private Integer queueSize;private String serializerClass;private String producerType;private String topicPrefix;private Producer<String, String> producer;public void configure(Context context) {//读取配置,并检查配置}@Overridepublic synchronized void start() {//初始化producer}@Overridepublic synchronized void stop() {//关闭producer}@Overridepublic Status process() throws EventDeliveryException {Status status = Status.READY;Channel channel = getChannel();Transaction tx = channel.getTransaction();try {tx.begin();//将日志按category分队列存放Map<String, List<String>> topic2EventList = new HashMap<String, List<String>>();//从channel中取batchSize大小的日志,从header中获取category,生成topic,并存放于上述的Map中;//将Map中的数据通过producer发送给kafkatx.commit();} catch (Exception e) {tx.rollback();throw new EventDeliveryException(e);} finally {tx.close();}return status;}
}

2.7 修复和scribe的兼容问题

Scribed在通过ScribeSource发送数据包给Flume时,大于4096字节的包,会先发送一个Dummy包检查服务器的反应,而Flume的ScribeSource对于logentry.size()=0的包返回TRY_LATER,此时Scribed就认为出错,断开连接。这样循环反复尝试,无法真正发送数据。现在在ScribeSource的Thrift接口中,对size为0的情况返回OK,保证后续正常发送数据。

3. Flume系统调优经验总结

3.1 基础参数调优经验

  • HdfsSink中默认的serializer会每写一行在行尾添加一个换行符,我们日志本身带有换行符,这样会导致每条日志后面多一个空行,修改配置不要自动添加换行符;

lc.sinks.sink_hdfs.serializer.appendNewline = false

  • 调大MemoryChannel的capacity,尽量利用MemoryChannel快速的处理能力;

  • 调大HdfsSink的batchSize,增加吞吐量,减少hdfs的flush次数;

  • 适当调大HdfsSink的callTimeout,避免不必要的超时错误;

3.2 HdfsSink获取Filename的优化

HdfsSink的path参数指明了日志被写到Hdfs的位置,该参数中可以引用格式化的参数,将日志写到一个动态的目录中。这方便了日志的管理。例如我们可以将日志写到category分类的目录,并且按天和按小时存放:

lc.sinks.sink_hdfs.hdfs.path = /user/hive/work/orglog.db/%{category}/dt=%Y%m%d/hour=%H

HdfsS ink中处理每条event时,都要根据配置获取此event应该写入的Hdfs path和filename,默认的获取方法是通过正则表达式替换配置中的变量,获取真实的path和filename。因为此过程是每条event都要做的操作,耗时很长。通过我们的测试,20万条日志,这个操作要耗时6-8s左右。

由于我们目前的path和filename有固定的模式,可以通过字符串拼接获得。而后者比正则匹配快几十倍。拼接定符串的方式,20万条日志的操作只需要几百毫秒。

3.3 HdfsSink的b/m/s优化

在我们初始的设计中,所有的日志都通过一个Channel和一个HdfsSink写到Hdfs上。我们来看一看这样做有什么问题。

首先,我们来看一下HdfsSink在发送数据的逻辑:

//从Channel中取batchSize大小的events
for (txnEventCount = 0; txnEventCount < batchSize; txnEventCount++) {//对每条日志根据category append到相应的bucketWriter上;bucketWriter.append(event);
}for (BucketWriter bucketWriter : writers) {//然后对每一个bucketWriter调用相应的flush方法将数据flush到Hdfs上bucketWriter.flush();
}

假设我们的系统中有100个category,batchSize大小设置为20万。则每20万条数据,就需要对100个文件进行append或者flush操作。

其次,对于我们的日志来说,基本符合80/20原则。即20%的category产生了系统80%的日志量。这样对大部分日志来说,每20万条可能只包含几条日志,也需要往Hdfs上flush一次。

上述的情况会导致HdfsSink写Hdfs的效率极差。下图是单Channel的情况下每小时的发送量和写hdfs的时间趋势图。

美团日志收集系统架构

鉴于这种实际应用场景,我们把日志进行了大小归类,分为big, middle和small三类,这样可以有效的避免小日志跟着大日志一起频繁的flush,提升效果明显。下图是分队列后big队列的每小时的发送量和写hdfs的时间趋势图。

美团日志收集系统架构

4 未来发展

目前,Flume日志收集系统提供了一个高可用,高可靠,可扩展的分布式服务,已经有效地支持了美团的日志数据收集工作。

后续,我们将在如下方面继续研究:

  • 日志管理系统:图形化的展示和控制日志收集系统;
  • 跟进社区发展:跟进Flume 1.5的进展,同时回馈社区;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 462. 最少移动次数使数组元素相等 II(数学)

1. 题目 给定一个非空整数数组&#xff0c;找到使所有数组元素相等所需的最小移动数&#xff0c;其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。 例如: 输入: [1,2,3] 输出: 2说明&#xff1a; 只有两个动作是必要的&#xff08;记得每一步仅可…

embedding亦福亦祸?XGBoost与LightGBM的新机遇

文 | 水哥源 | 知乎Saying1. 小的性能差异在容易实现面前一文不值&#xff0c;这一点是XGBoost和LightGBM的最大优势2. 没能与embedding很好地结合无疑是树模型的灾难&#xff0c;吃不下巨量的新数据&#xff0c;也打不过DNN&#xff0c;除了一些规模比较小的公司&#xff0c;树…

论文浅尝 - ACL2022 | 面向推理阅读理解的神经符号方法

转载公众号 | 南大Websoft概述近两年来NLP领域出现了一些富有挑战性的机器阅读理解数据集&#xff0c;如ReClor和LogiQA。这两个数据集中的问题需要对文本进行逻辑推理&#xff0c;然而传统的神经模型不足以进行逻辑推理&#xff0c;传统的符号推理器不能直接应用于文本。为了应…

LeetCode 1026. 节点与其祖先之间的最大差值(二叉树DFS)

1. 题目 给定二叉树的根节点 root&#xff0c;找出存在于不同节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么我们认为…

凭“难听”上热搜的 idol 们,不如考虑下让 Transformer 帮您作曲?

视频制作 | 白鹡鸰编 | 小轶考虑到 “AI 音乐”这一主题的特殊性&#xff0c;唯有多媒体的视频形式才能更好地给大家带来视听上的多重感受。于是&#xff0c;小屋的白鸟鸟同学在科研间隙连续肝了好几个晚上&#xff0c;才得以完成这次视频。然而在上周的推送中&#xff0c;不知…

YUI3在美团的实践

美团网在2010年引爆了团购行业&#xff0c;并在2012年销售额超过55亿&#xff0c;实现了全面盈利。在业务规模不断增长的背后&#xff0c;作为研发队伍中和用户最接近的前端团队承担着非常大的压力&#xff0c;比如用户量急剧上升带来的产品多样化&#xff0c;业务运营系统的界…

论文浅尝 - ICLR2022 | OntoProtein:融入基因本体知识的蛋白质预训练

论文题目&#xff1a;OntoProtein: Protein Pretraining With Gene Ontology Embedding本文作者&#xff1a;张宁豫&#xff08;浙江大学&#xff09;、毕祯&#xff08;浙江大学&#xff09;、梁孝转&#xff08;浙江大学&#xff09;、程思源&#xff08;浙江大学&#xff09…

LeetCode 540. 有序数组中的单一元素(位运算二分查找)

1. 题目 给定一个只包含整数的有序数组&#xff0c;每个元素都会出现两次&#xff0c;唯有一个数只会出现一次&#xff0c;找出这个数。 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2示例 2: 输入: [3,3,7,7,10,11,11] 输出: 10注意: 您的方案应该在 O(log n) 时间复杂度 和 O…

迁移Prompt–解决Prompt Tuning三大问题!

文 | Harris刘鹏飞博士将近代NLP的研究划归为四种范式 [1] 并把预训练语言模型加持下的Prompt Learning看作是近代自然语言处理技术发展的“第四范式”。当我们使用新范式的方法的时候&#xff0c;能够意识到它带来的优异性可能是以某种“人力”牺牲为代价的。而如何让这种人力…

征文 | 2022年全国知识图谱与语义计算大会(CCKS 2022) 征稿通知

2022年全国知识图谱与语义计算大会征稿通知Call for Papers2022年8月25日-28日&#xff0c;秦皇岛征稿截止: 2022年5月22日第十六届全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Computing&#xff09;由中国中文信息学会语…

Spring Cloud 和 Dubbo 哪个会被淘汰?

今天在知乎上看到了这样一个问题&#xff1a;Spring Cloud 和 Dubbo哪个会被淘汰&#xff1f;看了几个回答&#xff0c;都觉得不在点子上&#xff0c;所以要么就干脆写篇小文瞎逼叨一下。 简单说说个人观点 我认为这两个框架大概率会长期都存在。 时至今日&#xff0c;这两个…

DNN与推荐两大门派,一念神魔,功不唐捐

文 | 水哥源 | 知乎Saying1. embeddingDNN范式有两个流派&#xff0c;一个更关注DNN&#xff0c;叫逍遥派&#xff1b;一个更关注embedding&#xff0c;叫少林派2. embeddingDNN这种结构中&#xff0c;embedding一般是模型并行&#xff1b;DNN一般是数据并行3. 逍遥派能够创造奇…

会议交流—PPT下载|DataFunSummit2022:知识图谱在线峰会PPT合集!

点击上方公众号卡片&#xff0c;后台回复『20220312』&#xff0c;即可下载&#xff01;有哪些PPT&#xff1f;下载方式点击下方公众号卡片&#xff0c;后台回复『20220312』&#xff0c;即可下载&#xff01;OpenKGOpenKG&#xff08;中文开放知识图谱&#xff09;旨在推动以中…

Spring Cloud 2020年路线图发布,涵盖Spring Boot 2.3、2.4,Spring Cloud Ilford等重磅内容!

Spring Cloud 开发团队昨日公布了 Spring Cloud 2020 年的路线图&#xff0c;并对 Spring Cloud Greenwich 和 Hoxton 的生命周期进行了一些讲解。 Spring Cloud Ilford 开发团队称 Spring Cloud Ilford 将是下一个主要版本&#xff0c;这也将是自 Spring Cloud Finchley 发布…

LeetCode 398. 随机数索引(概率)

1. 题目 给定一个可能含有重复元素的整数数组&#xff0c;要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。 注意&#xff1a; 数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。 示例: int[] nums new int[] {1,2,3,3,3}; Solutio…

再论推荐特征与embedding生成

文 | 水哥源 | 知乎Saying1. 工业特征处理和学术特征处理存在巨大差异&#xff0c;这里建议同学们一定认真阅读。这个差异可能引发未来各种方法落地的矛盾。2. full embedding在概念上和one-hot的操作等价&#xff0c;但在操作上省略了这个过程。3. hash是最省事的&#xff0c;…

图谱实战 | 李翔:美团到店综合知识图谱的构建与应用

转载公众号 | DataFunTalk分享嘉宾&#xff1a;李翔 美团 算法专家编辑整理&#xff1a;王惠灵 合肥工业大学出品平台&#xff1a;DataFunTalk导读&#xff1a;美团到店综合业务涵盖了本地生活中的休闲玩乐、丽人、亲子、结婚、宠物等多个行业。为了不断提升到店综合业务场景下…

Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单

距离Spring Boot 2.2.0的发布已经有一个半月左右时间&#xff0c;由于与之匹配的Spring Cloud版本一直没有Release&#xff0c;所以在这期间碰到不少读者咨询的问题都是由于Spring Boot和Spring Cloud版本不匹配导致。 很多时候&#xff0c;我们在学习或重建系统的时候都喜欢直…

加了元学习之后,少样本学习竟然可以变得这么简单!

文 | Rukawa_Y编 | Sheryc_王苏&#xff0c;小轶去年年初 GPT-3 的论文在 arxiv 上出现&#xff0c;论文名为 “Language Models are Few-Shot Learners”&#xff0c;引起一阵轰动。除了前无古人的模型规模外&#xff0c;最抓人眼球的是&#xff0c; GPT-3 能够不需要 fine-tu…

Spring Cloud Alibaba基础教程:与Dubbo的完美融合

很早以前&#xff0c;在刚开始搞Spring Cloud基础教程的时候&#xff0c;写过这样一篇文章&#xff1a;《微服务架构的基础框架选择&#xff1a;Spring Cloud还是Dubbo&#xff1f;》&#xff0c;可能不少读者也都看过。之后也就一直有关于这两个框架怎么选的问题出来&#xff…