现在的主流的互联网应用越来越依赖streaming data来提供用户一些interesting statistics insights。以linkedin为例,最近90天有多少人看过你的linkedin profile。看过你profile的人都是什么job title,他们都在那些公司工作。如下图,你应该如何实现这个功能呢?

相信大家都听说过page view event,就是用户每次打开网站上的某个页面发出来的tracking event,各个大公司一般用这些event来做一些统计分析,business analysis。大家一般会利用一些吞吐量大的分布式消息系统来存储这些event,例如kafka。这是因为对于一些popular的网站,每天可能会有上亿或者10亿的page view event。我们可以利用对这个event的处理来实现我们之前提到的功能。

通常有两种方法可以实现以上的功能,一个是通过hadoop map reduce job,或者更抽象的hive pig query来实现这样的统计功能。但是这个方法有一个明显的劣势,就是处理速度慢,很难做到事实更新。对于我们以上的功能要求或许这个方法没有任何问题,因为我们只关注过去90天的统计信息而且不要求显示当天信息。但是今天我们要探讨另一个实现方法,利用多streaming data processing做到实时统计更新。其实有好多功能是需要事实更新的,例如search index update,twitter或者facebook一些hot topic/trent的发现。

  1. Stream Data Repartition

我们可以通过对streaming data的repartition来实现同一个用户的page view events都聚集到了同一个机器上去处理,这样我们可以做到每个用户的统计数据都是准确的。这个功能基本所有主流的streaming data处理框架都支持,例如,kafka + samza,aws kinesis,storm。

    1. Streaming Data Join

我们可以看到我们需要根据viewer的职位名称或者公司名称来做统计,但是我们的page view event只有viewer的id,没有职位或者公司这些信息,那我们改怎么实现呢?

一个非常简单的思路就是让我们的streaming processor去call profile的api来拿到职位或者公司名称的信息。这样子做有几个非常明显的劣势。1. 如果streaming processor停止工作半个小时或者更长时间,在重启streaming processor的时候由于积累了大量的未处理的events,streaming processor会flood我们之前说过的profile api。2. Streaming processor每次通过network来call另外一个api会增加额外的latency。3. 很难做到online和offline的isolation,因为这个统计功能还是属于offline或者nearline data processing,我们不希望因为这个功能影响了用户查询或者修改profile信息。比如第一个case发生的时候。

另一个思路就是可以加cache,来cache profile的查询request。但是这样子也有一个劣势,如果TTL设的很大,很难做到cache的数据是事实更新的,如果TTL设的特别短,cahe又基本不起什么作用,而且增加额外的network cost。

这里我们介绍一个samza引进的一个新功能,stream joining。我们可以join page view event和profile edit event,然后解决以上两个方案的劣势。我们的stream processor需要同时听两种events(PageViewEvent and ProfileEditEvent),然后对这两种event进行同样的partition both by viewer id,对于profile edit events,我们可以在stream processing机器上建立一个小的数据库来存储profile的实时数据,这样子我们可以对viewer进行快速查询来enrish page view event with viewer job title和company information。然后我们再将enriched的page view event重新partition by user id。然后进行统计。这样子我们就做的了profile数据的isolation,也解决了network call的latentcy cost。

分布式Streaming Data Processing - Samza的更多相关文章

  1. In-Stream Big Data Processing

    http://highlyscalable.wordpress.com/2013/08/20/in-stream-big-data-processing/   Overview In recent y ...

  2. Magnet: Push-based Shuffle Service for Large-scale Data Processing

    本文是阅读 LinkedIn 公司2020年发表的论文 Magnet: Push-based Shuffle Service for Large-scale Data Processing 一点笔记. ...

  3. [翻译]MapReduce: Simplified Data Processing on Large Clusters

    MapReduce: Simplified Data Processing on Large Clusters MapReduce:面向大型集群的简化数据处理 摘要 MapReduce既是一种编程模型 ...

  4. Lifetime-Based Memory Management for Distributed Data Processing Systems

    Lifetime-Based Memory Management for Distributed Data Processing Systems (Deca:Decompose and Analyze ...

  5. 《MapReduce: Simplified Data Processing on Large Clusters》论文研读

    MapReduce 论文研读 说明:本文为论文 <MapReduce: Simplified Data Processing on Large Clusters> 的个人理解,难免有理解不 ...

  6. MapReduce: Simplified Data Processing on Large Clusters 翻译和理解

    MapReduce: Simplified Data Processing on Large Clusters 概述 MapReduce 是一种编程模型,用于处理和生成大型数据集的相应实现.用户定义一 ...

  7. SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)

    最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...

  8. Linux command line exercises for NGS data processing

    by Umer Zeeshan Ijaz The purpose of this tutorial is to introduce students to the frequently used to ...

  9. SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)

    最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...

随机推荐

  1. ToolBarTray与ToolBarPanel的区别

    ToolBarTray 类:表示处理ToolBar 的布局的容器.用于ToolBar控件模板之中. e.g. <ToolBarTray> <ToolBar> <Butto ...

  2. SQL介绍及MySql的安装

    数据库及SQL概念 数据库是按照数据结构存储和组织数据的仓库 结构化查询语言(Structured Query Language)简称SQL MySql:DBMS MySql安装 安装MySql服务端 ...

  3. HOLLOW_BRUSH等价于NULL_BRUSH,都代表透明化刷

    NULL_BRUSH 或HOLLOW_BRUSH和GetStockObject函数 备注:HOLLOW_BRUSH等价于NULL_BRUSH,都代表透明化刷 HGDIOBJ GetStockObjec ...

  4. 在Delphi中编辑res文件

    先用记事本编写一个rc的文件.如内容为:_Comms RCData Comms.jpg Comms.jpg为图片名称,然后在这个rc文件和图片拷贝到delphi安装路径的bin文件夹里面,选中这两个文 ...

  5. Perl Scripts / 脚本

    树状递归列出目录下面子目录和文件 #!/usr/bin/perl #List all files and sub-directories as tree #Under current director ...

  6. Qt4学习笔记 (7) 本篇说一下Qt对于脚本的支持, 即QtScript模块.

    本篇说一下Qt对于脚本的支持, 即QtScript模块. Qt支持的脚本基于ECMAScript脚本语言, 这个东西又是javascript, jscript的基础. 所以, 一般只要学过javasc ...

  7. 静态编译 Qt 5.6

    源码下载 Qt git地址:git://code.qt.io/qt/qt5.git 推荐用 SourceTree 客户端来克隆源码 准备工作 系统 Windows 7 或者 Windows 10 编译 ...

  8. 性别年龄的模块封装类 IDSGenderLeviNamedView

    1 IDSGenderLeviNamedView 的实现效果     2 类的封装方法:   IDSGenderLeviNamedView.h   @interface IDSGenderLeviNa ...

  9. 基于SAP HANA平台的多团队产品研发

    工欲善其事必先利其器.要提高多团队的开发效率,而且还是在SAP HANA平台上,建议大家还是本着“慢就是快”的原则,不要急功近利,在没有准备好团队开发的架构时就匆忙开始功能的开发.匆忙功能开发就算了, ...

  10. 关于web系统整体优化提速总结

    关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要逐步的对系统从整体上进行改造升级,通 ...