说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

MongoDB Map Reduce速度提升20倍的优化宝典

HTML文档下载 WORD文档下载 PDF文档下载
MongoDB提供的Map Reduce非常灵活,对于大规模数据分析也相当实用。尽管MongoDB 2.4中Map Reduce有了大幅改进,但是相对来说其性能还是有很大的提升空间。本文就来尝试找出让Map Reduce速度最大化提升的方法。

自从MongoDB被越来越多的大型关键项目采用后,数据分析也成为了越来越重要的话题。人们似乎已经厌倦了使用不同的软件来进行分析(这都利用到了Hadoop),因为这些方法往往需要大规模的数据传输,而这些成本相当昂贵。

MongoDB提供了2种方式来对数据进行分析:Map Reduce(以下简称MR)和聚合框架(Aggregation Framework)。MR非常灵活且易于使用,它可以很好地与分片(sharding)结合使用,并允许大规模输出。尽管在MongoDB v2.4版本中,由于JavaScript引擎从Spider切换到了V8,使得MR的性能有了大幅改进,但是与Agg Framework(使用C++)相比,MR的速度还是显得比较慢。本文就来看看,有哪些方法可以让MR的速度有所提升。

测试

首先我们来做个测试,插入1000万文档,这些文档中包含了介于0和100万之间的单一整数值,这意味着,平均每10个文档具有相同的值。

> for (var i = 0; i < 10000000; ++i){ db.uniques.insert({ dim0: Math.floor(Math.random()*1000000) });}> db.uniques.findOne(){ "_id" : ObjectId("51d3c386acd412e22c188dec"), "dim0" : 570859 }> db.uniques.ensureIndex({dim0: 1})> db.uniques.stats(){        "ns" : "test.uniques",        "count" : 10000000,        "size" : 360000052,        "avgObjSize" : 36.0000052,        "storageSize" : 582864896,        "numExtents" : 18,        "nindexes" : 2,        "lastExtentSize" : 153874432,        "paddingFactor" : 1,        "systemFlags" : 1,        "userFlags" : 0,        "totalIndexSize" : 576040080,        "indexSizes" : {                "_id_" : 324456384,                "dim0_1" : 251583696        },        "ok" : 1}

这里我们想要得到文档中唯一值的计数,可以通过下面的MR任务来轻松完成:

> db.runCommand({ mapreduce: "uniques", map: function () { emit(this.dim0, 1); }, reduce: function (key, values) { return Array.sum(values); }, out: "mrout" }){        "result" : "mrout",        "timeMillis" : 1161960,        "counts" : {                "input" : 10000000,                "emit" : 10000000,                "reduce" : 1059138,                "output" : 999961        },        "ok" : 1}

正如你看到的,输出结果大约需要1200秒(在EC2 M3实例上测试),共输出了1千万maps、100万reduces、999961个文档。结果类似于:

> db.mrout.find(){ "_id" : 1, "value" : 10 }{ "_id" : 2, "value" : 5 }{ "_id" : 3, "value" : 6 }{ "_id" : 4, "value" : 10 }{ "_id" : 5, "value" : 9 }{ "_id" : 6, "value" : 12 }{ "_id" : 7, "value" : 5 }{ "_id" : 8, "value" : 16 }{ "_id" : 9, "value" : 10 }{ "_id" : 10, "value" : 13 }...

下面就来看看如何进行优化。

使用排序

我在之前的这篇文章中简要说明了使用排序对于MR的好处,这是一个鲜为人知的特性。在这种情况下,如果处理未排序的输入,意味着MR引擎将得到随机排序的值,

基本上没有机会在RAM中进行reduce,相反,它将不得不通过一个临时collection来将数据写回磁盘,然后按顺序读取并进行reduce。

下面来看看如果使用排序,会有什么帮助:

