Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干货 | 携程机票实时数据处理实践及应用

干货 | 携程机票实时数据处理实践及应用

作者头像
携程技术
发布于 2018-07-05 08:22:36
发布于 2018-07-05 08:22:36
1.5K0
举报
文章被收录于专栏:携程技术携程技术

作者简介

张振华,携程旅行网机票研发部资深软件工程师,目前主要负责携程机票大数据基础平台的建设、运维、迭代,以及基于此的实时和非实时应用解决方案研发。

携程机票实时数据种类繁多,体量可观,主要包括携程机票用户访问、搜索、下单等行为日志数据;各种服务调用与被调用产生的请求响应数据;机票服务从外部系统(如GDS)获取的机票产品及实时状态数据等等。这些实时数据可以精确反映用户与系统交互时每个服务模块的状态,完整刻画用户浏览操作轨迹,对生产问题排查、异常侦测、用户行为分析等方面至关重要。

回到数据本身,当我们处理数据的时候,往往会遇到两类数据,一类是已经存在的有界(bounded)数据(比如hdfs的某个数据文件),一类是持续不断生成的无界(unbounded)数据(如某个活跃的Kafka topic),对应着这两类数据的处理也被分为批处理(batch processing)和流式处理(stream processing)。

批处理针对有界数据,处理完所有数据后释放计算资源;而流式处理则需要持续地处理不断产生的数据。随着大数据社区的发展,各类优秀成熟的计算框架不断涌现。众所周知,当前比较成熟的批处理计算框架主要包括HadoopSpark等,实时处理计算框架主要包括Storm、Spark Streaming、Flink等。

从大数据技术发展历史来看,海量历史数据的处理需求提出要早于实时流式数据,因此批处理计算框架出现和趋于成熟得更早。然而,互联网时代的来临,高吞吐的实时数据处理也成了在线平台的刚需,这也极大促进了实时计算框架的发展。

一、流数据处理框架

流数据处理框架按照其实现的方式,也可以分为逐条处理和微批量(micro-batching)处理两种(如图1所示),Storm和Flink属于前者,Spark Streaming属于后者。

图1 实时处理实现两种方式

介绍三个计算框架特性的文章很多,本文不再过多赘述。

在Storm里,通过定义Spout数据来源和后续一系列的Bolt处理流程组成完整拓扑Topology,从而实现整套处理逻辑。利用Topology定义的Storm流程是无状态的,无法实现exactly once处理容错语义,如果应用场景中需求严格的一次处理,如统计一个小时内IOS用户的PV,可以用Storm Trident API,确保每条消息只会被处理一次。

Flink和Spark则既可以支持批处理,也可以支持流处理,但两者对数据处理的设计似乎正好相反,Flink会把所有数据处理当成流数据来处理,即使处理静态的有界数据;Spark则将所有数据处理转化为批处理,即使在处理流式数据,也会将流数据切分成微批来进行计算。Flink这种流处理优先的方式叫做Kappa架构,而Spark这种批处理优先的方式被称作为Lambda架构。

在大多数公开的性能测试报告中,Flink吞吐、延时方面的性能指标最优,Spark Streaming受限于micro-batching处理的机制,时延方面最好只能达到秒级,无法满足严苛的实时需求,Storm的时延能达到亚秒,但吞吐指标稍显不足。在数据处理一致性方面,Flink通过state snapshot优雅地实现了exactly once保证,Spark streaming则利用WAL(Write Ahead Log)和RDD本身特性保证了exactly once,storm由于其容错采用的ack机制只能保证at least once,而其Trident则采用封装tuple到batch的方式,并保存元数据和中间状态,从而实现了exactly once的语义。

那么如何选择合适的流处理框架呢?主要看应用场景,如果应用需要亚秒级的时延,Storm和Flink是不错的选择,特别是Flink;如果对时延的要求不是特别高,可以选择Spark Streaming,毕竟Spark目前社区的活跃度、产品成熟度、生态圈丰富度、SQL支持这块都优于其余两者。

二、Kafka

