当前位置: 首页 > article >正文

- 当数据遇上AI,Twitter的数据挖掘实战(二)

你好我是程序员贵哥。在上节课里我们一起了解了Twitter整体搭建数据系统的经验。不过那一篇论文的主要内容还是在方法论上一旦我们想要把这个方法论利用到我们当下就在搭建的数据系统里就有些无从下手的感觉。不过好在Twitter还发表了很多有着具体实战经验的论文。那么今天我就请你一起来学习下《The Unified Logging Infrastructure for Data Analytics in Twitter》这篇论文。在这篇论文里Twitter一点儿都没有藏私而是给出了大量具体的实践技巧你完全可以用“抄作业”的方式把里面的做法用到自己的系统里。事实上在我之前搭建的大数据系统中就从里面吸取了大量的经验。希望在学习完这节课之后你可以直接把所看到的具体实战方法用到实践中去。无论是对你现在已有的系统进行对照改进还是在建设新系统的时候把Twitter的方法作为模版都是一个不错的选择。统一的用户行为日志和元数据管理上节课我们就说过Twitter为了减少碎片化的日志文件和日志格式最终在内部启动了一个项目统一从客户端的视角来记录用户行为日志。这个日志的格式自然是通过Thrift的Schema来定义的。而有了这个日志之后所有的工程师和数据分析师都可以在一个共识下工作。大部分的数据分析工作也不再需要大量的Join操作先把数据在Hadoop上搬运一遍。那么我们就先来看看这个统一的日志格式长什么样子。首先Twitter把用户在Twitter内的所有用户行为拆分成了一个固定的6个层级的结构Twitter称之为Click Events。这6个层级分别是来自于什么客户端client是客户端里的哪一个页面page是页面里的哪一个Tab页section是Tab页里的哪一个组件component是组件里的哪一个元素element以及针对这个元素用户的动作action是什么。要注意这里把这种日志叫做是Click Events并不是说我们只是记录用户的点击行为而是包含了所有的用户行为、特定信息的展示或许用户只是将鼠标Hover在某个UI元素上同样会记录Click Events。这个Click Events里面的action就是Impression或者Hover。我们可以来看一个具体的例子。用户使用Web访问Twitter在主页的Mentions这个Tab里的信息流里点击了某个头像来获取Profile信息这个事件就可以通过web:home:mentions:stream:avatar:profile_click来定义。而为了确保全员有一个统一的命名习惯Twitter规定了使用下划线“_”来作为单词的分割而不允许采用其他命名方式比如驼峰命名法。在有了这样一个日志格式之后任何一个工程师或者数据科学家都可以很容易地定位到自己想要统计和分析的特定用户行为。而且因为整个用户行为的结构是层级化的我们可以很容易地通过通配符找到特定类型的行为。比如通过web:home:mentions:*;我们就可以找到用户在Web端访问Mentions的Timeline里面的所有行为或者可以通过*:profile_click就能找到所有客户端里所有流程里用户点击Profile的行为。事实上Twitter内部有一个叫做Oink的程序会按照层级每天自动运行统计出各个层级Schema下的事件数量。而这些数据会直接展现在内部的Dashboard里方便我们一眼就能看到系统的整体数据。我把对应统计的层级Schema放在了下面你可以去看一下。(client,page,section,component,element,action)(client,page,section,component,*,action)(client,page,section,*,*,action)(client,page,*,*,*,action)(client,*,*,*,*,action)Twitter会预先自动给出整个层级结构里各个层级的事件统计数量。当然日志里不光有事件类型Twitter的Click Events里还会包含两部分类型的信息一部分是标准的字段所有的日志都有包括前面这里的event_name以及event_initiator、user_id、session_id、ip、timestamp这些字段在任何日志里都是必不可少的。而对于每个事件可以独有的信息Twitter则是通过一个event_details的字段用key-value对的形式存储下来。这个event_details字段就使得不同团队需要的额外信息可以有一个统一存放的地方但是同时不会去影响我们统一的日志的整体格式。只统一了日志格式还不够在这个6个层级的日志结构下其实这6个层级可能出现的“值”是很多的。比如我们到底有多少个不同的“UI元素”呢在一个系统每天都在不断迭代的团队里其实我们是很难知道这一点的。传统的通过文档记录来传递这些信息的方式往往也是无效的等我们记得把UI元素可能出现的值记录下来的时候某一个值可能已经废弃并不再出现了。而Twitter的做法也很简单就是直接根据现有的数据反向找出它实际会出现哪些值提供给大家来标记每一个值是什么含义。我们前面不是已经按照6个层级一一统计了事件的统计数据吗自然我们也可以统计6个层级结构下每一个值会有哪些不同的情况出现。Twitter直接把这个基于数据反向统计出来的事件层级树状图做成了一个可展开的Web界面。工程师和数据科学家可以直接搜索这个事件树也可以在具体出现的值上加上Comments记录这个字段值是什么意思把信息共享出来。以“事实数据”本身快速生成文档而不是依赖人工去维护文档能够大大提升我们的工作效率。巧妙利用Unicode和正则表达式不过Click Events只能方便我们做一些描述性的统计信息。而在实际的数据分析中很多时候我们重视的是特定的用户行为模式pattern。我拿电商网站来举个例子。我们常常会去做漏斗分析看用户在浏览商品—加入购物车—进入支付—填写地址到最终支付完成的整个环节里每一个步骤的统计数据他们分别是在哪一个步骤流失的。而且我们也需要经常根据不同的需求重新定义整个漏斗环节。比如新上了一个新年促销的营销活动我们就要去看这个营销活动的漏斗分析的数据。根据用户的一个个Session去分析特定的行为模式这个在用户行为日志的分析里是一个非常高频的动作。当然我们有原始的Click Events就可以写一段Java程序或者一个复杂的Pig脚本或者SQL来完成分析。不过这样我们每一次的工作显然没有被“复用”起来而且每一个脚本都需要根据用户的标识去Join大量的数据。而Twitter采取了一个非常巧妙的方式来解决了这个问题。首先它用了一个数据处理程序把所有的用户行为串成了一个个的用户Session。然后它并没有简单地把原始的数据存储下来而是对数据进行了“信息压缩”。Twitter把每一个web:home:mentions:stream:avatar:profile_click这样的事件名称映射到了一个Unicode的字符串。然后整个Session里把用户按照时间先后顺序进行的这些事件组合在一起就是一个长字符串叫做session_sequence。于是一个用户Session就可以简化成一条日志里面会包含这些字段user_id也就是标识哪一个用户session_id也就是标识是哪一个sessionip也就是用户访问时的ip地址session_sequence也就是代表了用户顺序执行的一系列动作duration也就是这个session的时长。有了这个session_sequence我们的漏斗分析就非常简单了。我们只需要通过一个简单的正则表达式就能定义出一个用户特定的行为流。比如我们用 i 代表用户浏览了单个商品a 代表用户把商品加入了购物车。那么通过正则表达式.*i.*我们就能找到所有浏览过单个商品的session通过.*i.*a.*就代表了先浏览过商品再把商品加入过购物车的session。两个数据一比较我们的漏斗数据就计算出来了。而因为正则表达式的灵活性我们不需要预先定义要分析什么样的漏斗而是可以在需要的时候写个正则表达式就完事儿了。并且在实践中Twitter封装好的Pig UDF让你把这一步也省下了你只要自定义一系列的事件流就能快速查找符合这个执行顺序的Session以及他对应的漏斗。defineFunnelClientEventsFunnel(‘$EVENT1’ ‘$EVENT2’,...);你可以通过一个UDF定义一个你想要分析的漏斗。(0,490123)(1,297071)...这个Funnel的计算结果就是这个事件流的每一层漏斗剩下的session数量。而且这个数据还能够直接拿来进行机器学习的建模。我们完全可以把这样按事件顺序发生的序列通过马尔可夫链或者类似的时序分析方案来进行建模去预测在什么样的用户行为之后会发生什么样的用户行为。这样我们去进行预测类的机器学习建模也只是一个Pig脚本的事情了。方便debug很重要除了统一的日志格式和预先生成的session_sequence之外我们还经常会遇到的一类问题是通过日志debug在线上遇到的各种问题。通过日志进行生产环境的debug是最常见的需求之一。但是对于原始的Click Events日志来说想要找到特定的日志虽然容易但是开销很大。我们想要找到特定的日志其实并不麻烦通过Pig写个脚本加上我们需要的筛选条件跑一下就能找到这样的日志。但是因为每一个Pig任务都是在完整地扫描一遍日志这个开销可不小。而且在debug的过程中这个是一个交互式的过程。我们可能先写了一个筛选条件然后查询到了一部分日志但是这些日志可能并不符合我们的需要。于是我们又变化了一下筛选条件这样就要再完整地扫描一遍日志。可能为了调查一个小小的线上问题我们把数十TB的原始日志扫了又扫如果算算实际的硬件开销那可绝对小不了。Twitter的解决办法也很简单那就是为日志文件生成索引。不过这个索引和关系数据库不一样它不是到每一条的日志这个级别的而是到每一个Block级别。Twitter的日志是用LZO的压缩算法压缩的它的索引也只是确认特定字段的值是否在整个Block中出现过。这样索引的尺寸可以大大减少毕竟如果把每一条日志所在的位置都建立索引那么索引的尺寸可能就和日志一样大了并起不到减少开销的作用。而有了这个索引文件以后我们就可以在查询特定日志的时候通过索引大幅度减少需要扫描的数据。事实上Twitter专门开源了一个叫做elephant-twin的项目。你只要在Pig脚本中加载索引、对应的MapReduce任务它就会自动只读取索引找到的对应Block从而就减少了需要扫描的数据。在实践过程中我还这样做过。我们干脆直接基于特定字段的索引比如user_id提供了一个在线查询特定用户行为的日志的内部站点。通过这个站点数据科学家们能够直接观察用户的行为模式来寻找灵感。虽然这样的服务需要用户对于HDFS进行随机访问其实并不符合HDFS设计的数据访问模式。但是因为并发量很小对于HDFS并不会造成什么压力。其实这样的技巧、方法和工具在大数据领域非常实用能够大大提升我们解决问题的效率。小结通过这节课的学习我们其实可以看到在优秀的基础设施、杰出的团队理念之后一个基于用户行为日志的大数据系统是怎么落到实处的。在数据处理层面Twitter通过统一格式的、层级化的日志使得日常的描述性数据分析变得非常容易这可以大大缩减新人想要使用系统的上手成本。通过对数据进行预处理变成session_sequence并将一个个事件映射成UnicodeTwitter使得基于用户时序行为的分析也变得非常容易。无论是进行漏斗分析还是用户建模都变成了简单Pig脚本可以完成的事情。进一步地为了方便系统开发人员排查问题Twitter还为处理完的日志建立了索引。这就让我们在海量日志中进行一些debug工作和特定案例的分析也变得特别容易了。希望通过这节课你能够一窥Twitter这样公司的内部数据分析系统具体是怎么样的。这也是大量工程师在实践过程中找到的一系列最佳实践。如果你刚开始为你的团队和产品搭建大数据体系完全可以依样画葫芦地实践一遍。