> db.runCommand({ mapreduce: "uniques", map: function () { emit(this.dim0, 1); }, reduce: function (key, values) { return Array.sum(values); }, out: "mrout", sort: {dim0: 1} }){        "result" : "mrout",        "timeMillis" : 192589,        "counts" : {                "input" : 10000000,                "emit" : 10000000,                "reduce" : 1000372,                "output" : 999961        },        "ok" : 1}

现在时间降到了192秒,速度提升了6倍。其实reduces的数量是差不多的,但是它们在被写入磁盘之前已经在RAM中完成了。

使用多线程

在MongoDB中,一个单一的MR任务并不能使用多线程——只有在多个任务中才能使用多线程。但是目前的多核CPU非常有利于在单一服务器上进行并行化工作,就像Hadoop。我们需要做的是,将输入数据分割成若干块,并为每个块分配一个MR任务。splitVector命令可以帮助你非常迅速地找到分割点,如果你有更简单的分割方法更好。

> db.runCommand({splitVector: "test.uniques", keyPattern: {dim0: 1}, maxChunkSizeBytes: 32000000}){    "timeMillis" : 6006,	"splitKeys" : [		{			"dim0" : 18171		},		{			"dim0" : 36378		},		{			"dim0" : 54528		},		{			"dim0" : 72717		},…		{			"dim0" : 963598		},		{			"dim0" : 981805		}	],	"ok" : 1}

从1千万文档中找出分割点,使用splitVector命令只需要大约5秒,这已经相当快了。所以,下面我们需要做的是找到一种方式来创建多个MR任务。从应用服务器方面来说,使用多线程和$gt / $lt查询命令会非常方便。从shell方面来说,可以使用ScopedThread对象,它的工作原理如下:

> var t = new ScopedThread(mapred, 963598, 981805)> t.start()> t.join()

现在我们可以放入一些JS代码,这些代码可以产生4个线程,下面来等待结果显示:

> var res = db.runCommand({splitVector: "test.uniques", keyPattern: {dim0: 1}, maxChunkSizeBytes: 32 *1024 * 1024 })> var keys = res.splitKeys> keys.length39> var mapred = function(min, max) { return db.runCommand({ mapreduce: "uniques", map: function () { emit(this.dim0, 1); }, reduce: function (key, values) { return Array.sum(values); }, out: "mrout" + min, sort: {dim0: 1}, query: { dim0: { $gte: min, $lt: max } } }) }> var numThreads = 4> var inc = Math.floor(keys.length / numThreads) + 1> threads = []; for (var i = 0; i < numThreads; ++i) { var min = (i == 0) ? 0 : keys[i * inc].dim0; var max = (i * inc + inc >= keys.length) ? MaxKey : keys[i * inc + inc].dim0 ; print("min:" + min + " max:" + max); var t = new ScopedThread(mapred, min, max); threads.push(t); t.start() }min:0 max:274736min:274736 max:524997min:524997 max:775025min:775025 max:{ "$maxKey" : 1 }connecting to: testconnecting to: testconnecting to: testconnecting to: test> for (var i in threads) { var t = threads[i]; t.join(); printjson(t.returnData()); }{         "result" : "mrout0",        "timeMillis" : 205790,        "counts" : {                "input" : 2750002,                "emit" : 2750002,                "reduce" : 274828,                "output" : 274723        },        "ok" : 1}{         "result" : "mrout274736",        "timeMillis" : 189868,        "counts" : {                "input" : 2500013,                "emit" : 2500013,                "reduce" : 250364,                "output" : 250255        },        "ok" : 1} {        "result" : "mrout524997",        "timeMillis" : 191449,        "counts" : {                "input" : 2500014,                "emit" : 2500014,                "reduce" : 250120,                "output" : 250019        },        "ok" : 1}{        "result" : "mrout775025",        "timeMillis" : 184945,        "counts" : {                "input" : 2249971,                "emit" : 2249971,                "reduce" : 225057,                "output" : 224964        },        "ok" : 1}

