Spark 1.5、Hadoop 2.7 集群环境搭建
最近需要用到大数据的一些相关技术,于是实验了一下spark和Hadoop的集群环境搭建。实验包括三台虚拟机,linux-1、linux-2、linux-3,spark是一个master两个worker, hadoop是一个主NameNode、两个DataNode,其中一个兼做副NameNode。软件方面,spark用的1.5.2版本,最新的1.6.1版本遇到一个java代码访问拒绝的问题,网上有说是bug,退回到1.5.2版。hadoop用的最新2.7.2稳定版,只能在jdk7以上版本运行。
spark集群安装非常简单:
1.分别在各个机器上解压缩spark包,选定一个做master,其他的做worker。在master上启动 {spark_dir}/sbin/start-master.sh
2.worker机器上启动 {spark_dir}/sbin/start-slave.sh spark://{master}:7077
3.这里唯一要注意的是,spark是采用主机名作为服务识别,所以虽然用-h xx.xx.xx.xx 的参数也可以按ip方式启动成功,但在代码调用里往往遇到麻烦。所以还是老老实实用主机名算了。那么就要注意变更每台机器的/etc/hostname及把各个机器的hostname配置到每台机器的/etc/hosts文件里。
4.此外,这种方法虽然很好理解,但是要一台机器一台机器的操作,有点麻烦,也可以把配置文件写好,一个命令同时启动所有机器,这个后面说。
hadoop集群的安装略微麻烦些,因为组件也多一些。hadoop实际上由hdfs、mapreduce、yarn三个主要功能模块构成。hdfs是分布式文件系统;mapreduce是分布式计算系统(spark就是替代这部分的);yarn是任务调度和资源管理系统。
1.有了前面的第3步,这里就不用重复操作了。
2.下面要配置master能够ssh无密码登录其他slave。具体方法:先在master机器上生成公钥,ssh-keygen -t rsa,后续直接回车,之后会看到产生两个文件,id_rsa、id_rsa.pub,把id_rsa.pub分别拷贝到自身和各slave机器的~/.ssh目录(如果没有,手工创建)下,并改名为authorized_keys(如果以前有这个文件且不想破坏,可以用cat >>追加),这样从master就可以无密码登录各个机器了。
3.在各个机器上修改{hadoop_dir}/etc/hadoop/hadoop-env.sh 中的JAVA_HOME变量,形如export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 (这句必须改,在其他地方配置的JAVA_HOME环境变量没有作用)。
在各个机器上配置PATH环境变量 export PATH=$PATH:{hadoop_dir}/bin:{hadoop_dir}/sbin
4.配置集群环境,即编辑{hadoop_dir}/etc/hadoop 下的slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml五个文件。
slaves 文件中把每个slave主机名写在一行,很简单,就不给示例了。
core-site.xml文件示例如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://linux-1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/clusterwork/hadoop-2.7.2/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
hdfs-site.xml文件示例如下:
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>linux-2:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/clusterwork/hadoop-2.7.2/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/clusterwork/hadoop-2.7.2/tmp/dfs/data</value>
</property>
</configuration>
mapred-site.xml文件示例如下(没有这个文件先从mapred-site.xml.template拷贝一份,如果不使用map-reduce不配也可以):
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>linux-1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>linux-1:19888</value>
</property>
</configuration>
yarn-site.xml文件示例如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux-1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
以上配置均为示例,还可以有更多选项,具体参考官方文档。之后把这5个文件拷贝到每台机器上,覆盖原文件。
首次启动需要先在 Master 节点执行 NameNode 的格式化:hdfs namenode -format
之后在master上启动{hadoop_dir}/sbin/start-dfs.sh 、{hadoop_dir}/sbin/start-yarn.sh、{hadoop_dir}/sbin/mr-jobhistory-daemon.sh start historyserver,如果一切正常,使用jps命令,可以看到下面一些进程。
linux-1上:
Jps
NameNode
ResourceManager
JobHistoryServer
linux-2上:
Jps
NodeManager
SecondaryNameNode
DataNode
linux-3上:
NodeManager
DataNode
Jps
现在hadoop就已经可用了。在使用hdfs之前先要创建用户:hdfs dfs -mkdir -p /user/clusterwork (这个用户最好和当前操作用户同名,这样在操作时可免输绝对路径),以下是常用命令,和普通linux差不多,而且在集群中任意的机器上皆可:
hdfs dfs -mkdir data ——建目录,其实是建在了/user/clusterwork/data 下
hdfs dfs -put *.xml data ——传文件
hdfs dfs -ls data ——显示文件
hdfs dfs -rm data/* ——删除文件
hdfs dfs -rmdir data ——删除目录
不一一列举
最后补充spark的集群启动。其实也是利用的ssh无密码登录了。但这个对于spark不是必须的,对于hadoop则是必须的。所以既然前面hadoop安装第2步已经做了,这里就省事了。配置各个机器的/conf/slaves ,把worker写进去。启动 {spark_dir}/sbin/start-all.sh 即可。
之后通过web访问检查一下各集群情况:http://linux-1:8080、 http://linux-1:50070、 http://linux-1:8088
更多Spark相关教程见以下内容:
Spark 的详细介绍:请点这里
Spark 的下载地址:请点这里