相关文章:

- 当数据遇上AI,Twitter的数据挖掘实战(二)

你好,我是程序员贵哥。 在上节课里,我们一起了解了Twitter整体搭建数据系统的经验。不过,那一篇论文的主要内容还是在方法论上,一旦我们想要把这个方法论利用到我们当下就在搭建的数据系统里,就有些无从下手的感觉。 …...

Qwen-Image-Edit-F2P人脸生成教程:多角度人像生成策略与camera参数模拟技巧

Qwen-Image-Edit-F2P人脸生成教程:多角度人像生成策略与camera参数模拟技巧 想用AI生成一张完美的人像照片,但总感觉角度单一、表情呆板?或者想为虚拟角色创建一套不同角度的形象参考图,却苦于没有专业摄影设备?今天&…...

PyEMD:Python信号处理的终极分解工具,5分钟快速掌握经验模态分解

PyEMD:Python信号处理的终极分解工具,5分钟快速掌握经验模态分解 【免费下载链接】PyEMD Python implementation of Empirical Mode Decompoisition (EMD) method 项目地址: https://gitcode.com/gh_mirrors/py/PyEMD 在数据分析和信号处理领域&a…...

Qwen3-VL-WEBUI部署指南:Docker环境搭建+模型加载+WebUI访问全解析

