集群规划
主机 | master | slave01 | slave02 |
---|---|---|---|
hdfs | NameNode | - | SecondaryNameNode |
DataNode | DataNode | DataNode | |
historyserver | - | - | |
yarn | - | - | ResourceManager |
NodeManager | NodeManager | NodeManager |
环境准备
三台已配置过环境的主机
- 我这里三台主机分别命名为master、slave01和slave02
- 普通用户名hadoop,密码相同(方便以后操作)
- 网络环境与java环境都已设置好
- 设置主机名与ip映射,每台主机都需要设置所有三台主机的主机名与ip映射
# vi /etc/hosts
配置NTP时间服务器
- 把master这台服务器配置为时间服务器,然后集群内其他服务器都来同步这台服务器的时间
- 目的: 集群内部所有服务器时间一致
1.调整时间(三台)
- 检查当前系统时区
# date -R
- 修改时区(如果最后一位不是+0800)
# rm -rf /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
master
1.同步时间
- 关闭ntpd进程
# service ntpd stop
- 同步当前服务器时间
# ntpdate cn.pool.ntp.org
2.检查软件包
- 查看ntp软件包是否已安装
ntp-4.2.4p8-3.el6.centos.x86_64
# rpm -qa | grep ntp
- 安装ntp软件包(如果没有安装)
# yum -y install ntp
3.修改ntp配置文件
# vi /etc/ntp.conf
- 去掉下面这行前的#,并将网段修改为自己的网段
restrict 192.168.93.0 mask 255.255.255.0 nomodify notrap
- 注释掉以下几行
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
- 去掉下面几行前的#,如果文件中没有这两行,需要手动添加
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
- 重启ntp服务
# service ntpd start
# chkconfig ntpd on
slave01、slave02
1.关闭ntpd进程,设置默认关闭
# service ntpd stop
# chkconfig ntpd off
2.同步master1的服务器时间
# ntpdate master
- 如果出现no server suitable for synchronization found错误,可等待一会儿再试
3.制定计划任务,周期性同步时间
# crontab -e
*/10 * * * * /usr/sbin/ntpdate master
# service crond restart
设置SSH免秘钥登录
- 三台主机分别生成自己的一对公私钥对,并拷贝给所有主机(包括自己)
公私钥对保存在/home/hadoop/.ssh/下,id_rsa.pub与id_rsa
如果生成错误就删除这两个文件后重新生成
拷贝后需要输入一次yes和密码
$ ssh-keygen -t rsa
$ ssh-copy-id master
$ ssh-copy-id slave01
$ ssh-copy-id slave02
配置Hadoop完全分布
master
1.上传压缩包到/opt/softwares
2.解压
$ tar -zxf /opt/softwares/hadoop-2.5.0-cdh5.3.6.tar.gz -C /opt/modules/
3.修改配置文件
- hadoop-env.sh、yarn-env.sh、mapred-env.sh
export JAVA_HOME=/opt/modules/jdk1.7.0_79
- core-site.xml
<!--HDFS集群访问入口地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<!--声明存放数据的目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0-cdh5.3.6/data</value>
</property>
- slaves
声明哪些服务器是datanode
每行一个主机名
master
slave01
slave02
- hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value> <!--副本数-->
</property>
<!--secondarynamenode所在主机-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave02:50090</value>
</property>
<!--namenode所在主机-->
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
<!-- 关闭权限检查用户或用户组 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
- yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave01</value>
</property>
<!-- NodeManager获取数据的方式是shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用日志聚合功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志保存时间-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
- mapred-site.xml
<!--mapreduce计算模型运行在yarn平台-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--进程通信-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!--客户端访问入口-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
4.拷贝到其余主机
- 可以删除doc帮助文档,减少scp copy文件的时间
$ rm -rf share/doc/
$ scp -r hadoop-2.5.0-cdh5.3.6/ slave01:/opt/modules/
$ scp -r hadoop-2.5.0-cdh5.3.6/ slave02:/opt/modules/
5.格式化NameNode
- 在master上输入
$ bin/hdfs namenode -format
编写shell语句一键开启和关闭集群
- start-cluster.sh
#!/bin/bash
echo "-------------------正在启动集群-------------------"
echo "-------------------正在启动NameNode-------------------"
ssh hadoop@master '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode'
echo "-------------------正在启动SecodaryNameNode-------------------"
ssh hadoop@slave02 ' /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start secondarynamenode'
echo "-------------------正在启动DataNode-------------------"
for i in hadoop@master hadoop@slave01 hadoop@slave02
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start datanode'
done
echo "-------------------正在启动yarn-------------------"
echo "-------------------正在启动ResourceManager-------------------"
ssh hadoop@slave01 '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanager'
echo "-------------------正在启动NodeManager-------------------"
for i in hadoop@master hadoop@slave01 hadoop@slave02
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start nodemanager'
done
echo "-------------------正在启动JobHistory-------------------"
ssh hadoop@master '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh start historyserver'
echo "-------------------集群已启动-------------------"
- stop-cluster.sh
#!/bin/bash
echo "-------------------正在关闭JobHistory-------------------"
ssh hadoop@master '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh stop historyserver'
echo "-------------------正在关闭yarn-------------------"
echo "-------------------正在关闭ResourceManager-------------------"
ssh hadoop@slave01 '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop resourcemanager'
echo "-------------------正在关闭NodeManager-------------------"
for i in hadoop@master hadoop@slave01 hadoop@slave02
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh stop nodemanager'
done
echo "-------------------正在关闭NameNode-------------------"
ssh hadoop@master '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop namenode'
echo "-------------------正在关闭SecodaryNameNode-------------------"
ssh hadoop@slave02 ' /opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop secondarynamenode'
echo "-------------------正在关闭DataNode-------------------"
for i in hadoop@master hadoop@slave01 hadoop@slave02
do
ssh $i '/opt/modules/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh stop datanode'
done
echo "-------------------集群已关闭-------------------"