在实时计算的很多场景中,消息队列扮演着绝对重要的角色,是解耦生产和BI、复用生产数据的解决方案。Kafka作为消息队列中最流行的代表之一,在各大互联网企业、数据巨头公司广泛使用。

Kafka出身LinkedIn,是一个分布式的发布/订阅系统。集群由多个Broker节点组成,通过Zookeeper维护元数据信息、选举Partition的Leader、记录消费端状态。在Broker节点上,每个Topic的Partition对应着一个文件系统目录,并以topic_name-partition_index命名,最终数据会被写入到Partition对应的目录,并以index文件和segment文件成对出现的方式存储。众所周知,即使数据写入到普通的SATA硬盘上,Kafka依然具有非常高的吞吐性能。究其本质,还是因为Kafka的顺序读写、系统级的PageCache利用,绕过用户态buffer数据拷贝的sendfile优化。

Kafka作为生产环境和数据分析环境的数据枢纽环节,其稳定性至关重要。表1为一个可以作为生产环境Kafka的配置。

操作系统

CentOS 7.1

Open files

100000

文件系统

Ext4

JVM

1.8

GC

G1

Broker节点配置

12核/48G内存/4*4T硬盘/万兆网卡

JVM堆大小

4G

Zookeeper节点配置

12核/48G内存/2*4T硬盘

表 1 生产环境推荐Kafka配置

携程机票从2015年开始使用Kafka,发生过多次大小故障,踩过的坑也不少,下面罗列些琐碎的经验。

1、Partition的默认数目设置成与Broker节点数一致,这样在默认配置的情况下,不至于因为某些体量超大的Topic造成Broker节点硬盘负载和网络负载倾斜

2、做手工维护强制让某些体量大的Topic瘦身时(如retention.ms和retention.bytes变小),要注意节奏,尽量不要同时修改多个,造成集群IO尖刺

3、某些写入端确实需要写入大报文数据并且超过默认设置(1MB)时,需要在Topic配置中增大max.message.bytes,并且在写入端Producer侧增大max.request.size

4、Producer默认开启压缩,compression.codec=gzip/snappy,这样可以有效降低副本同步的网络IO开销,当然同样会带来消费解压引起的集群CPU开销

5、扩容新节点需要超过一台,并且应该尽快将已有Topic的Partition数目调整与扩容后节点数目一致

6、可以考虑独立出一个SOA写入服务供生产环境各服务使用,一方面减少生产环境对大数据组件的依赖,一方面可以让后续的版本升级,集群迁移等操作对调用端透明

7、启动Kafka进程时打开JMX参数,在KafkaManager里可以轻松观察各个节点的写入qps

8、定期清理dead Consumer,为zookeeper减负

9、设置 auto.leader.rebalance.enable=true,让partitionLeader的分布更均衡

10、num.io.threads配置成min(2*disk_num , cpu_core+1),以达到较高的IO处理速率

三、携程机票实时数据处理架构实践及应用

携程机票实时数据主要来源于用户与机票系统交互产生的业务数据流和日志流,业务数据最终会被写入关系型数据库SQLServer和MySQL中,日志数据则通过SOA服务写入消息队列Kafka中,目前机票BI实时应用使用的数据源主要来自于Kafka的日志消息数据。

图2 携程机票实时数据处理架构

图2为携程机票当前采用的实时数据处理技术栈。在实时处理框架选择上,我们采用了Storm和Spark Streaming,主要针对不同时延需求的业务场景。没有采用Flink,一方面由于公司暂时没有部署计划,另一方面没有高迭代并且对时延要求很高的应用场景。

Spark Streaming目前主要用来实时解析机票查询日志,用户搜索呈现在机票App/Online界面上的航班价格列表在查询服务返回时其实是一个经过序列化压缩的报文,我们将Kafka Direct Stream接收到数据流DStream,并经过计算处理,将大报文解析成航班价格列表,并存储至Hive,进而支持机票价格监控、舱位实时分析、价格实时优劣势展现、各引擎优劣势实时分析等多个应用,每天解析出来的航班价格数据量大约60亿。另外Spark Streaming也被用来支持ABT实验的指标统计,从而近实时获悉新版接入流量后的表现。

