5.时钟同步
所有节点的系统时间要与当前时间保持一致。
查看当前系统时间
date
Tue Nov 3 06:06:04 CST 2015
如果系统时间与当前时间不一致,进行以下操作。
[root@Master1 ~]# cd /usr/share/zoneinfo/
[root@Maseter1 zoneinfo]# ls //找到Asia
[root@Master1 zoneinfo]# cd Asia/ //进入Asia目录
[root@Maseter1 Asia]# ls //找到Shanghai
[root@Maseter1 Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //当前时区替换为上海
我们可以同步当前系统时间和日期与NTP(网络时间协议)一致。
[root@Maseter1 Asia]# yum install ntp //如果ntp命令不存在,在线安装ntp
[root@Maseter1 Asia]# ntpdate pool.ntp.org //执行此命令同步日期时间
[root@Maseter1 Asia]# date //查看当前系统时间
6.hosts文件检查
hosts文件检查
所有节点的hosts文件都要配置静态ip与hostname之间的对应关系。
[root@djt11 Asia]# vi /etc/hosts
192.168.1.101 Master1
192.168.1.102 Master2
192.168.1.103 Slave1
192.168.1.104 Slave2
192.168.1.105 Slave3
禁用防火墙
所有节点的防火墙都要关闭。
查看防火墙状态
[root@Master1 Asia]# service iptables status
iptables: Firewall is not running.
如果不是上面的关闭状态,则需要关闭防火墙。
[root@Master1 Asia]# chkconfig iptables off //永久关闭防火墙
[root@Master1 Asia]# service iptables stop /
创建hadoop用户
[root@Master1 ~]# groupadd hadoop //创建用户组
[root@Master1 ~]# useradd -g hadoop hadoop //新建hadoop用户并增加到hadoop工作组
[root@Master1 ~]# passwd hadoop //设置密码
配置SSH免密码通信
[root@Master1~]# su hadoop //切换到hadoop用户下
[hadoop@Master1root]
cd//切换到hadoop用户目录[hadoop@Master1 ]
mkdir .ssh
[hadoop@Master1~]
ssh−keygen−trsa//执行命令一路回车,生成秘钥[hadoop@Master1 ]
cd .ssh
[hadoop@Master1.ssh]
lsidrsaidrsa.pub[hadoop@Master1.ssh]
cat id_ras.pub >> authorized_keys //将公钥保存到authorized_keys认证文件中
[hadoop@Master1.ssh]
lsauthorizedkeysidrsaidrsa.pub[hadoop@Master1.ssh]
cd ..
[hadoop@Master1~]
chmod700.ssh[hadoop@Master1 ]
chmod 600 .ssh/*
[hadoop@Master1~]
sshMaster1//第一次执行需要输入yes[hadoop@Master1 ]
ssh Master1
每个节点都同样的操作
将所有节点中的共钥id_ras.pub拷贝到Master1中的authorized_keys文件中。
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master1 ‘cat >> ~/.ssh/authorized_keys 所有节点都需要执行这条命令
然后将Master1中的authorized_keys文件分发到所有节点上面。
scp -r authorized_keys hadoop@Master2:~/.ssh/
scp -r authorized_keys hadoop@Slave1:~/.ssh/
scp -r authorized_keys hadoop@Slave2:~/.ssh/
scp -r authorized_keys hadoop@Slave3:~/.ssh/
大家通过ssh 相互访问,如果都能无密码访问,代表ssh配置成功
脚本工具的使用
在Master1节点上创建/home/hadoop/tools目录。
[hadoop@Master1 ~]$ mkdir /home/hadoop/tools
cd /home/hadoop/tools
将本地脚本文件上传至/home/hadoop/tools目录下。这些脚本大家如果能看懂也可以自己写, 如果看不懂直接使用就可以,后面慢慢补补Linux相关的知识。
[hadoop@Master1tools]
rzdeploy.conf[hadoop@Master1tools]
rz deploy.sh
[hadoop@Master1tools]
rzrunRemoteCmd.sh[hadoop@Master1tools]
ls
deploy.conf deploy.sh runRemoteCmd.sh
查看一下deploy.conf配置文件内容。
[hadoop@Master1tools]$ cat deploy.conf
Master1,all,namenode,zookeeper,resourcemanager,
Master1,all,slave,namenode,zookeeper,resourcemanager,
Slave1,all,slave,datanode,zookeeper,
Slave2,all,slave,datanode,zookeeper,
Slave3,all,slave,datanode,zookeeper,
查看一下deploy.sh远程复制文件脚本内容。
[hadoop@Master1 tools]$ cat deploy.sh
!/bin/bash
set -x
if [ $# -lt 3 ]
then
echo “Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag”
echo “Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile”
exit
fi
src=
1dest=
2
tag=
3if[‘a′
4’a’ == ‘aa’ ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$4
fi
if [ -f
confFile]thenif[−f
src ]
then
for server in cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'
do
scp
src
server”:”
destdoneelif[−d
src ]
then
for server in cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'
do
scp -r
src
server”:”${dest}
done
else
echo “Error: No source file exist”
fi
else
echo “Error: Please assign config file or run deploy.sh command with deploy.conf in same directory”
fi
查看一下runRemoteCmd.sh远程执行命令脚本内容。
[hadoop@Master1 tools]$ cat runRemoteCmd.sh
!/bin/bash
set -x
if [ $# -lt 2 ]
then
echo “Usage: ./runRemoteCmd.sh Command MachineTag”
echo “Usage: ./runRemoteCmd.sh Command MachineTag confFile”
exit
fi
cmd=
1tag=
2
if [ ‘a’$3’a’ == ‘aa’ ]
then
confFile=/home/hadoop/tools/deploy.conf
else
confFile=$3
fi
if [ -f $confFile ]
then
for server in cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'
do
echo “*********
server∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗”ssh
server "source /etc/profile; $cmd”
done
else
echo “Error: Please assign config file or run deploy.sh command with deploy.conf in same directory”
fi
以上三个文件,方便我们搭建hadoop分布式集群。具体如何使用看后面如何操作。
如果我们想直接使用脚本,还需要给脚本添加执行权限。
[hadoop@Master1 tools]
chmodu+xdeploy.sh[hadoop@Master1tools]
chmod u+x runRemoteCmd.sh
同时我们需要将/home/hadoop/tools目录配置到PATH路径中。
[hadoop@Master1 tools]su root
Password:
[root@Master1 tools]# vi /etc/profile
PATH=/home/hadoop/tools:PATH
export PATH
用脚本runRemoteCmd.sh “/home/hadoop/app”all
在所有节点上创建软件目录
jdk安装
将本地下载好的jdk1.7,上传至djt11节点下的/home/hadoop/app目录。
[root@Master1 tools]# su hadoop
[hadoop@Master1 tools]
cd/home/hadoop/app/[hadoop@Master1app]
rz //选择本地的下载好的jdk-7u79-linux-x64.tar.gz
[hadoop@Master1 app]
lsjdk−7u79−linux−x64.tar.gz[hadoop@Master1app]
tar zxvf jdk-7u79-linux-x64.tar.gz //解压
[hadoop@Master1 app]
lsjdk1.7.079jdk−7u79−linux−x64.tar.gz[hadoop@Master1app]
rm jdk-7u79-linux-x64.tar.gz //删除安装包
添加jdk环境变量。
[hadoop@Master1 app]su root
Password:
[root@Master1 app]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
CLASSPATH=.:JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/tools.jarPATH=
JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
[root@djt11 app]# source /etc/profile //使配置文件生效
查看jdk是否安装成功。
[root@Master1 app]# java -version
java version “1.7.0_79”
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
出现以上结果就说明Master1 节点上的jdk安装成功。
然后将Master1 下的jdk安装包复制到其他节点上。
[hadoop@Master1 app]$ deploy.sh jdk1.7.0_79 /home/hadoop/app/ slave
Master1,Master2,Master3,Master4节点重复Master1节点上的jdk配置环境变量即可
Zookeeper安装
将本地下载好的zookeeper-3.4.6.tar.gz安装包,上传至Master1节点下的/home/hadoop/app目录下。
[hadoop@Master1 app]
rz//选择本地下载好的zookeeper−3.4.6.tar.gz[hadoop@Master1app]
ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz
[hadoop@Master1 app]
tarzxvfzookeeper−3.4.6.tar.gz//解压[hadoop@Master1app]
ls
jdk1.7.0_79 zookeeper-3.4.6.tar.gz zookeeper-3.4.6
[hadoop@Master1 app]
rmzookeeper−3.4.6.tar.gz//删除zookeeper−3.4.6.tar.gz安装包[hadoop@Master1app]
mv zookeeper-3.4.6 zookeeper //重命名
修改Zookeeper中的配置文件。
[hadoop@Master1 app]
cd/home/hadoop/app/zookeeper/conf/[hadoop@Master1conf]
ls
configuration.xsl log4j.properties zoo_sample.cfg
[hadoop@Master1 conf]
cpzoosample.cfgzoo.cfg//复制一个zoo.cfg文件[hadoop@Master1conf]
vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata //数据文件目录
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog //日志目录
the port at which the clients will connect
clientPort=2181 //默认端口号
server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader)
server.1=Master1:2888:3888
server.2=Master2:2888:3888
server.3=Slave1:2888:3888
server.4=Slave2:2888:3888
server.5=Slave3:2888:3888
通过远程命令deploy.sh将Zookeeper安装目录拷贝到其他节点上面。
[hadoop@Master1 app]$ deploy.sh zookeeer /home/hadoop/app slave
通过远程命令runRemoteCmd.sh在所有的节点上面创建目录:
[hadoop@Master1 app]
runRemoteCmd.sh“mkdir−p/home/hadoop/data/zookeeper/zkdata”all//创建数据目录[hadoop@Master1app]
runRemoteCmd.sh “mkdir -p /home/hadoop/data/zookeeper/zkdatalog” all //创建日志目录
然后分别在Master1、Master2、Slave1、Slave2、Slave3上面,进入zkdata目录下,创建文件myid,里面的内容分别填充为:1、2、3、4、5, 这里我们以Master1为例。
[hadoop@Master1 app]
cd/home/hadoop/data/zookeeper/zkdata[hadoop@Master1zkdata]
vi myid
1 //输入数字1
配置Zookeeper环境变量。
[hadoop@Master1 zkdata]su root
Password:
[root@Master1 zkdata]# vi /etc/profile
JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
ZOOKEEPER_HOME=/home/hadoop/app/zookeeper
CLASSPATH=.:JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/tools.jarPATH=
JAVA_HOME/bin:
ZOOKEEPERHOME/bin:
PATH
export JAVA_HOME CLASSPATH PATH ZOOKEEPER_HOME
[root@Master1 zkdata]# source /etc/profile //使配置文件生效
runRemoteCmd.sh “/home/hadoop/app/zookeeper/bin/zkServer.sh start” zookeeper
runRemoteCmd.sh “jps” all 查看是否安装成功
runRemoteCmd.sh “/home/hadoop/app/zookeeper/bin/zkServer.sh stop” zookeeper
hadoop集群环境搭建
将下载好的apache hadoop-2.6.0.tar.gz安装包,上传至Master1 节点下的/home/hadoop/app目录下。
[hadoop@Master1 app]
rz//将本地的hadoop−2.6.0.tar.gz安装包上传至当前目录[hadoop@Master1app]
ls
hadoop-2.6.0.tar.gz jdk1.7.0_79 zookeeper
[hadoop@Master1 app]
tarzxvfhadoop−2.6.0.tar.gz//解压[hadoop@Master1app]
ls
hadoop-2.6.0 hadoop-2.6.0.tar.gz jdk1.7.0_79 zookeeper
[hadoop@Master1 app]
rmhadoop−2.6.0.tar.gz//删除安装包[hadoop@Master1app]
mv hadoop-2.6.0 hadoop //重命名
切换到/home/hadoop/app/hadoop/etc/hadoop/目录下,修改配置文件。
[hadoop@Master1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/
配置HDFS
配置hadoop-env.sh
[hadoop@Master1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
[hadoop@Master1 hadoop]$ vi core-site.xml
fs.defaultFS
hdfs://cluster1
< 这里的值指的是默认的HDFS路径 ,取名为cluster1>
hadoop.tmp.dir
/home/hadoop/data/tmp
< hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建>
ha.zookeeper.quorum
master1:2181,Master2:2181,Slave1:2181,Slave2:2181, Slave3:2181
< 配置Zookeeper 管理HDFS>
配置hdfs-site.xml
[hadoop@Master1hadoop]$ vi hdfs-site.xml
dfs.replication
3
< 数据块副本数为3>
dfs.permissions
false
dfs.permissions.enabled
false
< 权限默认配置为false>
dfs.nameservices
cluster1
< 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口>
dfs.ha.namenodes.cluster1
Master1,Master2
< 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可>
dfs.namenode.rpc-address.cluster1.Master1
Master2:9000
< djt11 rpc地址>
dfs.namenode.http-address.cluster1.Master1
Master2:50070
< djt11 http地址>
dfs.namenode.rpc-address.cluster1.Master2
Master2:9000
< djt12 rpc地址>
dfs.namenode.http-address.cluster1.Master2
Master2:50070
< djt12 http地址>
dfs.ha.automatic-failover.enabled
true
< 启动故障自动恢复>
dfs.namenode.shared.edits.dir
qjournal://Master1:8485;Master2:8485;Slave1:8485;Slave2:8485;Slave3:8485/cluster1
< 指定journal>
dfs.client.failover.proxy.provider.cluster1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
< 指定 cluster1 出故障时,哪个实现类负责执行故障切换>
dfs.journalnode.edits.dir
/home/hadoop/data/journaldata/jn
< 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 >
dfs.ha.fencing.methods
shell(/bin/true)
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.ha.fencing.ssh.connect-timeout
10000
< 脑裂默认配置>
dfs.namenode.handler.count
100
配置 slave
[hadoop@Master1 hadoop]$ vi slaves
Slave1
Slave2
Slave3
YARN安装配置
配置mapred-site.xml
[hadoop@Master hadoop]$ vi mapred-site.xml
mapreduce.framework.name
yarn
<指定运行mapreduce的环境是Yarn,与hadoop1不同的地方>
配置yarn-site.xml
[hadoop@Master1 hadoop]$ vi yarn-site.xml
yarn.resourcemanager.connect.retry-interval.ms
2000< 超时的周期>
yarn.resourcemanager.ha.enabled
true< 打开高可用>
yarn.resourcemanager.ha.automatic-failover.enabled
true<启动故障自动恢复>
yarn.resourcemanager.ha.automatic-failover.embedded
true