Qwen3-VL-WEBUI部署指南:Docker环境搭建模型加载WebUI访问全解析 1. 环境准备与快速部署 1.1 硬件与软件要求 在开始部署Qwen3-VL-WEBUI之前,请确保您的系统满足以下最低要求: 硬件配置: GPU:NVIDIA RTX 3090或更…...

Lingyuxiu MXJ LoRA效果展示:同一Prompt下不同LoRA版本风格迁移对比

Lingyuxiu MXJ LoRA效果展示:同一Prompt下不同LoRA版本风格迁移对比 1. 项目简介 Lingyuxiu MXJ LoRA创作引擎是一款专门针对唯美真人人像风格设计的轻量化文本生成图像系统。这个项目在人像生成的细腻五官表现、柔化光影效果和写实质感方面做了深度优化&#xff…...

保姆级教程:在Windows上用Ollama+Page Assist插件,给你的浏览器装个本地AI助手(含GPU加速配置)

在Windows上打造浏览器本地AI助手:Ollama与Page Assist全流程指南 引言:为什么选择本地AI助手? 想象一下,当你浏览网页时遇到一段晦涩难懂的技术文档,或是需要快速总结一篇长文的核心观点,传统做法是复制…...

热力图回归避坑指南:从Adaptive Wing Loss看损失函数设计的5个关键维度

