汇总:【技术干货】大数据日志分析统计

优采云 发布时间: 2022-10-14 15:14

  汇总:【技术干货】大数据日志分析统计

  作者:罗广,网易高级开发工程师,目前从事分布式视频处理系统的开发和维护工作。曾参与天空手游平台服务器的开发和海康威视交警平台组的平台架构开发和JVM调优。熟悉基于SOA的分布式系统架构设计和Storm Streaming框架。对lucene和solr搜索有丰富的经验,对hadoop和spark有浓厚的兴趣。

  一

  日志概述

  日志来自第三方 CDK 制造商。主要内容是推拉流的日志,包括rtmp推拉流、flv拉流、hls拉流。flv和hls拉流的协议是http,rtmp推流和拉流的协议是rtmp。大致格式如下:

  分析指标为在线数、总时长、总流量(客户端到服务器的流量和服务器到客户端的流量之和)。需要用到的数据也在上图中用红色表示。乍一看可以做distinct和sum,但其实上面的流日志在垂直方面比较一致,在水平方面对比比较大。统计的粒度要求精确到频道和分钟,不能直接从日志数据中获取频道。一个会话中大约有10条RTMP数据(会话ID相同),但只能间接获取2条数据;一条FLV数据代表一个会话,可以轻松获取频道;HLS 数据是客户端' s 主动性首先从服务器获取一条Meta信息,比如可以获取多少条数据信息data,然后继续获取data数据。一个会话可能会产生数以万计的日志记录。

  日志分析特点:数据量大、数据内容格式不同、延迟(只能获取第二天的数据)、细粒度统计(后续可能是5分钟、1小时、日、月、 ETC。)。一天的数据量约4000万,完全不均匀分布在约250个域名上,1个月左右数据量翻倍(取决于新增用户和转化率)。.

  二

  分析过程

  第一阶段:数据模型分析

  采集 CDN 供应商的日志,解析它们,存储在 MySQL 中,并启动分析和统计任务。这个阶段是需求研究,数据模型与数据大小无关。

  阶段 2:数据清洗、MongoDB 存储和 MapReduce

  在模型分析阶段,随着数据量的增加和分析指标的聚合操作,MySQL存储在检索、聚合以及后续的重新聚合已经不能满足系统需求,更换存储势在必行。MongoDB 因其基于文档的存储、简单的 API (JSON)、高性能、方便的集群分片和内置的 MapReduce 功能而成为该系统的替代数据库。网易在MongoDB方面也有比较资深的实战经验。

  

  通过对存储数据的反复分析比较,发现与Uri和Url相关的数据并没有产生任何值,大大增加了存储容量。因此,对原创数据进行清洗,只保留客户端IP、日期、时间、时长、流量等。对结果有影响的字段,记录不符合原日志分析规则的数据,用于后续数据修正。根据不同的协议规则(Rtmp除外),设置其频道ID,方便后续根据频道进行分析。rtmp数据单独存储在一个表中,rtmp数据根据同一个session,同一个channel进行修正。至此,log数据已经被修正到同一个平面,和map、reduce、并编写相关维度的 finalize 函数来执行 MapReduce 计算。作业调度器(schduler)协调管理任务执行单元(worker),根据任务链、任务状态的变化判断是否调度下一个任务。

  三

  整体架构

  即紧接上述第三阶段,在第二阶段的基础上,考虑系统的高可用、分布式、容错等维度,采用去中心化的方案设计,依托RabbitMQ进行横向扩展,增加了对外接口层和任务的手动发布处理。

  1

  集电极

  记录数据采集器(定时),从CDN端获取每个域名对应的数据包下载地址,将后缀相同的域名分类为一个整体,创建作业(Job)。根据下载地址下载日志包(原创数据包用gzip压缩)。在这个过程中,为了防止并发访问过高而被CDN方拒绝,进行了熔断过程,即在规定时间内抑制访问次数。

  获取数据包后,调用linux系统命令gzip命令解压;顺序读取日志文件,如果单个日志文件很大,会用包号分包;这批数据将被 gzip 压缩并扔到 Rabbitmq 中。上面创建了作业。一个 Job 最多对应四个域名,分别创建子 Job。每次下载、解压、数据传输,分别记录状态(启动时间、耗时、失败/成功),方便后续失败任务检测和性能分析。

  2

  工人

  任务执行单元。订阅从rabbitmq获取日志包数据。如果是HTTP协议(上面的hls、flv),先清理数据,然后在java中根据channel维度进行map reduce计算。ip set数据结构使用hashset来ip to 最后将结果存入mongodb;如果使用 RTMP 协议,则更新数据(设置通道),并使用 mongodb 聚合数据。生成的数据格式与HTTP日志一致,方便后续通道聚合操作。聚合操作涉及到细粒度的分析。这里使用了一个小技巧,将日期和时间结合起来,添加了一个字段ymdhm,代表点,这个字段的数据非常离散,大大提高了map reduce的运行效率。.

  MongoDB 中的 MapReduce 相当于关系数据库中的 group by。使用 MapReduce 实现 Map 和 Reduce 两个功能。Map函数调用emit(key, value),遍历采集中的所有记录,将key和value传递给Reduce函数进行处理。本文使用javascript代码编写map和reduce函数,主要处理ip set去重和流量积累。

  3

  调度器

  

  worker执行调度器,负责记录每个子任务的状态,判断子任务是否完成。如果执行完成,则从作业链中获取下一个子任务的队列,扔到rabbitmq中供worker消费。此外,还包括失败任务检测,轮询当日任务列表,判断任务是否完成。如果有任务执行失败,它会从分析表中抓取数据扔到临时集合中,再次进行聚合分析,最后将结果归档。

  4

  mongodb

  MongoDB的版本是3.0.1,对应的java客户端是mongo-java-driver3.0.1。在高可用方面,使用了官方推荐的主从复制和高可用方案Replicat Set。Replicat Set 具有自动切换功能。当Primary挂掉时,可以由Replica Set中的Secondary自动切换到Primary,实现高可用。目的。比如配置了一个由3台服务器组成的mongo集群,1主2副,客户端连接时需要写入所有IP,并设置读操作从副本集读取,实现主从分离,减少主节点的访问压力。

  5

  兔子MQ

  为了确保消息不丢失,RabbitMQ 支持消息确认。消费者发送消息回复,告诉 RabbitMQ 在 RabbitMQ 可以将其删除之前,该消息已被接收并处理。如果一个消费者宕机了,没有发送响应,RabbitMQ 会理解该消息没有被完全处理,然后将其交给另一个消费者重新处理。这样,所有依赖 RabbitMQ 的节点都不会丢失消息,保证了整个分析过程的完整性。没有任何消息超时限制,RabbitMQ 只会在消费者宕机时重新投递,即使处理一条消息需要很长时间。

  镜像队列是 RabbitMQ 高可用的一种。队列中消息的每个节点都会有一个副本。在单个节点故障的情况下,整个集群仍然可以提供服务。但是,由于数据需要在多个节点上进行复制,因此系统的吞吐量会降低,而可用性会提高。在实现机制上,镜像队列内部实现了一套选举算法。有一个master和多个slave。队列中的消息主要是master。对于发布,您可以选择要连接的任何节点。如果节点不是rabbitmq中的master,就会转发给master。master将消息发送给其他slave节点,然后将消息本地化,并多播复制消息到其他节点进行存储;对于消费者来说,可以选择任意节点连接,消费请求会转发给master。为了保证消息的可靠性,消费者需要确认ack。master收到ack后会删除消息,ack消息是同步的(默认异步)。) 向其他节点删除从节点消息。如果master节点出现故障,镜像队列会自动选举一个节点(slave中消息队列最长的那个)作为master作为消息消费的基准;如果从节点发生故障,镜像队列集群中其他节点的状态不需要改变。消息将被删除,确认消息将是同步的(默认异步)。) 向其他节点删除从节点消息。如果master节点出现故障,镜像队列会自动选举一个节点(slave中消息队列最长的那个)作为master作为消息消费的基准;如果从节点发生故障,镜像队列集群中其他节点的状态不需要改变。消息将被删除,确认消息将是同步的(默认异步)。) 向其他节点删除从节点消息。如果master节点出现故障,镜像队列会自动选举一个节点(slave中消息队列最长的那个)作为master作为消息消费的基准;如果从节点发生故障,镜像队列集群中其他节点的状态不需要改变。

  镜像队列使用起来比较简单。先将当前节点加入之前已经启动的RabbitMQ节点,然后设置HA策略。下图为镜像节点的启动脚本:

  镜像节点设置成功后,可以看到整个集群的状态。

  四

  健康

  在线部署一共7台服务器,包括2台云主机,每台4核8G,部署schduler、collector和rabbitmq;3台云主机,每台4核8G,部署mongodb Cluster Replica Set;2台云主机,每台8核32G,部署16个Worker实例,4000万数据,20分钟完成分析。

  汇总:内容采集

  爬虫:用于搜索,但搜索的内容仍然在原来的网站、主动、智能

  采集:将其他网站放在您的网站上

  网站首页相当于入口,入口下有很多一级分类,首页是上下层的关系。分类是分层的

  网站内容体系结构:

  

  首先确定抓取范围:首先分析网站的内容结构;例如:抓取整个堆栈的数据 - 然后使用网站主页作为入口

  网站内容结构:首页下为一级分类

  ,而下一级分类就是二级分类

  内容爬网过程:

  门户是一个列表页

  

  要使用 Java 程序进行解析,必须首先获取页面的 html 代码

  如果你想获取数据,你必须首先分析网址是什么样的

  关于提取:HTML 解析类库:日功和小数

  1,jsoup

  前提条件:没有第三方类库自动帮我做到这一点,用纯Java系统类库做吗?

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线