【微信分享】王团结:如何用Hadoop/Spark构建七牛数据平台

摘要:7月30日,七牛数据平台工程师王团结就七牛内部使用的数据平台,深入分享了该团队在Flume、Kafka、Spark以及Streaming上的实践经验,并讲解了各个工具使用的注意点。

继“ YARN or Mesos?Spark痛点探讨”、“ Mesos资源调度与管理的深入分享与交流”、及“ 主流SQL
on Hadoop框架选择
”之后,CSDN Spark微信用户群邀请了王团结为大家分享Hadoop/Spark在七牛数据平台的实战。



王团结七牛数据平台工程师,主要负责数据平台的设计研发工作。关注大数据处理,高性能系统服务,关注Hadoop、Flume、Kafka、Spark等离线、分布式计算技术。


下为讨论实录

数据平台在大部分公司都属于支撑性平台,做的不好立刻会被吐槽,这点和运维部门很像。所以在技术选型上优先考虑现成的工具,快速出成果,没必要去担心有技术负担。早期,我们走过弯路,认为没多少工作量,收集存储和计算都自己研发,发现是吃力不讨好。去年上半年开始,我们全面拥抱开源工具,搭建自己的数据平台。

数据平台设计理念

公司的主要数据来源是散落在各个业务服务器上的半结构化日志,比如系统日志、程序日志、访问日志、审计日志等。日志是最原始的数据记录,如果不是日志,肯定会有信息上的丢失。说个简单的例子,需求是统计Nginx上每个域名的的流量,这个完全可以通过一个简单的Nginx模块去完成,但是如果统计的是不同来源的流量就无法做了。所以需要原始的完整的日志。

有种手法是业务程序把日志通过网络直接发送出去,但是这并不可取,因为网络和接收端并不完全可靠,当出问题时会对业务造成影响或者日志丢失。因此,对业务侵入最小最自然的方式是把日志落到本地硬盘上。

数据平台设计架构

Agent设计需求

每台机器上会有一个Agent去同步这些日志,这是个典型的队列模型,业务进程在不断的push,Agent在不停的pop。Agent需要有记忆功能,用来保存同步的位置(offset),这样才尽可能保证数据准确性,但不可能做到完全准确。由于发送数据和保存offset是两个动作,不具有事务性,不可避免的会出现数据不一致性情况,通常是发送成功后保存offset,那么在Agent异常退出或机器断电时可能会造成多余的数据。

在这里,Agent需要足够轻,这主要体现在运维和逻辑两个方面。Agent在每台机器上都会部署,运维成本、接入成本是需要考虑的。Agent不应该有解析日志、过滤、统计等动作,这些逻辑应该给数据消费者。倘若Agent有较多的逻辑,那它是不可完成的,不可避免的经常会有升级变更动作。

数据收集流程

数据收集这块的技术选择,Agent是用Go自己研发的,消息中间件Kafka,数据传输工具Flume。说到数据收集经常有人拿Flume和Kafka做比较,我看来这两者定位是不同的,Flume更倾向于数据传输本身,Kakfa是典型的消息中间件用于解耦生产者消费者。

具体架构上,Agent并没把数据直接发送到Kafka,在Kafka前面有层由Flume构成的forward。这样做有两个原因:

1. Kafka的API对非JVM系的语言支持很不友好,forward对外提供更加通用的http接口。

2. forward层可以做路由、Kafka topic和Kafka partition key等逻辑,进一步减少Agent端的逻辑。

forward层不含状态,完全可以做到水平扩展,不用担心成为瓶颈。出于高可用考虑,forward通常不止一个实例,这会带来日志顺序问题,Agent按一定规则(round-robin、failover等)来选择forward实例,即使Kafka partition key一样,由于forward层的存在,最终落入Kafka的数据顺序和Agent发送的顺序可能会不一样。我们对乱序是容忍的,因为产生日志的业务基本是分布式的,保证单台机器的日志顺序意义不大。如果业务对顺序性有要求,那得把数据直接发到Kafka,并选择好partition
key,Kafka只能保证partition级的顺序性。

跨机房收集要点

多机房的情形,通过上述流程,先把数据汇到本地机房Kafka 集群,然后汇聚到核心机房的Kafka,最终供消费者使用。由于Kafka的mirror对网络不友好,这里我们选择更加的简单的Flume去完成跨机房的数据传送。Flume在不同的数据源传输数据还是比较灵活的,但有几个点需要注意:

