Hadoop vs Spark性能对比
http://www.cnblogs.com/jerrylead/archive/2012/08/13/2636149.html
Hadoop vs Spark性能对比
基于Spark-0.4和Hadoop-0.20.2
1. Kmeans
数据:自己产生的三维数据,分别围绕正方形的8个顶点
{0, 0, 0}, {0, 10, 0}, {0, 0, 10}, {0, 10, 10},
{10, 0, 0}, {10, 0, 10}, {10, 10, 0}, {10, 10, 10}
| Point number | 189,918,082 (1亿9千万个三维点) | 
| Capacity | 10GB | 
| HDFS Location | /user/LijieXu/Kmeans/Square-10GB.txt | 

程序逻辑:
| 读取HDFS上的block到内存,每个block转化为RDD,里面包含vector。 然后对RDD进行map操作,抽取每个vector(point)对应的类号,输出(K,V)为(class,(Point,1)),组成新的RDD。 然后再reduce之前,对每个新的RDD进行combine,在RDD内部算出每个class的中心和。使得每个RDD的输出只有最多K个KV对。 最后进行reduce得到新的RDD(内容的Key是class,Value是中心和,再经过map后得到最后的中心。 | 
先上传到HDFS上,然后在Master上运行
| root@master:/opt/spark# ./run spark.examples.SparkKMeans master@master:5050 hdfs://master:9000/user/LijieXu/Kmeans/Square-10GB.txt 8 2.0 | 
迭代执行Kmeans算法。
一共160个task。(160 * 64MB = 10GB)
利用了32个CPU cores,18.9GB的内存。
每个机器的内存消耗为4.5GB (共40GB)(本身points数据10GB*2,Map后中间数据(K, V) => (int, (vector, 1)) (大概10GB)

最后结果:
| 0.505246194 s Final centers: Map(5 -> (13.997101228817169, 9.208875044622895, -2.494072457488311), 8 -> (-2.33522333047955, 9.128892414676326, 1.7923150585737604), 7 -> (8.658031587043952, 2.162306996983008, 17.670646829079146), 3 -> (11.530154433698268, 0.17834347219956842, 9.224352885937776), 4 -> (12.722903153986868, 8.812883284216143, 0.6564509961064319), 1 -> (6.458644369071984, 11.345681702383024, 7.041924994173552), 6 -> (12.887793408866614, -1.5189406469928937, 9.526393664105957), 2 -> (2.3345459304412164, 2.0173098597285533, 1.4772489989976143)) | 
50MB/s 10GB => 3.5min
10MB/s 10GB => 15min
在20GB的数据上测试
| Point number | 377,370,313 (3亿7千万个三维点) | 
| Capacity | 20GB | 
| HDFS Location | /user/LijieXu/Kmeans/Square-20GB.txt | 
运行测试命令:
| root@master:/opt/spark# ./run spark.examples.SparkKMeans master@master:5050 hdfs://master:9000/user/LijieXu/Kmeans/Square-20GB.txt 8 2.0 | tee mylogs/sqaure-20GB-kmeans.log | 
得到聚类结果:
| Final centers: Map(5 -> (-0.47785701742763115, -1.5901830956323306, -0.18453046159033773), 8 -> (1.1073911553593858, 9.051671594514225, -0.44722211311446924), 7 -> (1.4960397239284795, 10.173412443492643, -1.7932911100570954), 3 -> (-1.4771114031182642, 9.046878176063172, -2.4747981387714444), 4 -> (-0.2796747780312184, 0.06910629855122015, 10.268115903887612), 1 -> (10.467618592186486, -1.168580362309453, -1.0462842137817263), 6 -> (0.7569895433952736, 0.8615441990490469, 9.552726007309518), 2 -> (10.807948500515304, -0.5368803187391366, 0.04258123037074164)) | 
基本就是8个中心点
内存消耗:(每个节点大约5.8GB),共50GB左右。

内存分析:
20GB原始数据,20GB的Map输出
| 迭代次数 | 时间 | 
| 1 | 108 s | 
| 2 | 0.93 s | 
12/06/05 11:11:08 INFO spark.CacheTracker: Looking for RDD partition 2:302
12/06/05 11:11:08 INFO spark.CacheTracker: Found partition in cache!
在20GB的数据上测试(迭代更多的次数)
| root@master:/opt/spark# ./run spark.examples.SparkKMeans master@master:5050 hdfs://master:900 0/user/LijieXu/Kmeans/Square-20GB.txt 8 0.8 | 
Task数目:320
时间:
| 迭代次数 | 时间 | 
| 1 | 100.9 s | 
| 2 | 0.93 s | 
| 3 | 4.6 s | 
| 4 | 3.9 s | 
| 5 | 3.9 s | 
| 6 | 3.9 s | 
迭代轮数对内存容量的影响:

基本没有什么影响,主要内存消耗:20GB的输入数据RDD,20GB的中间数据。
| Final centers: Map(5 -> (-4.728089224526789E-5, 3.17334874733142E-5, -2.0605806380414582E-4), 8 -> (1.1841686358289191E-4, 10.000062966002101, 9.999933240005394), 7 -> (9.999976672588097, 10.000199556926772, -2.0695123602840933E-4), 3 -> (-1.3506815993198176E-4, 9.999948270638338, 2.328148782609023E-5), 4 -> (3.2493629851483764E-4, -7.892413981250518E-5, 10.00002515017671), 1 -> (10.00004313126956, 7.431996896171192E-6, 7.590402882208648E-5), 6 -> (9.999982611661382, 10.000144597573051, 10.000037734639696), 2 -> (9.999958673426654, -1.1917651103354863E-4, 9.99990217533504)) | 
结果可视化

2. HdfsTest
测试逻辑:
| package spark.examples import spark._ object HdfsTest { def main(args: Array[String]) { val sc = new SparkContext(args(0), "HdfsTest") val file = sc.textFile(args(1)) val mapped = file.map(s => s.length).cache() for (iter <- 1 to 10) { val start = System.currentTimeMillis() for (x <- mapped) { x + 2 } // println("Processing: " + x) val end = System.currentTimeMillis() println("Iteration " + iter + " took " + (end-start) + " ms") } } } | 
首先去HDFS上读取一个文本文件保存在file
再次计算file中每行的字符数,保存在内存RDD的mapped中
然后读取mapped中的每一个字符数,将其加2,计算读取+相加的耗时
只有map,没有reduce。
测试10GB的Wiki
实际测试的是RDD的读取性能。
| root@master:/opt/spark# ./run spark.examples.HdfsTest master@master:5050 hdfs://master:9000:/user/LijieXu/Wikipedia/txt/enwiki-20110405.txt | 
测试结果:
| Iteration 1 took 12900 ms = 12s Iteration 2 took 388 ms Iteration 3 took 472 ms Iteration 4 took 490 ms Iteration 5 took 459 ms Iteration 6 took 492 ms Iteration 7 took 480 ms Iteration 8 took 501 ms Iteration 9 took 479 ms Iteration 10 took 432 ms | 
每个node的内存消耗为2.7GB (共9.4GB * 3)

实际测试的是RDD的读取性能。
| root@master:/opt/spark# ./run spark.examples.HdfsTest master@master:5050 hdfs://master:9000/user/LijieXu/Wikipedia/txt/enwiki-20110405.txt | 
测试90GB的RandomText数据
| root@master:/opt/spark# ./run spark.examples.HdfsTest master@master:5050 hdfs://master:9000/user/LijieXu/RandomText90GB/RandomText90GB | 
耗时:
| 迭代次数 | 耗时 | 
| 1 | 111.905310882 s | 
| 2 | 4.681715228 s | 
| 3 | 4.469296148 s | 
| 4 | 4.441203887 s | 
| 5 | 1.999792125 s | 
| 6 | 2.151376037 s | 
| 7 | 1.889345699 s | 
| 8 | 1.847487668 s | 
| 9 | 1.827241743 s | 
| 10 | 1.747547323 s | 
内存总消耗30GB左右。
单个节点的资源消耗:

3. 测试WordCount
写程序:
| import spark.SparkContext import SparkContext._ object WordCount { def main(args: Array[String]) { if (args.length < 2) { System.err.println("Usage: wordcount <master> <jar>") System.exit(1) } val sp = new SparkContext(args(0), "wordcount", "/opt/spark", List(args(1))) val file = sp.textFile("hdfs://master:9000/user/LijieXu/Wikipedia/txt/enwiki-20110405.txt"); val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _) counts.saveAsTextFile("hdfs://master:9000/user/Output/WikiResult3") } } | 
打包成mySpark.jar,上传到Master的/opt/spark/newProgram。
运行程序:
| root@master:/opt/spark# ./run -cp newProgram/mySpark.jar WordCount master@master:5050 newProgram/mySpark.jar | 
Mesos自动将jar拷贝到执行节点,然后执行。
内存消耗:(10GB输入file + 10GB的flatMap + 15GB的Map中间结果(word,1))
还有部分内存不知道分配到哪里了。
耗时:50 sec(未经过排序)
Hadoop WordCount耗时:120 sec到140 sec
结果未排序
单个节点:

Hadoop测试
Kmeans
运行Mahout里的Kmeans
| root@master:/opt/mahout-distribution-0.6# bin/mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job -Dmapred.reduce.tasks=36 -i /user/LijieXu/Kmeans/Square-20GB.txt -o output -t1 3 -t2 1.5 -cd 0.8 -k 8 -x 6 | 
在运行(320个map,1个reduce)
Canopy Driver running buildClusters over input: output/data
时某个slave的资源消耗情况


Completed Jobs
| Jobid | Name | Map Total | Reduce Total | Time | 
| Input Driver running over input: /user/LijieXu/Kmeans/Square-10GB.txt | 160 | 0 | 1分2秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-0/part-randomSeed | 160 | 1 | 1分6秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-1 | 160 | 1 | 1分7秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-2 | 160 | 1 | 1分7秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-3 | 160 | 1 | 1分6秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-4 | 160 | 1 | 1分6秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-5 | 160 | 1 | 1分5秒 | |
| KMeans Driver running clusterData over input: output/data | 160 | 0 | 55秒 | |
| Input Driver running over input: /user/LijieXu/Kmeans/Square-20GB.txt | 320 | 0 | 1分31秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-0/part-randomSeed | 320 | 36 | 1分46秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-1 | 320 | 36 | 1分46秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-2 | 320 | 36 | 1分46秒 | |
| KMeans Driver running runIteration over clustersIn: output/clusters-3 | 320 | 36 | 1分47秒 | |
| KMeans Driver running clusterData over input: output/data | 320 | 0 | 1分34秒 | 
运行多次10GB、20GB上的Kmeans,资源消耗


Hadoop WordCount测试


Spark交互式运行
进入Master的/opt/spark
运行
| MASTER=master@master:5050 ./spark-shell | 
打开Mesos版本的spark
在master:8080可以看到framework
Active Frameworks
| ID | User | Name | Running Tasks | CPUs | MEM | Max Share | Connected | 
| 201206050924-0-0018 | root | 0 | 0 | 0.0 MB | 0.00 | 2012-06-06 21:12:56 | 
| scala> val file = sc.textFile("hdfs://master:9000/user/LijieXu/Wikipedia/txt/enwiki-20110405.txt") scala> file.first scala> val words = file.map(_.split(' ')).filter(_.size < 100) //得到RDD[Array[String]] scala> words.cache scala> words.filter(_.contains("Beijing")).count 12/06/06 22:12:33 INFO SparkContext: Job finished in 10.862765819 s res1: Long = 855 scala> words.filter(_.contains("Beijing")).count 12/06/06 22:12:52 INFO SparkContext: Job finished in 0.71051464 s res2: Long = 855 scala> words.filter(_.contains("Shanghai")).count 12/06/06 22:13:23 INFO SparkContext: Job finished in 0.667734427 s res3: Long = 614 scala> words.filter(_.contains("Guangzhou")).count 12/06/06 22:13:42 INFO SparkContext: Job finished in 0.800617719 s res4: Long = 134 | 
由于GC的问题,不能cache很大的数据集。
Hadoop vs Spark性能对比的更多相关文章
- 【转】Hadoop vs Spark性能对比
		原文地址:http://www.cnblogs.com/jerrylead/archive/2012/08/13/2636149.html 基于Spark-0.4和Hadoop-0.20.2 1. K ... 
- hadoop之Spark强有力竞争者Flink,Spark与Flink:对比与分析
		hadoop之Spark强有力竞争者Flink,Spark与Flink:对比与分析 Spark是一种快速.通用的计算集群系统,Spark提出的最主要抽象概念是弹性分布式数据集(RDD),它是一个元素集 ... 
- PageRank在Hadoop和spark下的实现以及对比
		关于PageRank的地位,不必多说. 主要思想:对于每个网页,用户都有可能点击网页上的某个链接,例如 A:B,C,D B:A,D C:AD:B,C 由这个我们可以得到网页的转移矩阵 A ... 
- spark读写hbase性能对比
		一.spark写入hbase hbase client以put方式封装数据,并支持逐条或批量插入.spark中内置saveAsHadoopDataset和saveAsNewAPIHadoopDatas ... 
- Hadoop和Spark的Shuffer过程对比解析
		Hadoop Shuffer Hadoop 的shuffer主要分为两个阶段:Map.Reduce. Map-Shuffer: 这个阶段发生在map阶段之后,数据写入内存之前,在数据写入内存的过程就已 ... 
- [Big Data]从Hadoop到Spark的架构实践
		摘要:本文则主要介绍TalkingData在大数据平台建设过程中,逐渐引入Spark,并且以Hadoop YARN和Spark为基础来构建移动大数据平台的过程. 当下,Spark已经在国内得到了广泛的 ... 
- [转载] 从Hadoop到Spark的架构实践
		转载自http://www.csdn.net/article/2015-06-08/2824889 http://www.zhihu.com/question/26568496 当下,Spark已经在 ... 
- [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
		本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ... 
- 从Hadoop到Spark的架构实践
		当下,Spark已经在国内得到了广泛的认可和支持:2014年,Spark Summit China在北京召开,场面火爆:同年,Spark Meetup在北京.上海.深圳和杭州四个城市举办,其中仅北京就 ... 
随机推荐
- 注册Goole 账户 成功注册
			注册谷歌邮箱等Google帐号时提示:此电话号码无法用于进行验证怎么办? 相信很多网友在注册Google帐号的时候需要手机号码验证,比如在遇到过注册Google Gmail到最后一步“验证您的帐号” ... 
- HDU 3472 HS BDC (混合图的欧拉路径判断)
			HS BDC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ... 
- DTrace memory leak 内存泄露
			http://blog.sina.com.cn/s/blog_538040b70100eecn.html 如下程序用于跟踪,在分配和回收都会触发探针 #!/usr/sbin/dtrace -s p ... 
- 最近5年183个Java面试问题列表及答案[最全]
			Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ... 
- MTK65XX平台充电调试总结
			MTK平台充电调试总结 摘要:调试电池的充放电管理,首先须要深入了解锂电池的电池原理和特点.充放电特性以及主要的电池安全问题.然后须要对MTK的电池管理驱动程序有深入的了解.理解电池充放电算法的基本原 ... 
- [Office Web Apps]实现在线office文档预览
			摘要 在使用office web apps实现office文档在线预览的时候,需要注意的地方. web api web api作为owa在线预览服务回调的接口,这里面核心代码片段如下: using H ... 
- mysql slave 主从 指定表 通配符
			slave配置 slave端有可能,只复制部分表,有一些表不需要备份配置如下: 有一些表你可能做水平或则垂直的处理.如果表的前几位一样,就可以用通配符%匹配 replicate-wild-ignore ... 
- AngularJS使用angular-formly进行表单验证
			当验证表单中有很多字段时,这时候可能希望把html的生成以及验证逻辑放到controller中,在页面,也许是这样的: <some-form fiedls="vm.someFields ... 
- .net连mysql数据库汇总
			另外MySql官方出了一个在csharp里面连接MySql的Connector,可以试试 http://dev.mysql.com/downloads/#connector-net <add n ... 
- firedac连接WINDOWS的ORACLE
			firedac连接WINDOWS的ORACLE 首先安装OCI FOR WINDOWS.OCI分WIN32和WIN64,且OCI的版本要和ORACLE的版本相一致才行. FIREDAC指定OCI驱动程 ... 