热力图回归损失函数设计的核心逻辑与实践指南 在计算机视觉领域,热力图回归已成为关键点检测任务的主流方法之一。不同于直接回归坐标值的传统方式,热力图回归通过预测每个关键点的高斯分布图,能够更精确地捕捉目标位置的概率分布。然而&…...

CosyVoice长文本处理实战:如何高效处理大规模语音合成任务

最近在做一个有声书生成的项目,遇到了一个很典型的问题:当需要合成的文本内容非常长时,传统的语音合成(TTS)引擎要么内存占用飙升,要么响应慢得让人抓狂。经过一番调研和实战,我最终选择了 Cosy…...

HTTP/2头部压缩HPACK实战:如何用静态表和动态表提升网站性能

HTTP/2头部压缩HPACK实战:如何用静态表和动态表提升网站性能 当你在Chrome开发者工具中看到瀑布流里那些细小的绿色请求块时,是否思考过它们为何能如此高效?背后功臣之一就是HTTP/2的HPACK头部压缩机制。作为现代Web性能优化的隐形加速器&…...

Windows服务器日志管理:Nginx日志切割与自动清理实战(附BAT脚本)

Windows服务器Nginx日志管理全攻略:从切割到清理的自动化实践 在Windows服务器环境中,Nginx作为高性能Web服务器被广泛使用,但其日志文件会随时间不断增长,若不加以管理,轻则占用宝贵磁盘空间,重则导致服务…...

MedGemma-X模型优化:使用STM32CubeMX实现边缘计算部署

MedGemma-X模型优化:使用STM32CubeMX实现边缘计算部署 医疗边缘设备的智能化革命正在悄然发生,而MedGemma-X模型与STM32CubeMX的结合,为床边医疗设备带来了前所未有的实时影像分析能力。 1. 医疗边缘计算的新机遇 在急诊室、ICU病房或偏远地…...

数字内容自由行:Bypass Paywalls Clean技术探索与实践指南

数字内容自由行:Bypass Paywalls Clean技术探索与实践指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 一、价值定位:打破信息获取的无形边界 1.1 知识获取…...

Jimeng LoRA实操手册:自定义LoRA文件夹路径配置与权限设置说明

Jimeng LoRA实操手册:自定义LoRA文件夹路径配置与权限设置说明 1. 项目概述 Jimeng LoRA是一个专为LoRA模型测试设计的轻量级文生图系统。基于Z-Image-Turbo底座,它实现了单次底座加载和动态LoRA热切换功能,让你能够快速测试不同训练阶段的…...

终极CAD自动化方案:用ACadSharp实现C工程图纸智能处理

终极CAD自动化方案:用ACadSharp实现C#工程图纸智能处理 【免费下载链接】ACadSharp C# library to read/write cad files like dxf/dwg. 项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp 在工程设计数字化浪潮中,CAD文件处理一直是技术团…...

从零搭三菱FX3U+MR-J4/JE伺服定位:接线、公共参数、指令全搞定,附新手友好程序

FX3U和三菱伺服控制的框架标准适合新手学习定位用,也是个直接调用到自己所用,用 标签分层,说明了定位控制中的公共参数设定、回原点、JOG手动、绝对定位、相对定位、控制等部分,有伺服驱动器的针脚接线 plc用的是三菱的3u&#xf…...

让旧Mac重获新生:OpenCore Legacy Patcher完全指南

让旧Mac重获新生:OpenCore Legacy Patcher完全指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台2017年之前的Mac,看着新系统功能眼…...

避坑指南:Java自定义异常开发中90%新手会犯的3个错误(附EduCoder案例)

Java自定义异常开发实战:避开新手常踩的三大坑 在Java开发中,异常处理是保证程序健壮性的重要机制。自定义异常更是让我们的代码能够更精确地表达业务逻辑错误的关键手段。但很多初学者在使用自定义异常时,往往会陷入一些典型的误区。今天我们…...

Claude Code + OpenSpec 安装

Claude Code OpenSpec 文章是从安装到配置再到使用的全链路详解 一、Claude Code 详解 1.Claude Code 是什么Claude Code 是 Anthropic 推出的 AI 驱动 CLI(命令行界面)编码辅助工具。它直接运行在你的终端里,能够读取代码、执行命令、编辑文…...

协议转换不求人:耐达讯自动化CC-Link IE对接Modbus RTU

