axure9数据统计插件_WMDA:大数据技术栈的综合实践

一、概述

WMDA是58自主开发的用户行为分析产品,同时也是一款支持无埋点的数据采集产品,只需要在第一次使用的时候加载一段SDK代码,即可采集全量、实时的PC、M、APP三端以及小程序的用户行为数据。同时,为了满足用户个性化的数据采集需求,在无埋点之上,WMDA又提供了手动埋点的数据采集方式。

WMDA支持的统计、分析功能主要包括:

  • “概览”和“实时”模块用来监控网站的流量情况;
  • “圈选”定义重要的指标;
  • “单图”和“看板”可以统计不同维度、时间下指标的页面访问量和用户量等数据;
  • “漏斗”和“智能路径”用于分析不同指标下的转化率;
  • “留存”可以基于不同维度、分群来考察网站的用户流失率,分析用户的忠诚度;
  • “用户细查”和“用户分群”用于分析所关心条件下的用户群体以及相关的用户行为明细。

以上简单的介绍了WMDA功能模块,接下来侧重于WMDA数据端的架构以及相关大数据技术栈的实践。

二、架构设计

在架构上,WMDA遵循标准的数据分析模型,将整体的架构分成数据采集、数据传输、数据建模/存储、数据统计/分析和数据可视化五个部分。架构如下图所示:

75fb11e53cc359b2b557d64165852e74.png

数据采集:58的业务方覆盖PC、M、APP三端以及小程序。WMDA在数据收集阶段为PC、M、H5、提供SDK完成数据采集,在APP端提供IOS SDK和Android SDK完成数据采集,小程序也有相应的SDK来完成数据采集。

数据传输:主要包括数据收集服务完成前端上报数据的信息补全、脏数据过滤、设备标识等,最后将数据格式化之后落地存储,通过Flume收集到Kafka中,完成实时总线和离线总线的拆分。

数据建模/存储:后端收集上来的数据经过ETL的清洗,将上报的数据格式化之后保存在HDFS上,供后续分析使用。同时Kafka分发一份数据到Spark Streaming中,进行实时数据分析。

数据统计/分析:除了Spark Streaming的实时分析外,落地到HDFS上的数据在Kettle的调度下,由OLAP子系统、Bitmap子系统、分群计算子系统、智能路径计算子系统完成单图、漏斗、留存、分群、智能路径的最终计算。

三、实时分析系统

实时分析系统用于解决用户监控网站、APP实时流量需求,采用SparkStreaming+Druid来实现。实时ETL程序中设置5s为Spark Streaming处理批次间隔,同时将圈选配置信息在实时ETL程序中定义为广播变量,完成指标id的实时匹配,最后将数据通过缓冲kafka摄入到Druid中。

d86260b242dbdd8ea4520fef2049cd46.png

四、离线分析系统

离线分析系统主要完成单图、漏斗、留存、智能路径、分群等数据分析工作,是WMDA的核心组成,也是数据建模/存储,数据统计/分析的具体实践。

基础数仓:使用HDFS作为存储系统,DW+DM+DA是标准的数据中台角度的数仓分层,同时基于基础事件模型(Event)搭建基础数仓。

Hive:完成基础数仓的核心ETL。

Spark+ETL:完成数据圈选规则匹配、脏数据的过滤和标准日志格式化。

离线计算集群:包括OLAP系统、Bitmap计算系统、分群计算系统、智能路径计算系统,主要完成单图、漏斗、留存、分群、智能路径相关计算工作。

Kettle:负责离线计算集群的调度。

TaskServer:任务执行系统,负责执行由Kettle调度的Hive sql任务、MapReduce任务。

数据服务接口层+回溯接口层:供可视化服务获取数据和指标变更回溯任务的触发。

离线计算逻辑复杂,保证系统容错性尤为关键,WMDA离线和实时数据系统都遵循Lambda架构,保证了系统较好的容错特性。

b21f5f2cf2a27537d598ed7a4c6da2fe.png

