![v2-74b0078c7cd4ea005d88a308d34aa3e2_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=3398c7b3-3a2a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-74b0078c7cd4ea005d88a308d34aa3e2_1440w.jpg?source=172ae18b)
今天终于要开始来写一写分布式计算的那些拧巴事儿了!
我之前一直有个误解,以为 Spark和Hdfs是两个互相取代的东西,Hdfs和MapReduce是绑在一起的。最近才发现,完全不是这样... 正确的理解应该是:
Spark和MapReduce才是‘竞争关系’,它们都是分布式计算的工具而已。而Hdfs几乎是分布式计算都会采用的文件存储系统,hdfs的全称是hadoop distributed file system。其中Hadoop指的是分布式计算分态圈。
![v2-51a4abaf9801d7e587b60bc3b58ae635_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=3398c7b3-3a2a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-51a4abaf9801d7e587b60bc3b58ae635_b.jpg)
hadoop就是谷歌三宝的开源Java实现,'谷歌三宝'为谷歌的三篇论文(注意:对应的源码谷歌没有开源):MapReduce,GFS,bigtable。Hadoop如今已经是大数据框架的代名词了。
(参考:大数据框架Hadoop科普 - 云+社区 - 腾讯云 )
一、 Spark在哪儿?
上图没有Spark. 因为Spark是后起之秀。它的地位应该是在上图MapReduce那里,因为Spark主要用内存进行数据的处理,而且兼容HDFS, 且对python的库很友好,对sql很支持,而python, sql是大数据应用最广的工具了,所以Spark在分布式计算生态圈里前景很好。
划重点:Spark只是数据计算(编程)的工具,它不是个文件存储系统。 hdfs才是文件存储系统。所在 Spark需要处理海量数据时,需要在hdfs的基础上进行(依存关系,不是竞争关系)。
二、如何用Spark?
一般的Spark教程主要在rdd上,自己练习的话完全可以在local mode下进行,这种情况下完全不需要考虑hdfs。读取本地文件,在计算机多核里计算,就可以了。在使用样本数据的时候一般这么操作,用来验证脚本的可行性。
但是在工作中,我们需要在集群模式下进行Spark实战。因为数据海量了,必须用hdfs了, hdfs就是用多个计算机形成的集群来存数据。所以,这篇重点在于介绍如何使用spark cluster.
而如何在集群模式下进行Spark实战呢?有三种办法:
1 是用Spark Standalone
2 是用Hadoop YARN
3 是用Mesos
Spark Standalone 相当于diy攒机,相对复杂。Hadoop YARN相当于买回家就可以直接开机使用的整机,比diy攒机简单。Mesos是嫡系但我不会用所以这篇不讲。
挖坑:Pyspark和Spark是什么关系?
三、用Spark Standalone。 这里介绍的是在AWS EC2上diy.
- 前提条件:租个aws ec2, 再git clone一个spark-ec2: amplab/spark-ec2 并注意要git checkout branch-2.0
- spark-ec2的作用是:可以帮你在aws上启一个新的集群,关掉一个正在用的集群,登进你的集群。它还会自动帮你在aws上设置好 spark和 hdfs。
3.1 启动一个集群,并且指定你希望用几个slave/worker:
本机$ ./spark-ec2 -k k_name -i pem_name.pem -s 1 -r us-west-2 -z us-west-2a launch ec2-example
注:上述就会在aws上启动两个instances, 一个是master一个是slave.
3.2 现在集群已经起来了,接下来登进:
本机 $./spark-ec2 -k k_name -i pem_name.pem -r us- west-2 -z us-west-2a login ec2-example
3.3 现在进行开发/计算模式,有两个运行spark的方式:
一个是直接在aws上机器的shell里面玩,用这个命令进行pyspark的shell:
awsip$ ~/spark/bin/pyspark
一个是先在本地写好python script, 再运行,即spark-submit。这里的本地是指在自己的local模式下写的脚本,即用本机多线程模拟cluster的产物。
这个有个坑要注意! 即在本地写的script里一般都会从本地读数据文件进来,在运行spark-submit之前,要先把这个数据文件拷贝到所有的节点上。否则submit之后,集群计算时会在某个结点读你的数据,然后就会报错说找不到。拷贝的命令也在上述提到的spark-ec2那个git项目里有写。比如:
先把本机的输入文件传到aws master结点上,
scp -i Dir/pem_name.pem –r YourDir/* root@ec2-54- 203-2-57.us-west-2.compute.amazonaws.com:~/DIR
再从aws master结点拷到其它结点:
~/spark-ec2/copy-dir ~/DIR
另外还需要更新一下在本地写的script,主要体现在两点:一是设置master node address and its port。 这个地址在Spark web UI里会写。(怎么打开Spark web UI? 请自己搜索)。二是把读文件的路径改为"file:///absolute_path"
最后,在主结点上submit就可以了:
~/spark/bin/spark-submit --deploy-mode client example.py > output.txt
四、用Hadoop YARN运行Spark。
4.1 关于YARN的科普。全称是yet another resource negotiator,“就是一种资源管理器”的意思,没错,跟“有家客栈”异曲同功。大多数的hadoop在安装时都在hdfs层面自带了yarn的配置。它的好处是不需要自己在每个结点上安装spark了,它都给你安排好了。
Amazon EMR天生兼容hadoop yarn上面的spark。
4.1 在aws emr的界面里选择create cluster, 填好相应的信息,其中applications选spark. 当cluster信息填好了,把ssh命令拷贝下来。
4.2 用拷下来的 ssh 登进cluster。
4.3 现在进行开发/计算模式,有两个运行spark的方式:
一个还是 pyspark,因为yarn都给你弄好了,直接输“pyspark”就进行shell
一个是用spark-submit。但是注意,这里不需要设置master address,因为这个系统里有yarn自带的resource manager了.
![v2-e67faa3a90e00b7854990af73fe92652_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=3398c7b3-3a2a-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-e67faa3a90e00b7854990af73fe92652_b.jpg)
然而,如果script里有从本地读数的操作,还要是把文件考到各个node上。这里因为不像spark standalone是用spark-ec2的包操作,所以拷贝命令也不一样,应该是用"$ hdfs -fs copyfrom local_path..blabla..." 一类的操作。
福利:关于spark-submit的参数之deploy-mode,这里贡献一篇让我醍醐灌顶的科普。spark client mode和cluster mode的区别 希望对同样迷糊的你有帮助。