Spark在不同集群中的运行演示

转载地址:http://www.cnblogs.com/shishanyuan/archive/2015/08/19/4721326.html

在以下运行演示过程中需要启动Hadoop和Spark集群,其中Hadoop需要启动HDFS和YARN,启动过程可以参见第三节《Spark编程模型(上)--概念及Shell试验》。

1 Standalone运行过程演示

在Spark集群的节点中,40%的数据用于计算,60%的内存用于保存结果,为了能够直观感受数据在内存和非内存速度的区别,在该演示中将使用大小为1G的Sogou3.txt数据文件(参见第三节《Spark编程模型(上)--概念及Shell试验》的3.2测试数据文件上传),通过对比得到差距。

1.1 查看测试文件存放位置

使用HDFS命令观察Sogou3.txt数据存放节点的位置

$cd /app/hadoop/hadoop-2.2.0/bin
$hdfs fsck /sogou/SogouQ3.txt -files -blocks -locations
通过可以看到该文件被分隔为9个块放在集群中

1.2启动Spark-Shell

通过如下命令启动Spark-Shell,在演示当中每个Executor分配1G内存

$cd /app/hadoop/spark-1.1.0/bin
$./spark-shell --master spark://hadoop1:7077 --executor-memory 1g
通过Spark的监控界面查看Executors的情况,可以观察到有1个Driver 和3个Executor,其中hadoop2和hadoop3启动一个Executor,而hadoop1启动一个Executor和Driver。在该模式下Driver中运行SparkContect,也就是DAGSheduler和TaskSheduler等进程是运行在节点上,进行Stage和Task的分配和管理。


1.3运行过程及结果分析

第一步   读取文件后计算数据集条数,并计算过程中使用cache()方法对数据集进行缓存

val sogou=sc.textFile("hdfs://hadoop1:9000/sogou/SogouQ3.txt")
sogou.cache()
sogou.count()
通过页面监控可以看到该作业分为8个任务,其中一个任务的数据来源于两个数据分片,其他的任务各对应一个数据分片,即显示7个任务获取数据的类型为(NODE_LOCAL),1个任务获取数据的类型为任何位置(ANY)。

在存储监控界面中,我们可以看到缓存份数为3,大小为907.1M,缓存率为38%


运行结果得到数据集的数量为1000万笔数据,总共花费了352.17秒

第二步   再次读取文件后计算数据集条数,此次计算使用缓存的数据,对比前后

sogou.count()
通过页面监控可以看到该作业还是分为8个任务,其中3个任务数据来自内存(PROCESS_LOCAL),3个任务数据来自本机(NODE_LOCAL),其他2个任务数据来自任何位置(ANY)。任务所耗费的时间多少排序为:ANY> NODE_LOCAL> PROCESS_LOCAL,对比看出使用内存的数据比使用本机或任何位置的速度至少会快2个数量级。

整个作业的运行速度为34.14秒,比没有缓存提高了一个数量级。由于刚才例子中数据只是部分缓存(缓存率38%),如果完全缓存速度能够得到进一步提升,从这体验到Spark非常耗内存,不过也够快、够锋利!


2 YARN-Client运行过程演示

2.1 启动Spark-Shell

通过如下命令启动Spark-Shell,在演示当中分配3个Executor、每个Executor为1G内存

$cd /app/hadoop/spark-1.1.0/bin
$./spark-shell --master YARN-client --num-executors 3 --executor-memory 1g
第一步   把相关的运行JAR包上传到HDFS中

通过HDFS查看界面可以看到在 /user/hadoop/.sparkStaging/应用编号,查看到这些文件:


第二步   启动Application Master,注册Executor

应用程序向ResourceManager申请启动Application Master,在启动完成后会分配Cotainer并把这些信息反馈给SparkContext,SparkContext和相关的NM通讯,在获得的Container上启动Executor,从下图可以看到在hadoop1、hadoop2和hadoop3分别启动了Executor


第三步   查看启动结果

YARN-Client模式中,Driver在客户端本地运行,这种模式可以使得Spark Application和客户端进行交互,因为Driver在客户端所以可以通过webUI访问Driver的状态,默认是http://hadoop1:4040访问,而YARN通过http:// hadoop1:8088访问。



2.2 运行过程及结果分析

第一步   读取文件后计算数据集条数,并计算过程中使用cache()方法对数据集进行缓存

val sogou=sc.textFile("hdfs://hadoop1:9000/sogou/SogouQ3.txt")
sogou.cache()
sogou.count()
通过页面监控可以看到该作业分为8个任务,其中一个任务的数据来源于两个数据分片,其他的任务各对应一个数据分片,即显示7个任务获取数据的类型为(NODE_LOCAL),1个任务获取数据的类型为任何位置(RACK_LOCAL)。

通过运行日志可以观察到在所有任务结束的时候,由 YARNClientScheduler通知YARN集群任务运行完毕,回收资源,最终关闭SparkContext,整个过程耗费108.6秒。


第二步   查看数据缓存情况

通过监控界面可以看到,和Standalone一样38%的数据已经缓存在内存中


第三步   再次读取文件后计算数据集条数,此次计算使用缓存的数据,对比前后

sogou.count()
通过页面监控可以看到该作业还是分为8个任务,其中3个任务数据来自内存(PROCESS_LOCAL),4个任务数据来自本机(NODE_LOCAL),1个任务数据来自机架(RACK_LOCAL)。对比在内存中的运行速度最快,速度比在本机要快至少1个数量级。

YARNClientClusterScheduler替代了Standalone模式下得TaskScheduler进行任务管理,在任务结束后通知YARN集群进行资源的回收,最后关闭SparkContect。部分缓存数据运行过程耗费了29.77秒,比没有缓存速度提升不少。


3 YARN-Cluster运行过程演示

3.1 运行程序

通过如下命令启动Spark-Shell,在演示当中分配3个Executor、每个Executor为512M内存

$cd /app/hadoop/spark-1.1.0
$./bin/spark-submit --master YARN-cluster --class class3.SogouResult --executor-memory 512m LearnSpark.jar hdfs://hadoop1:9000/sogou/SogouQ3.txt  hdfs://hadoop1:9000/class3/output2
第一步   把相关的资源上传到HDFS中,相对于YARN-Client多了LearnSpark.jar文件

这些文件可以在HDFS中找到,具体路径为 http://hadoop1:9000/user/hadoop/.sparkStaging/应用编号 :



第二步   YARN集群接管运行

首先YARN集群中由ResourceManager分配Container启动SparkContext,并分配运行节点,由SparkConext和NM进行通讯,获取Container启动Executor,然后由SparkContext的YarnClusterScheduler进行任务的分发和监控,最终在任务执行完毕时由YarnClusterScheduler通知ResourceManager进行资源的回收。


3.2 运行结果

在YARN-Cluster模式中命令界面只负责应用的提交,SparkContext和作业运行均在YARN集群中,可以从http:// hadoop1:8088查看到具体运行过程,运行结果输出到HDFS中,如下图所示:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值