在现代工业自动化领域,我们常常面临“新旧交替”的集成难题:主控层往往采用以三菱PLC为代表的CC-Link IE高速工业以太网,追求千兆级的实时响应;而设备层却遍布着大量采用经典Modbus RTU协议的变频器、传感器和仪表。如何让这两套“…...

InstructPix2Pix零基础入门:用英语指令修图,电商图片处理从未如此简单

InstructPix2Pix零基础入门:用英语指令修图,电商图片处理从未如此简单 电商从业者每天都要面对海量的图片处理需求:商品换背景、调色修图、瑕疵修复、季节适配...传统方式要么成本高昂,要么效果不佳。现在,只需用简单…...

OpenClaw+Qwen3-VL:30B:打造个人多模态AI助手

OpenClawQwen3-VL:30B:打造个人多模态AI助手 1. 为什么选择这个组合? 去年冬天,我在整理团队活动照片时突然想到:如果能自动识别照片内容并生成对应的活动记录该多好?这个想法让我开始探索多模态AI助手的可能性。经过…...

Nano-Banana在STM32CubeMX中的插件开发

Nano-Banana在STM32CubeMX中的插件开发 将AI驱动的产品拆解图生成能力直接集成到嵌入式开发工作流中 1. 为什么需要在STM32CubeMX中集成Nano-Banana? 作为嵌入式开发者,你可能经常遇到这样的场景:硬件设计完成后,需要为产品创建技…...

信号谱估计翻车实录:从Bartlett到Welch,我的数据是怎么被‘平滑’掉的?

信号谱估计避坑指南:当你的频率成分被"平均"吃掉时该怎么办? 振动传感器嗡嗡作响,屏幕上的频谱图却像被泼了墨——这是不少工程师第一次使用Welch方法时的共同记忆。我们总以为"高级算法"必然带来更清晰的结果&#xff0…...

从零开始C语言调用AI模型:OWL ADVENTURE的C接口开发入门

从零开始C语言调用AI模型:OWL ADVENTURE的C接口开发入门 如果你是一名C或C开发者,想把像OWL ADVENTURE这样的AI模型集成到你的项目中,可能会觉得有点无从下手。毕竟,现在的主流AI框架,比如PyTorch、TensorFlow&#x…...

大模型时代下的卡证检测矫正:与小模型协同的混合架构

大模型时代下的卡证检测矫正:与小模型协同的混合架构 最近和几个做企业服务的同行聊天,大家都有个共同的感受:现在大模型太火了,好像什么任务都想用大模型来解决。写文案、做客服、写代码,甚至分析数据,大…...

FireRedASR-AED-L应用场景:跨境电商客服录音→多语言意图识别预处理

FireRedASR-AED-L应用场景:跨境电商客服录音→多语言意图识别预处理 1. 项目简介 FireRedASR-AED-L是基于1.1B参数大模型开发的本地语音识别工具,专门针对跨境电商客服场景中的多语言语音处理需求而设计。这个工具解决了传统云端语音识别服务在跨境电商…...

Qwen3.5-4B-Claude-Opus精彩案例:回文函数生成+时间复杂度推导全过程

Qwen3.5-4B-Claude-Opus精彩案例:回文函数生成时间复杂度推导全过程 1. 模型能力概览 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专注于推理和逻辑分析的轻量级AI模型。这个4B参数的模型经过特殊训练,在以下方面表现突出:…...

Llama-3.2V-11B-cot开源镜像详解:免编译、免依赖、GPU即插即用

Llama-3.2V-11B-cot开源镜像详解:免编译、免依赖、GPU即插即用 想体验一个能看懂图片、还能像人一样思考推理的AI吗?今天要介绍的Llama-3.2V-11B-cot开源镜像,就是这样一个“聪明”的视觉助手。它最大的特点就是简单——你不用折腾复杂的编译…...

Word to Markdown黑科技:从格式枷锁到内容自由的解放之旅

Word to Markdown黑科技:从格式枷锁到内容自由的解放之旅 【免费下载链接】word-to-markdown A ruby gem to liberate content from Microsoft Word documents 项目地址: https://gitcode.com/gh_mirrors/wo/word-to-markdown 格式灾难应对:三招解…...

DeEAR效果可视化:Plotly动态交互图表展示语音段落内Arousal/Nature/Prosody滑动窗口变化

DeEAR效果可视化:Plotly动态交互图表展示语音段落内Arousal/Nature/Prosody滑动窗口变化 1. 引言:语音情感表达识别的重要性 语音不仅是传递信息的媒介,更是情感表达的重要载体。在客服质检、心理咨询、影视配音等场景中,准确分…...