4.1 基于Kettle的任务调度系统

Kettle是基于java开源的ETL工具集,可以在windows、Linux、Unix上运行,数据抽取高效稳定。通过可视化界面设计ETL流程,无需代码去实现。在Kettle中,有两种基本的脚本文件job和transformation,job是完成整个工作流的控制,transformation完成针对数据的基础转换。在job下的start模块,有一个定时功能,可以每日、每周等方式实现对ETL任务的定时调度。

Kettle体系结构分为Kettle平台、各类插件,其中Kettle平台是整个系统的基础,包括UI、插件管理、元数据管理和数据集成引擎。UI显示Spoon这个核心组件的界面,通过xul实现菜单栏、工具栏的定制化,显示插件界面接口元素。元数据管理引擎kjb、ktr以及一些元数据信息,插件通过该引擎获取基本信息。插件管理引擎主要负责插件的注册。数据集成引擎负责调用插件,并返回相应信息。

Kettle是众多“可供插入的地方”(扩展点)和“可插入的东西”(扩展)共同组成的集合体。在Kettle中不管是以后的扩展还是系统集成的功能,本质上都是插件,管理的方式和运行机制是一致的。系统集成的功能也均是实现了对应的扩展接口,只是插接的方式略有不同。

Kettle的扩展点包括step插件、job entry插件、Database插件、Partioner插件、debugging插件等。

c7a90ba3392b8e8325324f3cd50a4516.png

在Kettle中一个job代表ETL控制流中的一项逻辑任务。Job会按照连线的方式顺序执行,每个job产生一个执行结果,作为其他分支上job的条件。同时数据会从一个entry组件传递到另一个entry组件,并在entry组件中进行相应的处理。

d2bbac43e276da14445c03ca170dddc7.png

在Kettle负责调度各个子计算系统ETL任务的同时,TaskServer负责任务的执行,这样使得任务的调度与任务的执行完全分离,方便任务的管理以及任务执行的灵活性。在Kettle中集成TaskSever相关的组件,需要关注Kettle中的两个接口:JobEntryInterface和JobEntryDialogInterface。JobEntryInterface是Job Entry插件的主要实现接口,主要的功能如下:

  • 保存Job Entry设置

实现类使用私有变量保存设置的参数,通过get、set方法获取和设置。Dialog实现类会通过这些方法设置界面上的参数。同时,需要提供一个深度拷贝的方法,在保存的参数被修改时进行调用。

  • 序列化插件
  • 输出信息提供

一个Job Entry支持三种类型的输出:true、false和无条件。这三种情况不是所有的Job Entry都会同时支持,例如dummy job entry仅支持true和false。通过JobEntryInterface接口的evaluates()方法可以设置一个Job Entry的输出结果是否支持true和false,isUnconditional()方法则是设置是否支持无条件执行。

  • 执行任务

JobEntryDialogInterface接口负责构建和打开参数设置对话框。

4.2 基于TaskServer的任务执行系统

TaskServer是一个高可用的、可扩展性强的分布式任务执行系统。整体架构采用Master-Slave的设计模式,支持横向扩展,兼备资源隔离、服务容灾等功能,为线上任务的运行提供可靠的执行环境。WMDA各个子计算系统中的Hive sql和MapReduce都在TaskServer上执行,极大的确保WMDA离线任务的稳定性。

TaskServer主要包括三个部分:JobTracker集群、TaskTracker集群和Zookeeper集群。

  • JobTracker:负责任务接受、资源计算和任务分配。
  • TaskTracker:负责任务执行和保持心跳。
  • TaskQueue:任务队列。
  • Zookeeper:协同调度。