第1个线程所做的工作比其他的要多一点,但时间仍达到了190秒,这意味着多线程并没有比单线程快!

使用多个数据库

这里的问题是,线程之间存在太多锁争用。当锁时,MR不是非常无私(每1000次读取会进行yield)。由于MR任务做了大量写操作,线程之间结束时会等待彼此。由于MongoDB的每个数据库都有独立的锁,那么让我们来尝试为每个线程使用不同的输出数据库:

> var mapred = function(min, max) { return db.runCommand({ mapreduce: "uniques", map: function () { emit(this.dim0, 1); }, reduce: function (key, values) { return Array.sum(values); }, out: { replace: "mrout" + min, db: "mrdb" + min }, sort: {dim0: 1}, query: { dim0: { $gte: min, $lt: max } } }) }> threads = []; for (var i = 0; i < numThreads; ++i) { var min = (i == 0) ? 0 : keys[i * inc].dim0; var max = (i * inc + inc >= keys.length) ? MaxKey : keys[i * inc + inc].dim0 ; print("min:" + min + " max:" + max); var t = new ScopedThread(mapred, min, max); threads.push(t); t.start() }min:0 max:274736min:274736 max:524997min:524997 max:775025min:775025 max:{ "$maxKey" : 1 }connecting to: testconnecting to: testconnecting to: testconnecting to: test> for (var i in threads) { var t = threads[i]; t.join(); printjson(t.returnData()); }...{         "result" : {                "db" : "mrdb274736",                "collection" : "mrout274736"        },        "timeMillis" : 105821,        "counts" : {                "input" : 2500013,                "emit" : 2500013,                "reduce" : 250364,                "output" : 250255        },        "ok" : 1}...

所需时间减少到了100秒,这意味着与一个单独的线程相比,速度约提高2倍。尽管不如预期,但已经很不错了。在这里,我使用了4个核心,只提升了2倍,如果使用8核CPU,大约会提升4倍。

使用纯JavaScript模式

在线程之间分割输入数据时,有一些非常有趣的东西:每个线程只拥有约25万主键来输出,而不是100万。这意味着我们可以使用“纯JS模式”——通过jsMode:true来启用。开启后,MongoDB不会在JS和BSON之间反复转换,相反,它会从内部的一个50万主键的JS字典来reduces所有对象。下面来看看该操作是否对速度提升有帮助。

> var mapred = function(min, max) { return db.runCommand({ mapreduce: "uniques", map: function () { emit(this.dim0, 1); }, reduce: function (key, values) { return Array.sum(values); }, out: { replace: "mrout" + min, db: "mrdb" + min }, sort: {dim0: 1}, query: { dim0: { $gte: min, $lt: max } }, jsMode: true }) }> threads = []; for (var i = 0; i < numThreads; ++i) { var min = (i == 0) ? 0 : keys[i * inc].dim0; var max = (i * inc + inc >= keys.length) ? MaxKey : keys[i * inc + inc].dim0 ; print("min:" + min + " max:" + max); var t = new ScopedThread(mapred, min, max); threads.push(t); t.start() }min:0 max:274736min:274736 max:524997min:524997 max:775025min:775025 max:{ "$maxKey" : 1 }connecting to: testconnecting to: testconnecting to: testconnecting to: test> for (var i in threads) { var t = threads[i]; t.join(); printjson(t.returnData()); }...{         "result" : {                "db" : "mrdb274736",                "collection" : "mrout274736"        },        "timeMillis" : 70507,        "counts" : {                "input" : 2500013,                "emit" : 2500013,                "reduce" : 250156,                "output" : 250255        },        "ok" : 1}...

现在时间降低到70秒。看来jsMode确实有帮助,尤其是当对象有很多字段时。该示例中是一个单一的数字字段,不过仍然提升了30%。

MongoDB v2.6版本中的改进

