七牛云:基于Go开发的大数据平台

4,254 阅读7分钟

内容来源:2017年8月5日,七牛云大数据高级工程师党合萱在“Gopher 杭州 meetup”进行《基于Go的大数据平台》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。

阅读字数:2610 | 7分钟阅读

嘉宾演讲视频及PPT回顾:suo.im/1h4oJc

摘要

大数据一直是我们在谈论的话题,不管你数据到底有多大?党合萱将给大家带来全新的大数据处理思路。

什么是Pandora

Pandora是七牛大数据团队及整个系列产品的代号,我们的目标是提供简单、开放、高效的一站式大数据平台。

系统设计分析与架构

构建系统的挑战

在最开始做这个系统的时候,我们先梳理一下有可能会遇到的问题。一个好的系统不仅要解决当下的问题,更要考虑到未来可预期时间里业务上或者数据规模上可能面临的一些挑战。

上图中左边的三点是我们在业务上需要考虑的点,右边的三点则是我们从具体实现和架构上去考虑的地方。

可以看到最核心的地方在于系统需要具备高吞吐、低延迟的能力。

如上图所示,在这个系统当中,最核心的部分是红色和蓝色的框图部分。蓝色部分主要是负责从消息队列中拉取数据出来,然后经过红色master模块进行任务分配和调度,把拉出来的数据导入到下游的各个业务模块中去。

最右边的绿色模块是我们的监控系统,这个监控系统从最上层的业务指标、链路性能,以及机器的健康状况都可以做收集和监控。而黄色框图部分则是对业务和监控指标做可视化的展示。

图中的最顶部是我们提供给用户的一个可视化的界面,用户可以在这个界面中进行一些鼠标式的拖拽来创建一个工作流。这个工作流的导出部分体现在导出系统中就是做数据的拉取、处理和推送的工作。

多种上下游适配

业务架构

我们从kafka里面拉取数据,将数据进行一定的处理之后推送到下游的各个不同的系统中去,由于下游系统各不相同,所以在这个过程中我们要考虑一下这几种下游系统在哪些方面有着异同。

导出模型

导出模型有两种,一种是最基本的通用导出模型。接到任务之后要从上游取数据,经过处理或者过滤后把这个数据推送到下面去。

另一种是云存储导出模型,它在通用导出模型中新增了两步,即把拉取到的文件存放在本地,然后进行一些压缩,上传到云存储。这样可以有效地减少文件个数,同时减少云存储空间的使用,并且能够降低用户的成本。

高吞吐/低延迟问题探究

这个问题解决起来是比较困难的,尤其是在数据量较大的时候,高吞吐和低延迟各自都有一些困难的点。根据我们的实践经验来看,吞吐量方面遇到最大的问题就是资源的利用率不够高,或者上下游系统吞吐能力不一致,存在短板效应。

低延迟问题在很多的情况下其实是对服务稳定性要求,因此我们要注意规避服务热点。

除了这些之外,如果不能及时发现上下游系统间的负载变化也会导致某一环节被打爆。而越是复杂的系统,问题也就越容易在某个不经意的环节出现。

数据预取

Export server在向下游推数据的时候会预先从上游拉数据回来,由此保证网络最大的利用率,同时也减少了等待时间,提升导出效率。

预取时如果无数据可取,则休眠1s再取数据,既然?(后续还)没有数据则休眠时间加倍,一直到32s为止,过程中如果取到数据,则休眠时间重置为1s,该机制有效减少了对底层存储的请求数量。

数据推送协议优化

我们优化了export service与logdb之间的数据推送协议。最开始使用的是Json,但是它的序列化和反序列化的性能较差,下游系统中CPU的使用率非常高,影响服务的整体性能。

经过调研之后我们将Json格式换成了Protobuf。经观察发现带宽消耗减少了近一半,吞吐量提升了,CPU的资源消耗也降低了一半以上。

资源优化使用

kodo导出为了达到节省存储空间的目的,在导出前的converter这一步使用了parquet压缩,可以有8比1的压缩比。效果很好,但缺点也同样明显。

缺陷就在于消耗大量CPU影响服务,只有在文件较大的情况下才有更好的压缩比。我们对它做了一些优化,控制并发,优化压缩过程的内存使用,并精确控制CPU使用。

高可用与水平扩展

master/server架构

master/server间采用golang rpc通信。server上报心跳证明自己存活,并汇报所执行任务的情况。master向server周期性下发任务,server管理自身任务决定哪些要执行哪些要丢弃。

master高可用

master自身无状态,身份信息注册在zookeeper。master failover时主备自动切换。主master丢锁会自杀,备master抢锁成为主master。

server高可用

server注册自身,防止单机重复运行。server注册每一个任务,防止任务被重复执行。server高可用,节点故障时任务会被调度到其他正常节点。

水平扩展

资源不足时加入新的机器作为新server,新server从zk上获取master身份信息,并上报心跳给master。其他任务被调度至新server。

自动化运维

系统热点自动感知与调整

一方面利用日志对服务做审计、趋势预测,宏观上离线式的预知一段时间内的热点所在。另一方面依靠服务自身的状态反馈实时微调,修正宏观预测结果。

线上系统现状

每日处理超过千亿数据点、百TB级别的数据量。线上导出延迟在1分钟以内,较少的人工介入。秒级扩容,实时的可视化监控系统,易用的报警系统,自动生成线上日报。

Go的应用

我们用Golang做了些什么

流式计算、离线计算、日志检索、时序数据库等一整套服务的核心代码都使用Golang开发。

简单、高效、的数据接入工具logkit,除了pandora之外可以接入多种数据库、kafka、机器metric信息等等。以及全套监控工具。

为什么选择Golang

Golang易上手,入门快。降低程序员的心智负担,可以集中精力在业务上。更简单高效的并发模型天然的支持分布式服务的编写,有丰富的库可供我们调用。七牛是国内第一批在go语言方面进行实践的公司,公司内部基于golang的rpc、缓存系统等都已经打磨的很成熟。

今天的分享就到这里,谢谢大家!