在JobTracker中主要是资源的计算和任务分发,一个任务被提交之后会由JobTracker中的任务分发器(Dispatcher)发给对应的事件处理器(EventHadler),事件处理器完成之后会将任务相关的元数据信息写入到Zookeeper中。TaskTracker监听并拉取Zookeeper中新增的任务信息,抽象成TaskRunner放到线程池中运行,同时TaskTracker中任务调度器(TaskScheduler)跟JobTracker保持心跳用来更新机器信息。如果JobTracker监听到某一个TaskTracker宕机会重新进行任务分配,由其他的TaskTracker来执行。资源的隔离方面,TaskTracker中采用硬性资源划分机制和分时资源扩容机制。硬性资源是指资源被某种方式划分之后,就只会接受这一类任务。在TaskServer中就为WMDA的任务划分出来了WMDA Tier,只服务于WMDA提交的任务。分时资源扩容是指可以按照不同时间段来分担其他Tier的任务。比如,在9点到10点是WMDA任务量的高峰,划分的WMDA Tier不足以满足当前任务所需要的计算资源,此时利用分时资源扩容机制从Share Tier中扩容一些Tier来满足当前任务对计算资源的需求。

1ec0157f204ce67475aa2adada587afa.png

4.3 Druid在OLAP计算系统的实践

WMDA中主要涉及OLAP场景模块有概览、单图、即席圈选7日数据预览、热图、维度阅览以及用户行为统计。OLAP引擎在选择上尝试过kylin和Druid。Kylin采用预计算,因为数据已经提前计算好,所以在前端查询展示的时候相对较快。但是,因为WMDA支持多个维度任意组合,所以采用Kylin需要根据不同组合情况进行计算,这就使得随着维度的增加,计算量增大。Druid则需要根据查询条件即时计算,查询相比Kylin慢,但是优化后基本在1秒以内。WMDA最终基于Druid实现OLAP模块,其包括的角色有:

  • Real-Time Nodes:负责实时数据处理;
  • Historical Nodes:负责加载非实时窗口内满足加载规则的所有历史数据Segment;
  • Coordinator Nodes:负责Druid集群中Segment的管理与发布,包括加载新Segment,丢弃不符合规则的Segment,管理Segment副本以及Segment负载均衡;
  • Broker Nodes:整个集群的查询入口,提供查询路由和结果组装;
  • Indexing Service:负责“生产”Segment的高可用、分布式、Master/Slave架构服务。
d2577dc844d9e0feccc3e113c79afb26.png

Druid将数据的索引节点划分为HistoricalNodes和Real-Time Nodes,切割了历史数据的加载与实时流数据处理,因为二者都需要占用大量内存与CPU;另一方面,划分Coordinator Nodes和Broker Nodes,切割了查询需求与数据如何在集群内分布的需求,确保用户的查询请求不会影响数据在集群内的分布情况。

在时间窗口内的数据会停留在Real-Time Nodes内存中,而时间窗口外的数据会组织成Segment存储到Deep Storage中;批量数据经过Indexing Service也会被组织成Segment存储到Deep Storage中,WMDA使用HDFS作为Druid的Deep Storage,同时Segment的元信息都会被注册到元信息库中,Coordinator Nodes会定期(默认为1分钟)去同步元信息库,感知新生成的Segment,并通知在线的Historical Node去加载Segment,Zookeeper也会更新整个集群内部数据分布拓扑图。

当用户需要查询信息时,会将请求提交给Broker Nodes,BrokerNodes会请求Zookeeper获取集群内数据分布拓扑图,从而知晓请求应该发给哪些Historical Nodes以及Real-Time Nodes,汇总各节点的返回数据并将最终结果返回给用户。

4.4 Bitmap计算系统在WMDA中的实践

Bitmap是漏斗、留存和分群数据分析中,用来较快计算满足某些条件下用户数量的数据结构。Bitmap计算系统分为Bitmap计算模块和Bitmap检索模块,Bitmap计算模块通过MapReduce从基础日志中计算出指标Bitmap、维度Bitmap和分群Bitmap,并提交至WTable中。Bitmap检索模块则是通过BitMapEngine查询出符合查询条件的用户包。

2c749260f2d88604c20f5993cb347eb3.png

五、总结