在MongoDB v2.6版本的开发中,移除了一段关于在JS函数调用时的一个可选“args”参数的代码。该参数是不标准的,也不建议使用,它由于历史原因遗留了下来(见SERVER-4654)。让我们从Git库中pull最新的MongoDB并编译,然后再次运行测试用例:

...{         "result" : {                "db" : "mrdb274736",                "collection" : "mrout274736"        },        "timeMillis" : 62785,        "counts" : {                "input" : 2500013,                "emit" : 2500013,                "reduce" : 250156,                "output" : 250255        },        "ok" : 1}...

从结果来看,时间降低到了60秒,速度大约提升了10-15%。同时,这种更改也改善了JS引擎的整体堆消耗量。

结论

回头来看,对于同样的MR任务,与最开始时的1200秒相比,速度已经提升了20倍。这种优化应该适用于大多数情况,即使一些技巧效果不那么理想(比如使用多个输出dbs /集合)。但是这些技巧可以帮助人们来提升MR任务的速度,未来这些特性也许会更加易用——比如,这个ticket 将会使splitVector命令更加可用,这个ticket将会改进同一数据库中的多个MR任务。

英文原文:How to speed up MongoDB Map Reduce by 20x

应用宝逆袭上位 将重构腾讯移动应用分发体系 eBay基础设施的成功经验,我们该如何复制? 自定义富媒体广告:NativeX SDK 5.0发布! WunderBar:零硬件开发基础也能接入物联网! 深入解析:分布式系统的事务处理经典问题及模型 从世纪互联、华云数据和金石易服的发展服路径观察IDC产业发展 SA:2014移动运营商、终端和应用十大关键趋势 使用modern.IE来设计更现代化的网页 全国顶级域名根服务器21日下午疑遭黑客攻击 影响巨大 苹果下一代iPhone的十大预测 《近匠》第07期,专访《恶魔塔防》团队,看俄国复杂深奥的游戏文化 代码托管网站GitHub的总裁和CEO进行职位互换 使用Chromebook的五个指南 云中游终极声明:热酷侵权,有种正面回答少打太极 背后故事:英特尔Edison中国研发 内部评审中曾三次被拒 全栈工程师会是未来的发展趋势吗? 大数据整理:囊括分片、存储方法、扩展等多个方面 物联网 ,下一个云计算市场 一位数据挖掘工程师眼中的“大数据与企业的数据化运营” 揭开“iOS in the Car”的神秘面纱 与Apple对峙:法律途径,并非是我想要 Halfbrick新作市场表现低迷:前作辉煌难续 专访豌豆荚:融资,会给技术团队带来哪些影响? 前端开发必备 40款优秀CSS代码编写工具推荐 新环境下的新体验是互联网硬件火热的根本原因 信息安全救星 ——变形代码产品ShapeShifter AWS启动大规模降价,引领行业降价潮流 Windows 8.1 Update 1最新版的截图再遭曝光 2013年软件领域因缺陷导致的五大事件 专访AMD技术高管 详解Kaveri技术性能及新开发特性 网络的东西南北:从SDN到网络虚拟化 什么是“三层数据库”和“嵌入式软件系统”? 什么是“三层数据库”和“嵌入式软件系统”? 类似"hello world"的简单问题,求教 免费ASP空间申请,支持ACCESS 事件的终止? 数据追加求教:谢谢您!!!! 请问InputBox在framework 类库里面有没有代替的阿? 为什么我写到文件中的字符总长度比我实际应该要写的多? 如何使dbctrlgrid多选,并使鼠标右击相当于鼠标左击 关于静态IP地址,急!!! 如何将tomcat做为windows的一项服务启动? 请问各位大虾,哪有paradox(INPRISE 公司产品)数据库(*.DB)的资料? 非法操作的问题 请问各位大虾,哪有paradox(INPRISE 公司产品)数据库(*.DB)的资料? 各位大虾救命啊!请问怎么在一个DIALOG中使用RICHEDITVIEW,谢谢大家了 ACCESS的删除问题 我有“处女”情结,可.............. 菜问题,,马上给分sendto问题 while和for的区别 安装的问题 我喜欢上公司的JJ怎么办????? 谁能帮我反编译?急 1.7gmsdn如何改成3张碟刻出来 启动慢? 有什么方法实现点击"提交"按钮后,弹出一个框显示表单里的数据,"确定"后再提交,"取消"后不提交? 请教vb 字符串问题 急!明天要啊!(帮忙啊!)分在另一贴给! 请问如何创建一个组控件,然后又可以动态调用?请进!:) 用Jbuilder开发,怎样配置才能开发j2me? 关于HOOK和键盘屏蔽的问题??? 如何在自己的网页上嵌入google的页面翻译功能 有关2k的内存问题 阴谋家已被清除!大家尽兴的庆祝呀! 问一下 C++基础的弱智(20分钟内结贴) 高手请看:实形变量在不同的过程中调用问题?(大家都要遇到的问题,来着有分!) 还是没解决呀!!1 350元左右的MP3播放器谁好阿?你给推荐一下? 由于工作需要,将要转到Linux平台,请问那位知道有什么好的SQL Client在Linux下? 昨天做成功了有限集手写汉字识别的程序,高兴,散分!!! SOS。。。一个很基础的问题 。。 系统设计和软件设计的说明书问题 [请问]两个JavaScript问题 一个企业的办公系统,使用人数5k人,预算多少合适? 我中了“冰河” 怎么办? 菜鸟问题:linux下怎么把文件a和b压缩成c啊? 请问大家一些事情(关于反汇编) 菜鸟问题:linux下怎么把文件a和b压缩成c啊? 资源管理器中选中的多个文件怎样传给我的程序 高分求购网页 氧化铁与稀盐酸的反应是溶液中的离子反应么如题.强调了 “溶液中的”离子反应 电机弹簧压紧装置是什么结构,忘高手指教. 用氢氧化钠溶液处理硫在氧气中燃烧产生的气体.这句话为什么正确?请说明原因. 在化学试剂中的漂白剂 能除去所有有色溶液的的颜色吗?例如Na2O2 多元化与多样化的区别历史题中的一个选项是“从文明史观角度看,体现了中国近代文明的多元化”.这个说法对么?多样化与多元化究竟有没有区别?拜托不要乱讲啊.. 物质的量浓度相同的NH4HCO3和NaHCO3哪个中碳酸根离子浓度较大?为什么?不是都是强电解质吗? 药物制剂稳定性试验中的留样观察实验是什么,为什么药制课本上没有?它跟长期试验,或影响因素试验有关系吗? 文化多样性与文化多元化的区别 具有以下自旋量子数的原子核中,目前研究最多用途最广的是(  )  A.I=1/2; B.I=0;C.I=1;  D.I>1 3.下列化合物中的质子,化学位移最小的是( )A.溴甲烷; B.甲烷; C.碘甲烷; 药物制剂稳定性重点考察项目有关物质是什么 文化多元化与文化多样性的区别 如果想将石灰石和盐酸反应生成的气体收集起来,该如何进行操作?如果用连接好的装置 人品药剂是什么? 醋酸分子为什么可以存在于pH=8的碱性溶液中我知道那些醋酸盐水解的反例,可我想知道为什么能够存在,是因为醋酸是弱酸吗,但是它会电离出氢离子,氢离子与氢氧根离子会反应,那这样醋酸就 将石灰石和盐酸反应生成的气体收集起来 需要仪器; 连接方法;将石灰石和盐酸反应生成的气体收集起来 需要仪器; 连接方法; 惯性定律和惯性的本质是什么 室温下醋酸分子可以存在PH为8的碱性溶液吗 目前人类的科学能不能把人类“变成丧尸” 内燃机与发动机有什么区别? 包括绝对值当代数式|x+1|+|x-2|取最小值时,相应x的取值范围是(),它的最小值是(). 从人类拍丧尸开始总共有多少部丧尸片或有关丧尸片.大片和小片全都告诉我啊,一个也不能少啊.把名称也告诉我,在此我就多谢了. 在线英语考试题1,What makes a person a scientist?Does he have ways or tools of learning that are different from those of others?The answer is "no".It is not the tools a scientist uses but how he uses these tools that makes him a scientist.You w 如果地球倒着转,时间会不会受到影响? He has a fever,he should ( take takes)some medicine.选择(take还是takes) 求正确答案,这是英语考试题~Nearlyfive million people see Grand Canyon (大峡谷) each year.Most ofthem see it from their cars at overlooks along the South Rim.The South Rim isthe easiest to reach in the park..TheSouth Rim is open 24 hours 这边开山的多,拉石头填海这活怎么包?有干这个的给个指点. 一道关于绝对值的初中数学题设A,B是正整数,且56小于等于A+B小于等于59,0.9 图中()号图形是1号长方形放大后的图形,它是按():()的比放大的. 丝绸之路引进了哪些物品? 04年天原杯化学的一道题A、B、C三种物质各15克,它们发生化合反应时,生成30克新物质D.若增加10克C,A与C恰好完全反应,则A与B参加反应的质量比为…………………………………………( )(A)1:1 (B)2: 什么是氧族元素? 求:“企业发展需要无私奉献”辩论赛视频 天原杯的化学题向AgNO3,Cu(NO3)2的混合溶液中加入一些锌粉,完全反应后过滤.不可能存在的情况是:A.滤纸上有Ag,滤液中银离子,铜离子,镁离子,锌离子B.滤纸上有Ag,Cu,滤液中有银离子,锌离子,镁离 氧族元素1.实验室制取SO2为什么只用中等浓度的H2SO4,不用浓H2SO4或稀H2SO4呢?2.为什么SO2不能使酸碱指示剂褪色? 企业进行辩论赛,哪些辩论题目比较适合,越多越好, 一道化学题(2005天原杯山东)溶液的碱性强弱跟溶液中的OH-的数量有关.一定体积的溶液中,OH-数量越多,则溶液的碱性越强.10%的NaOH溶液,与10%的KOH溶液相比较(溶液密度相同).碱性更强的是?A 什么叫氧族元素 辩论赛个人发展靠 企业辩论赛正方观点,个人发展靠自己,反方观点,个人发展靠企业.我是反方.求能问倒对方的问题 未来的人类是不是会越长越高?因为父母的基因的话,每一代的小孩都应该会更高.再这样下一代的孩子又会比上一代更高不是吗?还是又有其他别的因素影响人类的身高发展? 关于氧族元素的问题下列事实能说明元素R一定是氧族元素的是A R为非金属元素,其氧化物对应水化物的化学式H2RO3B R的单质与H2生成H2RC R的单质可与Al反映生成Al2R3D R的氢化物的水溶液显酸性 l should to take some medicine after meals.题中有你个错误的单词,请写出来,并改正. Sarah should take some medicine.变成疑问Should Sarah take any medicine?应该怎么回答? 氧族元素的题2 工业上从含硒的废料中提取硒的方法之一是用H2SO4和NaNO3处理废料,获得亚硒酸和少量硒酸,加入盐酸共热,硒酸被转化为亚硒酸:2HCl+H2SeO4=H2SeO3+Cl2↑+H2O再将SO2通入亚硒酸的溶液 图纸里厕所前画个虚线圆代表什么两个座式的 其中一个是残疾人用的 虚线圆画在残疾人厕所门前 感激不尽 托福怎么拿成绩呀我大概在6月份考了一次,在上海中学,一直没拿成绩,现在还该怎么拿呢? 1斤奶出多少酸奶 西方有北约,东方有这方面的联盟吗?如题 弹簧用在哪 氧族元素随着核电荷数/////的增加?原子获得电子的能力如何? 室温下,醋酸分子可能存在于PH=8的碱性溶液中.这句话我什么是对的? 关于NaHCO3和NH4HCO3的一个问题取一定量NaHCO3和NH4HCO3分别加热到300℃使之完全分解,在该温度和相同压强下,分别收集到的气体体积之比是1:6,则原来NaHCO3和NH4HCO3的物质的量之比是______.解析:有2Na 下列曲线分别表示元素的某种性质与核电荷数的关系(Z为核电荷数,Y为元素的有关性质)把与下列的元素有关的性质相符的曲线的标号填入相应括号中:(1)第三周期元素单质的熔点( ) NBA西部联盟和东部联盟是什么意思? 托福成绩单怎么取呢! FE\ GE\ 走IP的物理线是什么?光纤是能传递ATM或者IP的信号对吗?155M SDH这些之类的都是什么啊?电口光口都是什么啊?有点混乱 7.下列说法中,不正确的是A.室温下,CH3COOH分子可以存在于pH=8的碱性溶7.下列说法中,不正确的是A.室温下,CH3COOH分子可以存在于pH=8的碱性溶液中B.在0.1 mol•L-1的氢溴酸中加入适量的蒸馏 2011天原杯化学复赛 我明年九月要出国,可是托福现在只有40分,要怎么样学,可以考到一百分 我看到一款电机里边有个弹簧,目的是轴承预载, 取一定量的NaHCO3和NH4HCO3分别加热到300℃,使之完全分解,在同温(T≥100℃)同压下体积比为1:6.取一定量的NaHCO3和NH4HCO3分别加热到300℃,使之完全分解,在同温(T≥100℃)同压下体积比为1:6,求NaHCO3和NH 美国海军一高官被控受贿 其中包括性贿《好声音》第三季冠名2.5亿 浙江卫法国前部长称法国总统奥朗德头号问题是阿盟秘书长称支持卜拉希米就叙问题斡旋日本一司机醉酒驾车连撞5名女中学生后英国三百余名议员被指仍挪公款用于日常韩国总统朴槿惠巴黎会见联合国教科文组加拿大10岁男童发现超新星 为全球最中央印发通知要求开展“四风”突出问题存在环境违法 北京35家餐饮企业和单河南警方异地用警突查涉黄会所 搜出大南京富二代杀妻案开审 被告人称自首否澳12岁少年成商界奇才 开养鸡场月赚阿富汗总统批美击毙巴基斯坦塔利班头目想坐飞机逃生门附近座位?德航新规定要印尼组织攻击澳大利亚百家网站 抗议澳湖南永兴庭审致7死煤矿瓦斯事故案 1金冠网店20万元起步 揭开网店\"黑老师在大厦里办起\"培优班\" 课堂吉星鹏杀妻案开审 被告人称自首否认故伊朗称希望与“六方”就核计划开展严肃马云要改变医院!什么才是他想要的未来四名中国人因走私犀牛角在坦桑尼亚被判AH高溢价持续,该如何看待?天津西青历时半年办技能大赛培训技能人中年过后哪些人的福运好国农控股发布澄清消息金沙中国庆祝澳门瑞吉酒店盛大开幕贺天举声援郭艾伦:球场不是战场苏群:行凶者未被抓,望提供线索霍楠:行凶球迷应被终身禁止观赛许晋哲:打得太自私,输球很正常本溪赛区,你的安保工作怎么了?于嘉:希望这次教训让不文明停止郭艾伦眼睑缝针,拆线前无法参赛文平范加尔:满意巴雷拉等小将的表现打鸡血|老师弄了一个非智能手机 20花呗到期会自动从支付宝余额宝扣款吗如何从出生日期看你能从政当官吗我们眼中的2015互联网10大产品事他活到107岁,94岁还在交易,68
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