Storm主要用来实时识别舱位虚占,从下单服务推送到Kafka的明细下单日志,经过过滤、提取相应字段后,进行统计和虚占识别规则匹配,从而实时标记虚占用户,并将虚占识别结果写入redis供下单服务使用。

除了经典的Spark Streaming和Storm流计算框架外,为了支持机票数据监控系统灵活动态配置取数SQL的需求,我们采用了Redis+Presto这种方案,以分钟粒度的时间戳为key,将kafka对应该时间戳的数据以Json列表的格式跟key作关联,并利用Presto Redis Connector通过SQL的方式聚合计算该key对应列表数据,并将聚合结果写入DB供监控系统前端调用,实时监控机票各项指标。

我们利用Logstash将Kafka内的各服务日志topic实时ETL至ElasticSearch,并利用实时更新的二级索引(存储于redis,记录唯一标识与ElasticSearchindex的对应关系)和并发查询支持唯一标识所有相关日志数据的串联,在展示界面里完整回溯用户在携程系统里的行为。

另外,相关前端埋点数据和后台访问日志被实时同步至timescaledb的超表中,通过灵活可配的SQL执行对应的反爬识别规则,并适用机器学习模型将爬虫IP尽快甄别出来,进而实施反爬策略。

四、总结

随着大数据开源社区的蓬勃发展,越来越多的计算框架涌现并趋于成熟,应用框架各自有各自的特性,只有最适合自身应用项目的框架才是最好的选择。当然,随时关注社区发展,调研了解新技术的特点也是非常有必要的。