本文主要阐述了WMDA数据端的架构设计,主要从数据采集、数据计算、数据应用、调度系统等方面逐一进行了介绍。当然,大数据处理相关的架构以及技术选型并不是本文介绍的这一个方向,好的架构应该是根据具体的业务来设计的,而且是随着业务的拓展不断演变的。


欢迎大家关注“58架构师”微信公众号,定期分享云计算、AI、区块链、大数据、搜索、推荐、存储、中间件、移动、前端、运维等方面的前沿技术和实践经验。

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

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

相关文章

Java Collections unmodifiableCollection()方法与示例

集合类unmodifiableCollection()方法 (Collections Class unmodifiableCollection() method) unmodifiableCollection() method is available in java.util package. unmodifiableCollection()方法在java.util包中可用。 unmodifiableCollection() method is used to get an un…

openfoam安装中出现allmake error_如何更新OpenFOAM的版本?

这是协作翻译的第四章,翻译完感觉挺有意思的,分享给大家一起看看。4.更新OpenFOAM版本4.1 版本管理OpenFOAM以两种不同的方式分发。一种方式是使用Git仓库下载的仓库版本。仓库版本的版本号由附加的x标记,例如 OpenFOAM2.1.x。该版本会经常更…

java 根据类名示例化类_Java类类的requiredAssertionStatus()方法和示例

java 根据类名示例化类类的类requiredAssertionStatus()方法 (Class class desiredAssertionStatus() method) desiredAssertionStatus() method is available in java.lang package. requiredAssertionStatus()方法在java.lang包中可用。 desiredAssertionStatus() method is …

python中计算排列组合的函数_Python实现的排列组合计算操作示例

本文实例讲述了Python实现的排列组合计算操作。分享给大家供大家参考,具体如下:1. 调用 scipy 计算排列组合的具体数值>> from scipy.special import comb, perm>> perm(3, 2)6.0>> comb(3, 2)3.02. 调用 itertools 获取排列组合的全部…

java日历类add方法_Java日历setMinimalDaysInFirstWeek()方法与示例

