Menu
您的位置:中国房产新闻网 > 数据研究 > >

MongoDB + Spark: 完整房产新闻的大数据解决方案

新闻来源:网易  2018-03-11 20:49

所以一个完整的大数据解决方案,包含了存储,资源管理,计算引擎及接口层。 那么问题来了:我们画了这么大这么圆的大饼,MongoDB可以吃哪一块呢?

每个executor会独立的去MongoDB取来原始数据,直接套用Spark提供的分析算法或者使用自定义流程来处理数据,计算完后把相应结果写回到MongoDB。

处理结果可以直接用来驱动前台APP,如用户打开页面时获取后台已经为他准备好的推荐列表。



如果有一天你的经理告诉你:他想知道网站上每天有多少404错误在发生,这个时候如果你用HDFS,就还是需要通过全量扫描所有行,而MongoDB则可以通过索引,很快地找到所有的404日志,可能花数秒钟就可以解答你经理的问题。

Apache Flume 来收集log

Total data size / chunksize = chunks = RDD partitions = spark tasks

Spark处理结果数量可能会很大,比如说,个性化推荐可能会产生数百万至数千万条记录,需要一个能够支持每秒万级写入能力的数据库

注意:如果转载,请注明出处,谢谢。

Spark + MongoDB 成功案例

目前已经有很多案例在不同的应用场景中使用Spark+MongoDB。
一个日志的例子

如果说刚才的比较有些抽象,我们可以结合一个实际一点的例子来理解。

MongoDB基于内存缓存的数据管理方式决定了对并发读写的响应可以做到很低延迟,水平扩展的方式可以通过多台节点同时并发处理海量请求。

Spark+MongoDB方案

在说区别之前,其实我们可以先来注意一下两者的共同点。HDFS和MongoDB都是基于廉价x86服务器的横向扩展架构,都能支持到TB到PB级的数据量。数据会在多节点自动备份,来保证数据的高可用和冗余。两者都支持非结构化数据的存储,等等。

适当情况可以同机部署Spark+MongoDB,利用本地IO提高性能

在有了数据层和资源管理层后, 接下来就是我们真正的计算引擎。

这里是一个运价系统的架构图。 左边是发起航班查询请求的客户端,首先会有API服务器进行预处理。一般航班请求会分为库存查询和运价查询。库存查询会直接到东航已有的库存系统(Seat Inventory),同样是实现在MongoDB上面的。在确定库存后根据库存结果再从Fare Cache系统内查询相应的运价。

完整PPT下载地址:MongoDB + Spark :完整的大数据解決方案 (4302)

大规模:原生支持HDFS,并且其计算节点支持弹性扩展,利用大量廉价计算资源并发的特点来支持大规模数据处理。

东方航空的挑战

东方航空作为国内的3大行之一,每天有1000多个航班,服务26万多乘客。过去,顾客在网站上订购机票,平均资料库查询200次就会下单订购机票,但是现在平均要查询1.2万次才会发生一次订购行为,同样的订单量,查询量却成长百倍。按照50%直销率这个目标计算,东航的运价系统要支持每天16亿的运价请求。

事实上,全球最大的航空分销商,管理者全世界95%航空库存的Amadeus也正是使用MongoDB作为其1000多亿运价缓存的存储方案。

Spark生态系统

在我们开始谈MongoDB 和Spark 之前,我们首先来了解一下Spark的生态系统。 Spark 作为一个大型分布式计算框架,需要和其他组件一起协同工作。
import org.bson.Document MongoSpark.load(sc) .withPipeline(Seq(Document.parse("{ $match: { orig : 'KMG' } }"))) .map(doc=>(doc.getString("flight") ,doc.getLong("seats"))) .reduceByKey((x,y)=>(x+y)) .take(10) .foreach(println) 性能优化事项

使用合适的chunksize (MB)
这里是Spark和MongoDB部署的一个典型架构。

好的,我们了解了MongoDB为什么可以替换HDFS并且为什么有这个必要来做这个事情,下面我们就来看看Spark和MongoDB怎么玩!

东方航空最近刚完成一个Spark运价的POC测试。

Spark来处理实时的log

Spark生态系统


Spark集群则是另外一套计算集群,通过Spark MongoDB连接套件和MongoDB Fare Cache集群连接。Spark 计算任务会定期触发(如每天一次或者每4小时一次),这个任务会对所有的可能的运价组合进行全量计算,然后存入MongoDB,以供查询使用。右半边则把原来实时运算的集群换成了Spark+MongoDB。Spark负责批量计算一年内所有航班所有仓位的所有价格,并以高并发的形式存储到MongoDB里面。每秒钟处理的运价可以达到数万条。
Mongo Spark Connector 连接器

在这里我们在介绍下MongoDB官方提供的Mongo Spark连接器 。目前有3个连接器可用,包括社区第三方开发的和之前Mongo Hadoop连接器等,这个Mongo-Spark是最新的,也是我们推荐的连接方案。
任务: 按航班统计一年内所有余票量

Spark + MongoDB

Spark的工作流程可以概括为三部曲:创建并发任务,对数据进行transformation操作,如map, filter,union,intersect等,然后执行运算,如reduce,count,或者简单地收集结果。

Hadoop技术的两大基石之一的MapReduce就是用来实现集群大规模并行计算。而现在就多了一个选项:Spark。 Map Reduce的特点是,用4个字来概括,简单粗暴。采用divide & conquer战术,我们可以用Map Reduce来处理PB级的数据。 而Spark 作为打了鸡血的Map Reduce增强版,利用了内存价格大量下降的时代因素,充分把计算所用变量和中间结果放到内存里,并且提供了一整套机器学习的分析算法,在加上很多语言的支持,使之成为一个较之于Map Reduce更加优秀的选择。

Spark + MongoDB 方案

我们知道MongoDB可以用来做我们海量运价数据的存储方案,在大规模并行计算方案上,就可以用到崭新的Spark技术。
免责声明:凡本网注明 “来源:XXX(非中国房产新闻网)” 的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

最新资讯

滚动播报

更多