前言
最近刚接触Spark,想在实验室配一个小规模的Spark分布式集群做实验。虽说只配一个单机版(standalone)的伪分布式集群也可以做实验,但感觉意义不大,同时也为了逼真还原真实的生产环境,查阅了一番资料之后,知道Spark的运行需要外部的资源调度系统来支持,主要有:Standalone Deploy mode、Amazon EC2、Apache Mesos、Hadoop YARN。因为YARN比较流行的缘故,于是,我决定在Hadoop YARN之上配置Spark分布式集群。
对于Hadoop和Spark的一些比较浅显的,初步的认识,大家可以看我写的这篇博文《对于Hadoop和Spark的一些浅显认识》。说的不对的地方或有补充的地方还请各位博友多多提出~我也会在今后的学习当中不断地修改和更新。
本篇文章主要介绍的是在Ubuntu14.04下Hadoop2.7.2的集群配置。
环境介绍
- 系统:Ubuntu14.04 64位
- JDK版本:jdk 1.7
- Hadoop版本:hadoop 2.7.2
集群环境:
角色 hostname IP master wlw 192.168.1.103 slave zcq-pc 192.168.1.105
创建hadoop用户
需要特别注意的是,hadoop集群要求每个master和slave节点上的用户名是相同的。在这里我统一使用名为“hadoop”的用户。
如果你的节点上用户还不统一,则可以使用如下命令来新建用户:
创建用户,名为“hadoop”
sudo adduser hadoop设置密码
sudo passwd hadoop给hadoop用户创建目录,方可登陆
sudo mkdir /home/hadoop将指定目录的拥有者改为hadoop用户
sudo chown hadoop /home/hadoop可考虑为hadoop用户增加管理员权限,方便部署,避免一些权限不足的问题
sudo adduser hadoop sudo切换到hadoop用户登录
安装ssh server、配置ssh无密码登陆
ubuntu默认安装好了ssh client,我们还需要安装ssh server。
sudo apt-get install openssh-serverHadoop集群需要用到ssh无密码登陆,我们进行设置
cd ~/.ssh
ssh-keygen -t rsa #一直按回车就可以
cp id_rsa.pub authorized_keys设置完之后,我们无密码登录本机进行测试
ssh localhost
网络配置
在 /etc/hosts 中添加如下集群信息:
192.168.1.103 wlw 192.168.1.105 zcq-pc
需要注意的是,该集群信息需要在所有主机(master和slave)上都添加
常规的配置jdk就不说了,唯一需要注意的是在 /ect/environment 中添加JAVA_HOME,否则会出错:
export JAVA_HOME=/opt/jdk1.7.0_75
同样的,需要在所有主机(master和slave)上都添加
ssh无密码登录节点
只有在各节点之间设置了无密码登录,才能让hadoop实现master节点map任务给slave节点,进行分布式计算。
在上文中已经讲述过了,在master节点上生成公钥了,在这里仍然再赘述一遍。
首先生成 Master 的公匙,在 Master 节点终端中执行:
cd ~/.ssh
ssh-keygen -t rsa # 一直按回车就可以master节点需要无密码登录(ssh)本机,还是在master节点上执行命令:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
完成之后可以用 ssh localhost 进行测试将公钥从master(wlw)节点上传输到slave(zcq-pc)节点中:
scp ~/.ssh/id_rsa.pub hadoop@zcq-pc:/home/hadoop/在 slave(zcq-pc)节点 上将ssh公匙保存到相应位置:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys如果你还有其他slave节点的话,同样的道理也需要将master节点的公钥传输到其他的slave节点中去,步骤与上面的相同。或者你也可以在slave节点上生成公钥,将slave节点的公钥传输到master节点中,使他们之间能够互相无密码登录。
最后在master(wlw)节点上测试一下,看能否无密码登录到slave(zcq-pc)节点上:
ssh zcq-pc
配置集群/分布式环境(关键步骤)
集群/分布式模式需要修改 etc/hadoop 中的5个配置文件,后四个文件可点击查看官方默认设置值,这里仅设置了正常启动所必须的设置项: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
slaves文件
cd /opt/hadoop-2.7.2/etc/hadoop
vim slaves将原来 localhost 删除,把所有slave的主机名写上,每行一个。因为我只有一个 slave(zcq-pc)节点,所以该文件中就只有一行内容: zcq-pc
core-site.xml文件
<property> </property>
改为:
<property> <name>fs.defaultFS</name> <value>hdfs://wlw:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/hadoop-2.7.2/tmp</value> <description>A base for other temporary directories.</description> </property>
请参照我的配置信息,根据你自身的路径和master节点的hostname名进行更改
hdfs-site.xml文件
<property> <name>dfs.namenode.secondary.http-address</name> <value>wlw:50090</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop-2.7.2/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop-2.7.2/tmp/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property>
其中,dfs.replication是设置备份文件的数量,默认为3,我这里将其设置为2
同样的,请参照我的配置信息,根据你自身的路径和master节点的hostname名进行更改
mapred-site.xml文件
这个文件不存在,首先需要从模板中复制一份:- cp mapred-site.xml.template mapred-site.xml
然后配置修改如下:
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
使Hadoop基于YARN资源调度系统
yarn-site.xml文件
<property> <name>yarn.resourcemanager.hostname</name> <value>wlw</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
配置好后,将 master(wlw)节点上的 Hadoop-2.7.2 文件打包复制到各个slave节点上:
cd /opt
sudo tar -zcf ./hadoop-2.7.2.tar.gz ./hadoop-2.7.2
scp ./hadoop-2.7.2.tar.gz zcq-pc:/home/hadoop在slave(zcq-pc)节点上执行:
sudo tar -zxf ~/hadoop-2.7.2.tar.gz -C /opt/
sudo chown -R hadoop:hadoop /opt/hadoop-2.7.2如上都配置完成之后,在master节点上就可以启动hadoop了:
cd /opt/hadoop-2.7.2
./bin/hdfs namenode -format # 首次运行需要执行初始化,后面不再需要
./sbin/start-dfs.sh
./sbin/start-yarn.sh通过 jps 命令查看master(wlw)节点的Hadoop进程:
可以看到master节点启动了NameNode、SecondrryNameNode、ResourceManager进程,此外还有jps命令的进程NameNode指的就是master节点
通过 jps 命令查看slave(zcq-pc)节点的Hadoop进程:
slave节点则启动了DataNode和NodeManager进程,此外还有jps命令的进程DataNode指的就是slave节点
通过Web页面看到查看DataNode和NameNode的状态:
或者你也也可以通过http://wlw:8088来查看:
执行WordCount实例
在本地硬盘上创建 file 文件夹:
mkdir ~/file进入该目录,创建一个 file1.txt 文件:
cd file
echo “hello hadoop” > file1.txt在HDFS上创建输入文件夹目录 input :
cd /opt/hadoop-2.7.2
./bin/hadoop fs -mkdir /input把本地硬盘上创建的 file1.txt 文件传进 input 里面:
./bin/hadoop fs -put ~/file/file1.txt /input用Hadoop自带的jar 包运行 wordcount 例子 :
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input/ /output/wordcount1查看运行结果:
./bin/hdfs dfs -cat /output/wordcount1/*最后,关闭Hadoop集群也是在Master节点上执行:
./sbin/stop-dfs.sh
./sbin/stop-yarn.sh
注意事项
- 更改 /etc/profile 之后一定要让其生效
source /etc/profile - 由于我的jdk是放在 /opt 目录下的,应给他赋予执行的权限
sudo chmod u+x -R /opt/jdk1.7.0_75
在启动Hadoop中出现的问题
(1)Warning: the ECDSA host key for “zcq-pc”differs from the key for the IP address “192.168.1.105”
解决方案:remove the cached key for “192.168.1.105” on master machine
ssh-keygen -R 192.168.1.105
(2) WARNING: POSSIBLE DNS SPOOFING DETECTED!
解决方案:删除 .ssh/known_hosts文件中对应的行(“offending key in /home/wlw/.ssh/known_hosts:”行号)
vim 显示行号:
:set number
PS:在下一篇博文中我会真正讲到在Hadoop YARN之上配置Spark集群