1. memory-channel效率高但可能有丢数据的风险,file-channel安全性高但性能不高。我们是用memory-channel,但把capacity设置的足够小,使内存中的数据尽可能少,在意外重启和断电时丢的数据很少。个人比较排斥file-channel,效率是一方面,另一个是对Flume的期望是数据传输,引入file-channel时,它的角色会向存储转变,这在整个流程中是不合适的。通常Flume的sink端是Kafka和HDFS这种可用性和扩张性比较好的系统,不用担心数据拥堵问题。

2. 默认的http souce 没有设置线程池,有性能问题,如果有用到,需要自己修改代码。

3. 单sink速度跟不上时,需要多个sink。像跨机房数据传输网络延迟高单rpc sink吞吐上不去和HDFS sink效率不高情形,我们在一个channel后会配十多个sink。

Kafka使用要点

Kafka在性能和扩展性很不错,以下几个点需要注意下:

1. topic的划分,大topic对生产者有利且维护成本低,小topic对消费者比较友好。如果是完全不相关的相关数据源且topic数不是发散的,优先考虑分topic。

2. Kafka的并行单位是partition,partition数目直接关系整体的吞吐量,但parition数并不是越大越高,3个partition就能吃满一块普通硬盘IO了。所以partition数是由数据规模决定,最终还是需要硬盘来抗。

3. partition key选择不当,可能会造成数据倾斜。在对数据有顺序性要求才需使用partition key。Kafka的producer sdk在没指定partition key时,在一定时间内只会往一个partition写数据,这种情况下当producer数少于partition数也会造成数据倾斜,可以提高producer数目来解决这个问题。

数据离线和实时计算

数据到Kafka后,一路数据同步到HDFS,用于离线统计。另一路用于实时计算。由于今天时间有限,接下来只能和大家分享下实时计算的一些经验。

实时计算我们选择的Spark Streaming。我们目前只有统计需求,没迭代计算的需求,所以Spark Streaming使用比较保守,从Kakfa读数据统计完落入mongo中,中间状态数据很少。带来的好处是系统吞吐量很大,但几乎没遇到内存相关问题

Spark Streaming对存储计算结果的数据库tps要求较高。比如有10万个域名需要统计流量,batch interval为10s,每个域名有4个相关统计项,算下来平均是4万 tps,考虑到峰值可能更高,固态硬盘上的mongo也只能抗1万tps,后续我们会考虑用redis来抗这么高的tps

有外部状态的task逻辑上不可重入的,当开启speculation参数时候,可能会造成计算的结果不准确。说个简单的例子。这个任务,如果被重做了,会造成落入mongo的结果比实际多。

有状态的对象生命周期不好管理,这种对象不可能做到每个task都去new一个。我们的策略是一个JVM内一个对象,同时在代码层面做好并发控制。类似下面。

在Spark1.3的后版本,引入了 Kafka Direct API试图来解决数据准确性问题,使用Direct在一定程序能缓解准确性问题,但不可避免还会有一致性问题。为什么这样说呢?Direct API 把Kafka consumer offset的管理暴露出来(以前是异步存入ZooKeeper),当保存计算结果和保存offset在一个事务里,才能保证准确。

这个事务有两种手段做到,一是用MySQL这种支持事务的数据库保存计算结果offset,一是自己实现两阶段提交。这两种方法在流式计算里实现的成本都很大。其次Direct API 还有性能问题,因为它到计算的时候才实际从Kafka读数据,这对整体吞吐有很大影响。

七牛数据平台规模

要分享的就这些了,最后秀下我们线上的规模:Flume + Kafka + Spark8台高配机器,日均500亿条数据,峰值80万tps。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 21:17:39

【微信分享】王团结:如何用Hadoop/Spark构建七牛数据平台的相关文章

如何用 Hadoop/Spark 构建七牛数据平台

数据平台在大部分公司都属于支撑性平台,做的不好立刻会被吐槽,这点和运维部门很像.所以在技术选型上优先考虑现成的工具,快速出成果,没必要去担心有技术负担.早期,我们走过弯路,认为没多少工作量,收集存储和计算都自己研发,发现是吃力不讨好.去年上半年开始,我们全面拥抱开源工具,搭建自己的数据平台. 1.数据平台设计理念 公司的主要数据来源是散落在各个业务服务器上的半结构化日志,比如系统日志.程序日志.访问日志.审计日志等.日志是最原始的数据记录,如果不是日志,肯定会有信息上的丢失.说个简单的例子,需求

基于Spark构建开放式的云计算平台第一阶段课程