java日历类add方法日历类setMinimalDaysInFirstWeek()方法 (Calendar Class setMinimalDaysInFirstWeek() method) setMinimalDaysInFirstWeek() method is available in java.util package. setMinimalDaysInFirstWeek()方法在java.util包中可用。 setMinimalDaysInFirstWeek(…

相同布局在不同手机上显示不同_不懂响应式,不同尺寸屏幕下的页面很难达到最佳效果...

让用户在不同设备和尺寸的屏幕下看的页面显示效果更佳,屏幕空间利用更高,操作体验更统一,交互方式更符合习惯。本文主要围绕什么是响应式,如何搭建响应系统,响应式网站解析 三个部分进行阐述,在项目中提前定…

Java ByteArrayInputStream markSupported()方法与示例

ByteArrayInputStream类markSupported()方法 (ByteArrayInputStream Class markSupported() method) markSupported() method is available in java.util package. markSupported()方法在java.util包中可用。 markSupported() method is used to check whether this ByteArrayI…

markdown 流程图_测试了12款Markdown编辑器,推荐一个最好用的!

有很多喜欢写博客的小伙伴问我,这个代码笔记的格式怎么弄的简洁又好看,虽然csdn里面有Markdown的书写模式,但是我还是想推荐一款比较好用的写笔记的编辑器 - Typora。相信很多小伙伴都在使用吧,这个一直是我最喜欢的 markdown 编辑…

小程序 || 语句_C ++条件语句| 查找输出程序| 套装2

小程序 || 语句Program 1: 程序1&#xff1a; #include <iostream>#include <stdio.h>using namespace std;int main(){int num 0;num printf("%d ", printf("%d ", printf("ABC")));if (num 2) {cout << "INDIA&quo…

python爬取天气预报源代码_python抓取天气并分析 实例源码

【实例简介】Python代码抓取获取天气预报信息源码讲解。这是一个用Python编写抓取天气预报的代码示例&#xff0c;用python写天气查询软件程序很简单。这段代码可以获取当地的天气和、任意城市的天气预报&#xff0c;原理是根据url找到网站截取相应的数据展现。python抓取广州天…

Linux编译程序源码环境,Linux下对nodejs环境进行源码编译并部署云应用

Node 是一个让 JavaScript 运行在服务端的开发平台&#xff0c;它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。该环境安装非常简单&#xff0c;这里简单记录下linux(centos环境下)的源码安装&#xff0c;做个记录。平台&#xff1a;centos 6…

endswith方法_带有示例JavaScript字符串endsWith()方法

endswith方法字符串endsWith()方法 (String endsWith() Method) endsWith() method is a string method in JavaScript, it is used to check whether a string ends with a specified substring or not. EndsWith()方法是JavaScript中的字符串方法&#xff0c;用于检查字符串是…

mysql多行合并成一行_数据文件合并与拆分

在数据处理业务中&#xff0c;经常要把文件结构相同或近似相同的数据文件合并成一个文件&#xff0c;或者将一个比较大的数据文件拆分成小的数据文件。本文将介绍文本文件和 Excel 文件合并及拆分会遇到的几种情况&#xff0c;并提供用 esProc SPL 编写的代码示例。esProc 是专…

日期setMinutes()方法以及JavaScript中的示例

JavaScript日期setMinutes()方法 (JavaScript Date setMinutes() method) setMinutes() method is a Date class method, it is used to set the minutes to the Date object with a valid minutes value (between 00 to 59). setMinutes()方法是Date类的方法&#xff0c;用于将…

suse linux增加新磁盘分区,Virtualbox中Linux添加新磁盘并创建分区

引言&#xff1a;我们常常在使用系统的时候突然发现&#xff0c;哎呦~~~我们的磁盘空间不够用啦&#xff01;我遇到常见的就是数据库数据暴增&#xff0c;预留的空间没有啦&#xff0c;只好新添加磁盘&#xff0c;在VB虚拟机上就可以实现&#xff0c;往往苦于没有图文并茂的好资…

Java SecurityManager checkMemberAccess()方法与示例

SecurityManager类的checkMemberAccess()方法 (SecurityManager Class checkMemberAccess() method) checkMemberAccess() method is available in java.lang package. checkMemberAccess()方法在java.lang包中可用。 In checkMemberAccess() method we access public members …

arcgis字段计算器无法赋值_Arcgis空间连接工具的妙用

​Arcgis功能真的无比强大&#xff0c;读书时一般只会用到一些常见的&#xff0c;工作后挖掘了很多新功能&#xff0c;数据处理效率大幅提升&#xff0c;个人觉得arcgis是最强大最好用的gis软件&#xff01;本节给大家分享下空间连接功能的两个妙用。空间连接功能很多giser应该…

linux重装hal服务安装,linux ubuntu 安装微信客户端

下载(我的系统是32 位的)rootmarhal:/opt# wget https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/linux-ia32.tar.gz解压rootmarhal:/opt# tar xvf linux-ia32.tar.gz下载微信图标移动到解压目录rootmarhal:/home/marhal/下载# mv wechat.ico /opt/e…

currency abap_Java Currency getDefaultFractionDigits()方法及示例

currency abap货币类getDefaultFractionDigits()方法 (Currency Class getDefaultFractionDigits() method) getDefaultFractionDigits() method is available in java.util package. getDefaultFractionDigits()方法在java.util包中可用。 getDefaultFractionDigits() method …

python爬虫自动更换ip_Python 爬虫使用动态切换ip防止封杀

对于爬虫被封禁 &#xff01; 爬虫一般来说只要你的ip够多&#xff0c;是不容易被封的。 一些中小网站要封杀你&#xff0c;他的技术成本也是很高的&#xff0c;因为大多数网站没有vps&#xff0c;他们用的是虚拟空间或者是sae&#xff0c;bae这样的paas云。 其实就算他们不考虑…