基于apache samza,揭秘linkedin架构背后的技术 -pg电子游戏网站

摘要:samza是由linkedin开源的一个分布式流处理系统。近日,linkedin资深sre jon bringhurst发表了一篇博文,揭秘linkedin是如何利用samza与yarn、kafka进行扩展的。
【编者按】是由linkedin开源的一个分布式流处理系统,与之配合使用的是开源分布式消息处理系统apache kafka。很多人会将samza与twitter storm相媲美。近日,linkedin资深(网站可靠性工程师)发表了这篇博文,阐述linkedin是如何利用samza与yarn、kafka进行扩展的。

samza是什么

是一个开源框架,可以帮助开发者进行高速消息处理同时具有良好的容错能力。samza可从kafka中获取消息并进行处理,处理完毕后把结果返回kafka(linkedin自家的分布式消息系统kafka)。一个简易的samza处理过程如下图所示:



尽管samza的设计初衷为不同类型的流处理系统服务,在linkedin中我们对消息流的处理主要使用的还是kafka。所以接下来会先讲述kafka然后再探讨samza。

kafka简述

每天经由kafka进行处理的数据量多达500tb。或许你会想象有个大规模集群来对付如此庞大的数据,实际上不是的。我们实际上使用的是集群图,每个集群图负责处理特定类型的消息。我们透过对不同集群图进行消息镜像处理从而控制集群到集群的消息流向。



针对数据中心可能出现的宕机情况,我们为集群提供了一个拓扑结构,以便数据中心出错离线后继续保持消息的正常流动。每一个数据中心里,我们都会配备一个本地的集群和一个聚合的kafka集群。每个本地集群会穿越数据中心被镜像复制到聚合集群。所以一旦某个数据中心出现异常,我们会转移去另一个数据中心而不造成重大影响。

我们把拓扑结构中的每一个水平层叫做“tier(层)”,tier由各个不同数据中心具相同功能的集群组成。例如在上图中,有一个本地tier和一个聚合tier。

本地tier是所有数据中心中的本地集群的集合,聚合tier是所有数据中心的聚合集群的集合。

此外还有一个离线聚合tier(offline aggregate tier)。production聚合tier会被镜像复制到离线聚合tier进行批处理作业(例如,在hadoop上进行map-reduce作业)。我们可利用它来分离production集群并在不同数据中心里进行批处理作业。



若只配置单个本地集群或单个聚合集群,无疑会置整个集群结构于风险之中;所以我们会把本地集群分割为多个子集群,每个子集群承载不同类型的数据。例如,程序指标和事件追踪数据会被放入不同的集群,不同集群都会有自己的本地集群和聚合集群。尽管kafka能够处理来自单个大型集群所有类型的消息,但是对此进行更细致的划分无疑会减少差错处理的复杂度。

我们还有“pipeline(管道)”的概念。一个pipeline表示的是一个消息从源地址到目的地传输的路径。不同消息会共享公共的pipeline,所以很容易去找出消息的源地址和目的地址。

samza在其中发挥什么作用呢?我们配置了另外的kafka 集群集合为samza作业服务,该集合是从聚合tier镜像复制过来的。每个这样的kafka集群会与一个能运行的集群相连以处理samza作业。



从上图可知kafka和samza使用的是不同的硬件。因为在过去尝试使用同一硬件时,发现samza作业会对kafka的页缓存造成影响。

资源管理

每执行作业时,每个samza作业会连接到yarn的application master api。透过该api,samza可与yarn一起申请资源(容器)为samza作业服务。一旦任务失败,samza作业会与yarn进行协商从而寻找其它的替代资源。

那么该如何在yarn下开启一个 samza作业呢?

首先创建一个samza工程。linkedin有一个对版本进行管理的仓库工具。每当提交工程到该仓库时,linkedin自动化工具会使用hudson来创建新的工程并生成一个samza作业包。一旦作业包在作业仓库服务器工具artifactory上就绪,其它工具会在 同一主机上进行yarn 资源管理器安装。安装文件中的一个脚本会通知yarn从artifactory上下载作业包,并提取文件放入作业的工作目录中,然后启动samza application master。


性能监控

我们使用ingraphs工具来进行性能监控。ingraphs与开源工具graphite非常类似,它有个基于rrd,whisper或influxdb的后端。其性能监视页面如下所示:



由于samza作业关联的性能指标数量庞大,我们会在工具上进行指标的筛选,排除冗余的干扰信息,除非工程师有特殊要求。此外,我们还配有历史数据访问工具和指标警示工具。

多数警示信息都设有上限和下限阀值。如下图所示,如果发现每秒消息数量低于下限100,会触发相应的处理动作(自动调节或发出警示通知)。



我们针对不同的警示信息设定有相应的升级处理机制。例如针对非紧急情况会先通过邮件进行通知,针对重大问题会马上通知网络运营中心。除了samza,我们对硬盘,cpu,内存,网络使用情况都会进行监控。

硬件配置

当我们为kafka代理加入新硬件时,我们会采用标准的linkedin kafka配置进行设置。从目前来看,内存是作业运行中较易出问题的环节。所以对于执行samza作业的服务器节点来说,我们主要关注的是根据核心频率配备合适的ram。下一步我们计划会对网络硬件进行升级。在存储方面,我们基本上采用的是pci-e接口、tb级别的ssd配置。