在2014年6月30日到7月2日举行的Spark Summit是整个云计算大数据领域的Big Event,在会议上DataBricks公司提出了构建开放的Cloud平台,而且宣布该平台完全基于Spark,该平台功能类似于EC2,但比EC2更快.更灵活.更易用. 构建一个开发的云服务平台,需要存储技术.计算平台.消息驱动框架和开发API架构设计等,所以我们把课程主要分为两个阶段:1,Spark技术实战:2,构建开发云平他的消息驱动框架和开放API设计实现: 本课程是是整个系列课程的第一阶段课程,采

创业公司做数据分析(五)微信分享追踪系统

??作为系列文章的第五篇,本文重点探讨数据采集层中的微信分享追踪系统.微信分享,早已成为移动互联网运营的主要方向之一,以Web H5页面(下面称之为微信海报)为载体,利用微信庞大的好友关系进行传播,实现宣传.拉新等营销目的.以下图为例,假设有一个海报被分享到了微信中,用户A与B首先看到了这个海报,浏览后又分享给了自己的好友,用户C看到了A分享的海报,浏览后继续分享给了自己的好友.这便形成了一个简单的传播链,其中蕴含了两种数据: 行为,指的是用户对微信海报的操作,比如打开.分享. 关系,指的是在海

微信分享次数统计

作为系列文章的第五篇,本文重点探讨数据采集层中的微信分享追踪系统.微信分享,早已成为移动互联网运营的主要方向之一,以Web H5页面(下面称之为微信海报)为载体,利用微信庞大的好友关系进行传播,实现宣传.拉新等营销目的.以下图为例,假设有一个海报被分享到了微信中,用户A与B首先看到了这个海报,浏览后又分享给了自己的好友,用户C看到了A分享的海报,浏览后继续分享给了自己的好友.这便形成了一个简单的传播链,其中蕴含了两种数据: 行为,指的是用户对微信海报的操作,比如打开.分享. 关系,指的是在海报传

大数据知识点分享:大数据平台应用 17 个知识点汇总

一.大数据中的数据仓库和Mpp数据库如何选型? 在Hadoop平台中,一般大家都把hive当做数据仓库的一种选择,而Mpp数据库的典型代表就是impala,presto.Mpp架构的数据库主要用于即席查询场景,暨对数据查询效率有较高要求的场景,而对数据仓库的查询效率要求无法做大MPP那样,所以更多地适用与离线分析场景. Hadoop已经是大数据平台的实时标准,其中Hadoop生态中有数据仓库Hive,可以作为大数据平台的标准数据仓库, 对于面向应用的MPP数据库,可以选择MYCAT(mySql的

【大数据干货】基于Hadoop的大数据平台实施——整体架构设计

大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底是否适用于您的公司或组织,至少在互联网上已经被吹嘘成无所不能的超级战舰.大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底是否适用于您的公司或组织,至少在互联网上已经被吹嘘成无所不能的超级战舰.好像一夜之间我们就从互联网时代跳跃进了大数据时代!关于到底什么是大数据,说真的,到目前为止就和云计算一样,让我总觉得像是在看电影<云图>--云里雾里的感觉.或许那些正

iOS 微信分享 朋友圈(2016.3.17) - 王彬分享,越分享,越快乐

一,先配置 1.首先去微信开放平台注册账号(是微信开放平台 不是腾讯开放平台,两者不一样) https://open.weixin.qq.com 注册完成之后记得创建应用,后边会用到.只需要注册就行, 拿到AppID 就行,不用上传app 2.下来我们在 微信开放平台的资源中心中下载sdk 下载完成后 里面有我们需要的工具包 3.接下来我们讲刚才下载的三个工具包拖入我们的项目 拖入后的效果如下: 4.导入我们需要的framwork: 5.接下里 一定记得在 Build Settings->Sea

Android应用加入微信分享

一.申请你的AppID http://open.weixin.qq.com/ 友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID 二.官网下载libammsdk.jar包 http://open.weixin.qq.com/download/?lang=zh_CN 三.将libammsdk.jar复制到工程的libs目录 四.在需要分享的Activity编写代码 private IWXAPI wxApi; //实例化 wxApi = WXAPIFactory.create

一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法

有一段时间没有瞎折腾了. 这周一刚上班萌主过来反映说:微信里面打开聚客宝.分享功能是能够的(这里是用微信自身的js-sdk实现的).可是在android应用里面打开点击就没反应了:接下来狡猾的丁丁在产品群里AT我说:偶们的产品设计不是一直都被技术给反压制住么?真是气死,呵呵.自己刚好有空又有兴趣,于是研究了下.没曾想竟也研究出来了.事后我对整个操作过程整理了下,方便他人也提升自己. 废话少扯.以下上干货. 我的思路是:在点击h5上的分享图标时.触发js事件,在这里面能够对当前设备的操作系统和浏览