参考

  • Kafka官方文档
  • Flink官方文档
  • Storm官方文档
  • 三种流框架的对比分析 https://bigdata.163yun.com/product/article/5
  • 大数据处理引擎Spark与Flink大比拼https://www.douban.com/group/topic/95561683
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 携程技术中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货 | 携程机票数据仓库建设之路
华智,携程高级研发经理,现负责数据仓库技术架构、性能优化、数仓规范制定、数据模型设计以及数据应用开发。
携程技术
2020/02/26
1.5K0
干货 | 携程实时大数据平台实践分享
编者:本文作者为携程大数据平台负责人张翼。张翼浙江大学硕士毕业,2015年初加入携程,主导了携程实时数据计算平台的建设,以及携程大数据平台整合和平台技术的演进。进入互联网行业近10年,从事大数据平台和架构的工作超过6年。 今天给大家分享的是携程在实时数据平台的一些实践,按照时间顺序来分享我们是怎么一步一步构建起这个实时数据平台的,目前有一些什么新的尝试,未来的方向是怎么样的,希望对需要构建实时数据平台的公司和同学有所借鉴。 为什么要做数据平台 首先先介绍一下背景,为什么我们要做这个数据平台?其实了解携程的
携程技术
2018/03/16
2.5K0
干货 | 携程实时大数据平台实践分享
干货 | 携程酒店实时数仓架构和案例
当前,企业对于数据实时性的需求越来越迫切,因此需要实时数仓来满足这些需求。传统的离线数仓的数据时效性通常为 T+1,并且调度频率以天为单位,无法支持实时场景的数据需求。即使将调度频率设置为每小时,也仅能解决部分时效性要求较低的场景,对于时效性要求较高的场景仍然无法优雅地支撑。因此,实时数据使用的问题必须得到有效解决。实时数仓主要用于解决传统数仓数据时效性较低的问题,通常会用于实时的 OLAP 分析、实时数据看板、业务指标实时监控等场景。
携程技术
2023/02/28
1.2K0
干货 | 携程酒店实时数仓架构和案例
独家 | 一文读懂大数据处理框架
前言 说起大数据处理,一切都起源于Google公司的经典论文:《MapReduce:Simplied Data Processing on Large Clusters》。在当时(2000年左右),由于网页数量急剧增加,Google公司内部平时要编写很多的程序来处理大量的原始数据:爬虫爬到的网页、网页请求日志;计算各种类型的派生数据:倒排索引、网页的各种图结构等等。这些计算在概念上很容易理解,但由于输入数据量很大,单机难以处理。所以需要利用分布式的方式完成计算,并且需要考虑如何进行并行计算、分配数据
数据派THU
2018/01/29
1.7K0
独家 | 一文读懂大数据处理框架
实时大数据开发实践
本文主要从大数据起源谈起,介绍了几种主要的大数据处理框架,包括其中的容错机制,实现细节及原理等。再主要介绍了使用storm进行大数据开发的具体过程,以及开发过程中遇到的坑和一些优化。以下内容基于本人上次部门内分享整理,去掉了一些业务性的内容,尽量给大家展现一些技术细节。
gaofc
2018/12/24
1.3K0
干货 | 用户画像在携程商旅的实践
用户画像这一概念最早源于交互设计领域,由交互设计之父Alan Cooper提出。其指出用户画像是真实用户的虚拟代表,是建立在真实数据之上的目标用户模型。具体而言,在互联网用户分析领域,用户画像可以简单描述为用户信息标签化,即通过收集并分析用户的社会属性、生活习惯、消费偏好等各维度的数据,从而抽象出用户的全方位多视角的特征全貌,最终就是让用户画像比用户更了解自己。
携程技术
2020/07/20
2.6K0
各种海量实时数据仓库架构优缺点比较
海量实时数据仓库(Real-time Data Warehouse,简称RTDW)是一种能够处理大量数据,并且能够在极短的时间内完成数据的收集、存储、处理和分析的数据系统。这种数据仓库设计用于支持实时或近实时的数据流处理,使得企业可以即时获取到最新的业务洞察,从而快速做出决策。 特点 高吞吐量:能够处理每秒数百万条记录的数据流。
用户7353950
2024/11/23
1610
各种海量实时数据仓库架构优缺点比较
干货 | 携程实时用户行为系统实践
作者简介 陈清渠,毕业于武汉大学,多年软件及互联网行业开发经验。14年加入携程,先后负责了订单查询服务重构,实时用户行为服务搭建等项目的架构和研发工作,目前负责携程技术中心基础业务研发部订单中心团队。 携程实时用户行为服务作为基础服务,目前普遍应用在多个场景中,比如猜你喜欢(携程的推荐系统),动态广告,用户画像,浏览历史等等。 以猜你喜欢为例,猜你喜欢为应用内用户提供潜在选项,提高成交效率。旅行是一项综合性的需求,用户往往需要不止一个产品。作为一站式的旅游服务平台,跨业务线的推荐,特别是实时推荐,能实际满足
携程技术
2018/03/16
1.6K0
干货 | 携程实时用户行为系统实践
爱奇艺在日志实时数据监控的探索与实践
2019年6月爱奇艺会员规模突破1亿,爱奇艺的会员服务业务随之迅速增长,同时也带来了机器集群规模的增加,原有的监控体系也暴露出一些问题。数据监控体系是业务维持稳定服务的基石,会员日志监控体系形成闭环,从网络、应用、异常、页面加载多维度监控,极大提高了系统的成功率、稳定性,对会员视频播放、营销、下单等核心功能增强异常感知。
Spark学习技巧
2021/03/05
1.2K0
爱奇艺在日志实时数据监控的探索与实践
Kafka及周边深度了解
文章有点长,但是写的都挺直白的,慢慢看下来还是比较容易看懂,从Kafka的大体简介到Kafka的周边产品比较,再到Kafka与Zookeeper的关系,进一步理解Kafka的特性,包括Kafka的分区和副本以及消费组的特点及应用场景简介。
别打名名
2019/12/23
1.2K0
这5种必知的大数据处理框架技术,你的项目到底应该使用其中的哪几种
大数据是收集、整理、处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称。虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性、规模,以及价值在最近几年才经历了大规模扩展。
IT阅读排行榜
2018/08/15
2.2K0
实时数据处理框架选型与应用:驾驭数据洪流的智能决策
在如今这个大数据时代,实时数据处理已经成为了企业和开发者们面临的一项重要挑战。无论是金融交易、物联网设备、还是社交媒体,庞大的实时数据流需要高效的处理和分析。为了驾驭这些数据洪流,选择合适的实时数据处理框架至关重要。今天,我将和大家聊聊如何选择合适的实时数据处理框架,并通过一个具体项目展示其应用。
Echo_Wish
2025/01/06
2090
实时数据处理框架选型与应用:驾驭数据洪流的智能决策
案例-马蜂窝实时计算平台演进之路
MES 是马蜂窝统一实时计算平台,为各条业务线提供稳定、高效的实时数据计算和查询服务。在整体设计方面,MES 借鉴了 Lambda 架构的思想。本篇文章,我们将从四个方面了解 MES:
smartsi
2019/08/07
8360
Lambda离线实时分治架构深度解析与实战
在大数据技术日新月异的今天,Lambda架构作为一种经典的数据处理模型,在应对大规模数据应用方面展现出了强大的能力。它整合了离线批处理和实时流处理,为需要同时处理批量和实时数据的应用场景提供了成熟的解决方案。本文将对Lambda架构的演变、核心组件、工作原理及痛点进行深度解析,并通过Java代码实现一个实战实例。
小马哥学JAVA
2025/01/09
1620
干货 | 百万QPS,秒级延迟,携程基于实时流的大数据基础层建设
纪成,携程数据开发总监,负责金融数据基础组件及平台开发、数仓建设与治理相关的工作。对大数据领域开源技术框架有浓厚兴趣。
携程技术
2021/04/09
1.8K0
知乎实时数仓实践及架构演进
转自知乎技术专栏:https://zhuanlan.zhihu.com/p/56807637
Spark学习技巧
2019/05/17
1.8K0
知乎实时数仓实践及架构演进
实时数仓Kappa架构:从入门到实战
这里推荐一篇实用的文章:一文彻底弄懂 MySQL 优化:从 Java 后端视角出发。
小马哥学JAVA
2024/11/25
1360
携程:日处理20亿数据,实时用户行为架构实践
携程实时用户行为服务作为基础服务,目前普遍应用在多个场景中,比如猜你喜欢(携程的推荐系统)、动态广告、用户画像、浏览历史等等。
搜云库技术团队
2019/10/18
7600
Structured Streaming | Apache Spark中处理实时数据的声明式API
随着实时数据的日渐普及,企业需要流式计算系统满足可扩展、易用以及易整合进业务系统。Structured Streaming是一个高度抽象的API基于Spark Streaming的经验。Structured Streaming在两点上不同于其他的Streaming API比如Google DataFlow。 第一,不同于要求用户构造物理执行计划的API,Structured Streaming是一个基于静态关系查询(使用SQL或DataFrames表示)的完全自动递增的声明性API。 第二,Structured Streaming旨在支持端到端实时的应用,将流处理与批处理以及交互式分析结合起来。 我们发现,在实践中这种结合通常是关键的挑战。Structured Streaming的性能是Apache Flink的2倍,是Apacha Kafka 的90倍,这源于它使用的是Spark SQL的代码生成引擎。它也提供了丰富的操作特性,如回滚、代码更新、混合流\批处理执行。 我们通过实际数据库上百个生产部署的案例来描述系统的设计和使用,其中最大的每个月处理超过1PB的数据。
王知无-import_bigdata
2020/01/14
2K0
Structured Streaming | Apache Spark中处理实时数据的声明式API
G行基于 Apache Hudi 的实时数据湖架构与实践
近年来,随着银行业务尤其是互联网金融业务的不断发展,金融业务数据量持续快速增长。同时,基于大数据、云计算、湖仓一体等技术体系的成熟,数据资产和价值挖掘得到越来越多的重视。G行自2019年开始便着手建设了以离线贴源数据为主的数据湖平台,实现了全行数据的统一存储、统一管理和统一服务。离线数据湖平台根据源系统数据表的业务属性区分处理后完成入湖入仓,并授权给下游租户进行批量运算或者数据查询,为业务营销、特征分析、个性化推荐、监管报送等提供了充分的数据基础。然而,随着银行业务场景和业务需求的不断发展,离线数据湖的不足也逐渐体现,主要包括:
ApacheHudi
2024/11/23
2180
G行基于 Apache Hudi 的实时数据湖架构与实践
推荐阅读
相关推荐
干货 | 携程机票数据仓库建设之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档