洗手间解决方案肌肤护理 Rubbermaid 肌肤护理系统为客户带来全方位的清洁方案,通过创新产品解决方案带来超凡的个人卫生、经济效益和
完整的大数据解決方案 - mongoing.com › ... › uploads › 2016 › 08 › MDBSH2016 ›...
Transcript of 完整的大数据解決方案 - mongoing.com › ... › uploads › 2016 › 08 › MDBSH2016 ›...
完整的大数据解決方案
ABOUT ME
唐建法 / TJ
MongoDB 高级方案架构师
MongoDB 中文社区联合发起人
AGENDA
Spark 介绍
Spark 和 MongoDB
案例
演示
Spark 介绍
什么是Spark ?
通用,快速,大规模数据处理引擎
Spark SQL
Streaming
Machine Learning
Java, Python, Scala, R
内部循环数据流程
全内存计算
可比Map Reduce 快100倍
横向扩展,集团作战
HDFS原生支持
我能用它做什么?
个性化 产品推荐 流处理 商业智能
Spark 生态系统
Hive
Pig
SparkSQL
Dataframe
SparkStreaming
SparkHadoopMapReduce
Mesos
SparkStandAlone
YARN
Mesos
SparkStandAlone
HDFSHDFS
数据存儲
资源管理
计算引擎
程序接口
HDFS vs. MongoDB
HDFS MongoDB
共同点
横向扩展,支持TB-PB级数据量低成本, x86
数据自动多份复制
支持非结构化数据
差异点
粗颗粒度存储
细颗粒度,结构化存储
无索引 二级索引
一次写入,多次读 读写混合
非交互式,离线分钟级SLA
交互式,实时在线毫秒级SLA
一个日志的例子
2016-07-31.log
2016-07-30.log
2016-07-01.log
{ts:2016-07-3123:50:50,host:xyz,error:404,.body:{}…}
{ts:2016-07-3123:49:23,host:def,error:019,.body:{}…}
{ts:2016-07-3123:49:22,host:xyz,error:null,body:{}…}
...
{ts:2016-07-0102:04:12,host:abc,error:500,body:{}…}
... 使用场景 HDFS MongoDB
7月1日到31日所有页面的点击量统计 OK OK
每日HTTP 404错误日志数量统计 低效:需要扫描所有文件行
可利用索引 秒级响应
对日志行增加自定义字段 保存分析结果
不支持 OK
索引 { error: 1 }
Spark + MongoDB
Spark工作方式
Parellelize
Parellelize
Parellelize
Parellelize
Transform
Transform
Transform
Transform
Action
Action
Action
Action
mapfilterunion
intersect
Result
Result
Result
Result
EXECUTOR
WORKER
Spark Master
Driver
EXECUTOR
WORKER
EXECUTOR
WORKER
EXECUTOR
WORKER
STORA
GE
PROCE
SSIN
G
Spark MongoDB 架构
任务调度 原始数据 计算结果
连接器
EXECUTOR
WORKER
Spark Master
Driver
EXECUTOR
WORKER
EXECUTOR
WORKER
EXECUTOR
WORKER
STORA
GE
PROCE
SSIN
G
Spark MongoDB HDFS混合架构
任务调度 原始数据 计算结果
连接器
Mongo Spark Connector 连接器
双向支持:读出与写入 条件下推 本地数据访问
https://github.com/mongodb/mongo-spark
案例分享
Spark + MongoDB 成功案例
客戶 案例 实现价值
乘客行为大数据分析, 客戶360度视图
改善的客户体验, 降低客户流失
实时监控分析跨国银行所有客户交易行为
降低客户资金风险, 提高合规性
运价计算集群及缓存, 降低机票查询响应时间
改善用户使用体验, 提高直销率
东方航空的挑战
260,000
50%
130,000
每天需支持运价 查询数量,基于12000:1查定比
16 亿
思路:空间换时间
目前运价实现为实时计算, 可以支持每天1000多万QPS
空间换时间
实时 运算
MongoDB MongoDB
LAXNYC
StayDuration
Date
LAXBOS
StayDuration
Date
NYCLAX
StayDuration
Date
BOSLAX
StayDuration
Date
BOSNYC
StayDuration
Date
PVGSZX
26 仓位
Date
365
x1000+
DISMISSED!
365 天 x 1000 航班 x 26 仓位 x 100 渠道 x N 类型 =
数十亿运价
Spark + MongoDB 方案
TEXT
B2T
IB2C
B2M
CallCenter
Mobile
B2C
Spark Master
Spark Master
..
.
Spark Submit
DRV
InvAPI
FareAPI
FareInvImpl
DRV
批处理计算
运价查询
Seat Inventory
Fare Cache
DRV
InvAPI
FareAPI
FareInvImpl
DRV
Submit Batch Job
END
Load Reference Data
Collect Results
Broadcast Variables
Parallel Compute
Master
START
Parallel Compute
Collect Results
Split Jobs
准备任务到MongoDB 读出计算任务 Spark 并发计算 结果存入MongoDB
Input job Input job
output output
vars vars
批处理计算流程
Vars:FlightscheduleBasepricePriceRules
//initializationdependenciesincludingbaseprices,pricingrulesandsomereferencedata
Mapdependencies=MyDependencyManager.loadDependencies();//broadcastingdependenciesjavaSparkContext.broadcast(dependencies);//createjobrdd
cabinsRDD=MongoSpark.load(javaSparkContext).withPipeline(pipeline)//foreachcabin,date,airportpair,calculatethepricecabinsRDD.map(functioncalc_price);//collecttheresult,whichwillcausethedatatobestoredintoMongoDBcabinsRDD.collect()
cabinsRDD.saveToMongo()
Spark 任务入口程序
0
500
1000
1500
2000
2500
3000
3500
Legacy Spark+Mongo
Throughput
0
50
100
150
200
250
300
350
Legacy Spark+Mongo
Latency
处理能力和响应时间比较
Spark + MongoDB 演示
安装Spark
#curl-OLhttp://d3kbcqa49mib13.cloudfront.net/spark-1.6.0-bin-hadoop2.6.tgz#mkdir-p~/spark#tar-xvfspark-1.6.0-bin-hadoop2.6.tgz-C~/spark--strip-components=1
测试连接器
#cd spark#./bin/spark-shell\--conf"spark.mongodb.input.uri=mongodb://127.0.0.1/flights.av"\--conf"spark.mongodb.output.uri=mongodb://127.0.0.1/flights.output"\--packagesorg.mongodb.spark:mongo-spark-connector_2.10:1.0.0importcom.mongodb.spark._importorg.bson.DocumentMongoSpark.load(sc).take(10).foreach(println)
简单分组统计
MongoSpark.load(sc).map(doc=>(doc.getString("flight"),doc.getLong("seats"))).reduceByKey((x,y)=>(x+y))
.take(10).foreach(println)
数据: 365天,所有航班库存信息,500万文档 任务: 按航班统计一年内所有余票量
简单分组统计加条件过滤
importorg.bson.DocumentMongoSpark.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)
数据: 365天,所有航班库存信息,500万文档 任务: 按航班统计一年内所有库存,但是只处理昆明出发的航班
结语
性能优化事项
CPU Spark
Total data size / chunksize = chunks = RDD partitions = spark tasks
1-2 core
spark+mongo IO
chunksize (MB)
+
MongoDB Spark
个性化,产品推荐 机器学习 流处理能力
Spark Hadoop MongoDB
需要支持数据随机更新操作 分析结果需用于交互型APP 对数据使用有灵活查询需求
Questions?
更快! 更敏捷!
Questions?