原创用Scala和Spark实现机票Shopping系统

Posted 航旅IT圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创用Scala和Spark实现机票Shopping系统相关的知识,希望对你有一定的参考价值。

今天中午去食堂吃饭的路上,和小亮聊起运价的话题,聊着聊着就有了这个灵感。写下来的目的是整理思路,看有没有机会去实现一把。

以下言语纯属YY,各位看官千万别当真哈。


1
啥是Fare、Pricing、Shopping


按我的理解,通常说的FareFare管理系统,即航空公司营销或收益岗位的同仁把制定好的运价输入到一个系统里,然后可以增删改查,出点报表什么的。一些先进的Fare系统可以模拟Pricing结果,这可能是很多人分不清FarePrice的原因。

国际运价(或者叫非管制运价,自由运价。。。那谁用管制运价呢,你懂的)的Fare由第三方(航空公司和GDS之外)ATPCo管理。所谓管理就是定标准,从航空公司收集运价,往GDS和其他需要的机构分发运价。当然,这里的分发是收费的,而且很贵。

基本上ATPCo的运价分成三个部分(感谢我前司的运价大牛李生,杨生,张生给我扫盲,献上膝盖一副),即FaresRoutingsRules,其作用是:在合适的条件(Rules)、合适的航线上(Routings)可以准确查到应该使用的运价(Fares)。

那么,怎么查运价或者谁来查运价呢?这就是Pricing系统的任务了。注意,这里Pricing是个动词,意思是询价。Pricing可以在所有条件都明确的情况下,查出该用哪个价格。退改签的道理相同。所有条件,大概是日期时间、航班(组合)、舱位、旅客、货币等等。

当然,IT供应商和航空公司都不满足于这么呆板的销售方式,所以就发明了shopping,说中文就是血拼。真的,是这个血拼,不过专业人士还有另一个叫法——低价搜索。shopping系统干的事情说白了,就是在不具备所有条件的情况下查运价,也叫询价。在说的俗一点,就是自己拼条件,调用Pricing查运价,然后排个序。当然,做了这么牛逼一个系统,攻城狮们自然不甘心,所以又创造了很多高大上名词,比如calendar shopping,地域搜素,甚至模糊shopping,其实就是搜一个礼拜的低价,搜周边机场的低价,搜一个礼拜内周边机场的低价,实现的方法大同小异。

当然做shopping还是有难度的。和所有的可乐生产过程一样,决定性的因素有两个,第一是材料,第二是配方。材料方面,一是运价——可以找ATPCo买,不知谁说用钱可以解决的问题都不是问题。另一个是问题了,这个问题叫AV(此AV非彼AV哦,也叫航空公司座位可利用状态),除了你先向航空公司提供hosting服务,要解决这个问题就只有放大招——上元搜索(meta search)了。我不会告诉你程序猿们把这大招叫爬树,or扒数。然后是配方,也就是怎么编造和组织所有条件这件事了。当材料和配方都凑齐,经过烹煮加上些辅料,一盘热腾腾的shopping系统就出炉了。


2
Shopping系统的特点


ATPCo的标准定的无比复杂——是啊,定简单了就没门槛,没门槛就谁都能做,那ATPCo的面子何在?——63Catalogue(有部分是预留的),很多自然语言定义的规则。这显然从一开始就没想着让计算机来处理啊,故意的吧?

计算量非常大,比如 XIY-SHA-PVG-LAX-BOS这么一个常见的单程航线,航班组合可能有几十万,每个航班组合上的价格就有几十上百条,然后加上搜索的日期几十天,周边机场十几个,每个Shopping的计算量大约是几亿到几十亿次。

还有,Shopping是搜索引擎的一种,搜索引擎不能单线程吧,要大并发吧,堆机器吗,一台服务器3TPS够不?我听说查定比是5001啊,166台服务器的集群差一点就能支持1个并发的销售了。

当然,也有好消息,就是作为搜索引擎Shopping并不需要100%的准确性,有个95%就行了,哈。市面上能见到的OTA自建Shopping也就60~70%的水平吧,嗯,小伙子情绪有点不稳定啊,赶紧提高!补充一句,Pricing是要求100%准确的。比如要付钱的时候老板给你说有60%的概率付100块,那我只能让你自己去求一下心理阴影面积了。


3
Scala和Spark的特点


先说Scala,静态/强类型,函数式编程(注1,其实是多模式编程,支持OOPFP;注220多年前搞CIMS中很牛的一块CADCAPP时就玩过FP的老祖宗Lisp。五年前有幸又得知Lisp用在运价搜索产品里。FP用的最多的是复杂规则处理和人工智能),支持Actor模型以及Akka框架,轻量级web框架Play,玩该框架的人经常这样讲话,Play frameworkPlay JSONPlay Guice。。。另外Scala基于JVM,它的发明者Martin Odersky大牛也是Javac的作者,在他重构Javac之前Javac就是一坨啊一坨。所以Scala中调Java非常爽,就跟自己玩自己似得,这样Java生态环境中的所有资源都通吃啊。

Spark是用Scala写的,提供RDDDataFrame两种数据结构,全内存计算,支持分布式,封装了大量的机器学习算法,支持ML(此ML非彼ML,想歪的去面壁) pipelineApache顶级项目,社区支持,大学研究机构支持,商业公司支持。。。不要问我全内存计算为啥快,内存的读写速度是SSD100倍以上,SSD的读写速度是磁盘的10倍以上,还不需要随机寻道。


4
为什么要用Scala和Spark做Shopping?


啊,这还用解释吗?

运价处理的复杂性:所有条件的编造用分类、聚类算法解决,复杂规则的处理用FP范式解决,自然语言规则用分词工具解决;

海量计算:RDD转换,内存计算提升速度,用决策树算法降低计算量;

并发:SparkScala天然支持并发,早就解决了资源竞争问题;

容灾:Spark平行计算框架,RDD自动恢复因故丢失的数据和计算结果,提供7/24的不间断服务; 成本:Spark只要有内存就行,需要很少的存储(无需Raid),所以10i7PC(不配显示器)配上DDR4128G,再配个万兆的交换机就能搭一个不错的小集群了,这才多少钱啊?再上个阿里云,AWS啥的连机房都不用。啥,AWS连不上?当我没说哈。


总结

Summary

要做Shopping系统光咨询就好几百万美刀,现在我提出了一个10万级的解决方案。被Google花7亿美刀收购的Shopping引擎ITA也就5个人创业的,用的还是Lisp。


So,还在犹豫什么,赶紧和我一起行动吧!梦想还是要有的,万一实现了呢!说不定颠覆携程的就是我们,哈哈哈!



长按二维码,给作者打个赏。







以上是关于原创用Scala和Spark实现机票Shopping系统的主要内容,如果未能解决你的问题,请参考以下文章

福利送Spark大数据平台 + Scala语言入门视频

IDEA开发Spark应用实战(Scala)

Spark 实践——用Scala和Spark进行数据分析

Spark SQL functions.scala 源码解析String functions (基于 Spark 3.3.0)

Spark SQL functions.scala 源码解析Aggregate functions(基于 Spark 3.3.0)

spark哪个版本支持scala2.11