最近需要用到大数据的一些相关技术,于是实验了一下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>