下一步计划

尽管目前samza运作正常,我们仍不断为规模与稳定两者之间的平衡而努力。其中一个方向是如何对作业和任务进行更好的划分。以上就是我们在linkedin中进行samza部署的回顾与总结。将来我们会不断深化samza的应用,为用户带来更好的用户体验。

英文来自:
  • 大小: 8.5 kb
  • 大小: 21.5 kb
  • 大小: 21.8 kb
  • 大小: 12.5 kb
  • 大小: 23.3 kb
  • 大小: 78.9 kb
  • 大小: 11 kb
来自:
2
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • underscore js工具类,underscore为集合类对象提供了一致的接口

  • 方法一:正则法 function getquerystring(name) { var reg = new regexp('(^|&)' name '=([^&]*)(&|$)', 'i'); var r = window.location.search.substr(1).match(reg); if (r != null) { return unescape(r[2]); } return null; } // 这样调用: alert(getquerystring("参

  • var pageobj={}; var url = decodeuri(location.search); //获取url中"?"符后的字串 ('?modflag=business&role=1') if ( url.indexof( "?" ) != -1 ) { var str = url.substr( 1 ); //substr()方法返回从参数值...

  • test.asp goform test goform test name:"> address:

  • 如何将一个html页面中嵌入另一个html页面将一个html页面中嵌入另一个html页面需要使用到iframe标签。 iframe标签用法: scrolling禁止鼠标滑动,frameborder嵌套页面边框,leftmargin左边距,topmargin上边距 扩展资料: 嵌入页面的几种方法: 一、应用框架技术 在页面中嵌入外部页面的用字符串的方式 var str = '我是页面'; docum...

  • asp文件的执行过程asp文件执行的是怎么一个过程呢?在你从浏览器输入了.asp文件的地址后,浏览器就将这个url请求发给服务器,如果服务器上装了asp,那么它一看到是.asp后缀名,就调用asp,asp读出相应.asp文件,解释执行后,将结果给web服务器,然后,web服务器把结果发给浏览器,用户在浏览器看到的是程序的运行结果。你可以在浏览器调出文件后,单击浏览器中【查看】菜单的“源文件”命令,...

  • underscore是一个非常实用的javascript库,提供许多编程时需要的功能的支持,他在不扩展任何javascript的原生对象的情况下提供很多实用的功能。

  • 概念图 目标 前端在html页面之间传递参数的方法 项目中经常会出现的一种情况,有一个列表,比如商品列表,点击列表中的某一项商品,跳转至详情页面。跳转页面时,我们需要传递一个参数过去,这样我们才能通过这个参数进行数据请求,然后根据后台返回的数据来生成详情页面。因此,通过a标签跳转的方式,肯定是行不通的。  写form表单,提交可以传递参数,除此以外,window.locati...

  • 如何在html静态页面中获取请求参数和参数值(form)?通过location对象的search属性,可以获得从url中传递过来的参数和参数值。然后在javascript 代码中可以处理这些参数和参数值。如下所示:< head>提交数据< /head>< body>地址:北京上海深圳性别:男女< /body>< /html>下面是处理请求...

  • http://gualihuala.pc.ev123.com.cn/gualihuala/vip_doc/3463721.html(转载来源)

  • underscore的_.clone只实现了对象的第一层拷贝,即是浅复制,但是实际有时候需要进行对象的深拷贝。所以这里扩展了一个_.deepclone。如发现代码有不妥之处,欢迎批评指正,谢谢。 var obj = { a: [{x: 1}, {x: {x: [{z: 1}]}}], b: [{y: null}, {y: function() {}}] } var objnull = {

  • url携带参数跳转window.location.href ="demo.html?pack_no=234&pack_id=4sdfwetr235423ew324";js获取传过来的参数//获取url传过来的参数 function getargs( ) { var args = new object( ); var query = location.search.substring(

  • underscore的业务使用场景

  • 网站制作,首先进行开发环境的配置,本实例教程采用 win7 asp access iis; 环境配置包括2部分:iis安装配置、access安装 步骤阅读 工具/原料 一台安装了win7系统的电脑 方法/步骤 1 从开始菜单,打开“控制面板”,如图; 2 点击“程序”中的“卸载程序”,如图; 3 点击左侧的“打开或关闭 window...

  • 在html中接收地址栏中传递的参数方法有如下三种:window.open ("11.htm?aa=" dd);问题就是从11.htm中接收aa的值pg电子游戏网站的解决方案如下:1.使用 window.location.search 来取得后面的参数// param 为 参数的名称function getparameter(param){ var query = window.location.se

  • 一、利用post传值 传值asp文件send.aspx  代码如下 复制代码 &lt;form id="form1" runat="server" action="receive.aspx" method=post&gt;    &lt;div&gt;        &lt;asp:button id="button1" runat="serv

  • html获取页面中的参数

  • 参考文档      http://www.css88.com/doc/underscore/ collection map 类似array.map 但是返回的是对象 filter  返回数组,对于nodelist 返回的是document 节点 every   返回boolean  迭代的列表每个都是true才会返回 true   some  返回boolean 迭代的列表有一个

global site tag (gtag.js) - google analytics
网站地图