您的位置:首页 > 其它

[Spark浅析][1]概念及简单集群搭建

2014-12-30 10:47 267 查看
最近开始接触Spark,遇到了很多坑和困惑的地方,打算把它们写成一个文章系列,避免自己以后遗忘,更希望能帮助更多想学习Spark的人。本文所用的措辞若不另说明,则是根据自己的理解原创所得,具有一定的主观性,如果有的地方理解的不对还请各位不吝指出,在此感谢!

一、Hadoop MapReduce和Spark简介、二者的区别与联系

Hadoop MapReduce是一个分布式计算框架,稳定性好,普适性高,最初的版本是MRv1(第一代MapReduce),其最典型的特征就是拥有map和reduce两个主要数据处理过程,map过程将从HDFS读入的数据进行处理再写回本地磁盘(注意不是HDFS),JobTracker(MRv1的调度器)则维护这些map结果在本地磁盘的位置以提供给reduce阶段,reduce阶段从这些位置上再次读取已经map的数据,最后将处理完的reduce结果写回HDFS。JobTracker对资源的调度控制主要以map
slots和reduce slots为指标,这样会有个隐患,如果某个任务占用的过多的map slot或者过多的reduce slot,则有可能会阻塞其他任务的执行,即使这个大人物只需要很少的内存和CPU,这样明显导致了资源分配的不合理。

MRv1在长期的实践应用中被证明是一种很可靠的分布式计算解决方案,不过它的缺陷也是显而易见的——map阶段的结果需要重写写回本地磁盘、reduce阶段的结果不能很方便的重复迭代利用、资源分配不合理等等,于是诞生了MRv2,也即第二代MapReduce,也称作YARN。YARN解决了资源分配不合理的问题,它重新采用内存用量作为其对资源的衡量指标,抛弃了原来的map
slots和reduce slots,这样一来YARN对资源的掌控和调度变得更加合理。不过YARN仍然需要将map阶段的结果写回本地磁盘,也存在reduce阶段结果不方便迭代利用的缺点。

为了解决YARN每个步骤都需要写回本地磁盘性能上的缺点,Apache开发了Tez,Tez可以将若干个可以构成DAG的MapReduce任务组合成一个大的MapReduce任务,减少了中间结果写回本地磁盘的次数,如下图所示(图片来自:http://tez.apache.org/):





Tez在本质上并没有改变MapReduce的计算模型,只是通过简化计算流程来提高性能。

总的来说,MapReduce(包括MRv1和YARN)都是磁盘计算框架,稳定性好,但是性能低。而Spark是一种内存计算框架,众所周知目前内存的读取速率是非固态硬盘的十几倍,将中间结果存放在内存中而非磁盘中,对性能会有很大提升。Spark支持弹性内存模式,也即可以让数据的一部分存放在内存中,另一部分存放在磁盘中,以便应对集群内存不足或任务资源受限的情况。Spark还支持多种编程范式诸如map、reduce、flatMap、union、count、join等,远比MapReduce灵活。Spark采用函数式编程惰性求值(Lazy
evaluation)的方式来处理数据,避免重复计算。所以Spark特别适合机器学习等需要多次迭代的应用场景。

Spark主要采用Scala开发,同时支持Java和Python。

二、Spark集群简单搭建

首先从Spark官网上下载Spark,可以选择编译好的版本或者源码,选择pre-build时注意hadoop的版本。

Spark有standalone模式和YARN模式(还有Mesos模式等,在此不再详述),standalone模式将Spark作为一个独立的集群来看待,Spark自己独立分配集群资源,不受其他约束。而Spark on YARN指的是采用YARN的调度器来为Spark分配资源,让Spark任务在YARN的调度下运行,并不是说把Spark任务转换成MapReduce任务。下面主要以standalone模式为例,对于YARN模式会给出说明。

和搭建Hadoop集群类似,Spark也需要首先进行简单配置,需要配置的有:

1. conf/slaves,每行写一个slave的ip或者host。(如果没有该文件自己创建一个即可,不过一般会有一个conf/slaves.template)

2. conf/spark-env.sh,只需要指定SPARK_MASTER_IP=XXX就可以,其他可以暂时采用默认。对于YARN模式,还需要指定HADOOP_CONF_DIR=XXX,用来让Spark连接Hadoop集群。(同样,如果没有的话,复制一下conf/spark-env.sh.template)

以上配置便已经可以正常使用Spark的基础功能了,然后将修改好的Spark文件夹分发到集群各台机器的相同位置上,然后在master节点运行sbin/start-all.sh,运行成功后在浏览器输入http://xxx:8080就能看到Spark的Overview页面了(xxx为master节点的ip或host),如下图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: