1.准备3台虚拟机(关闭防火墙、静态ip,主机名称),主机名称分别为hadoop2、hadoop3、hadoop4(具体看其他文章)
2.安装jdk,配置环境变量
3.配置ssh,免密登录(shell)
在shell中选中工具–>发送键输入到所有会话,可以同时在所有窗口中输入命令
1)在三台机器里同时生成一对公私钥
ssh-keygen -t rsa -P ''
:后自己填 一般与前面一样 /root/.ssh/id_rsa
2)可以查看是否生成
cd ~/.ssh/
ls
.pub为公钥,另一个同名的为私钥
3)把公钥复制进authorized_keys里(三台)
cp id_rsa.pub authorized_keys
4)将子节点的公钥拷贝到主节点并添加进authorized_keys
在子节点上执行远程拷贝并改名
scp -r /root/.ssh/id_rsa.pub root@hadoop2:/root/.ssh/id_rsa_hadoop3.pub
scp -r /root/.ssh/id_rsa.pub root@hadoop2:/root/.ssh/id_rsa_hadoop4.pub
把拷贝好的公钥并到authorized_keys中
主节点上执行
cat id_rsa_hadoop3.pub >> authorized_keys
cat id_rsa_hadoop4.pub >> authorized_keys
5)把主节点上的authorized_keys文件替换子节点上的authorized_keys
scp -r authorized_keys root@hadoop3:$pwd
scp -r authorized_keys root@hadoop4:$pwd
6)测试是否配置成功
在每台节点上分别执行ssh另外两台机器名,若能互相登录,则配置无密成功
4.hadoop安装
1)把下载的压缩文件包放入到opt,执行压缩命令
tar -zxf hadoop-2.6.0-cdh5.14.2.tar.gz
2)移动并重命名hadoop文件(目录自己创建)
mv hadoop-2.6.0-cdh5.14.2.tar soft/hadoop260/
3)配置环境变量
vi /etc/profile
在末尾添加
export HADOOP_HOME=/opt/soft/hadoop260
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
添加完成后,退出
source /etc/profile
4)配置hadoop配置文件
cd /opt/soft/hadoop260/etc/hadoop
vi hadoop-env.sh
export JAVA_HOME=/opt/soft/hadoop260
vi core-site.xml
configuration里添加
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop2:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop/data/tmp</value>
</property>
vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop4:50090</value>
</property>
vi yarn-env.sh
export JAVA_HOME=/opt/install/jdk
vi yarn-site.xml
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop3</value>
</property>
vi mapred-site.xml
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vi slaves
hadoop2
hadoop3
hadoop4
vi /etc/hosts
ip地址用自己的
192.168.56.xxx hadoop2
192.168.56.xxx hadoop3
192.168.56.xxx hadoop4
4)集群分发配置文件
scp -r /opt/soft/hadoop260 root@hadoop3:/opt/soft/hadoop260
scp -r /opt/soft/hadoop260 root@hadoop4:/opt/soft/hadoop260
5)格式化hdfs
bin/hdfs namenode -format
6)启动hdfs(hadoop2主节点)
sbin/start-dfs.sh
7)启动yarn(hadoop3)配置里设置了yarn的启动节点
sbin/start-yarn.sh
8)jps和web页面查看(50070端口和8088端口)
9)集群规划jps可以看到
| | hadoop2 | hadoop3 | hadoop4 |
| ---- | ------------------ | ---------------------------- | --------------------------- |
| HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
| YARN | NodeManager | ResourceManager NodeManager | NodeManager |
5.时间同步
1)在主节点上
查看是否安装了ntp
rpm -qa | grep ntp
安装ntp
yum -y install ntp
2)修改配置
vi /etc/ntp.conf
# 修改1(设置本地网络上的主机不受限制。)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 修改2(设置为不采用公共的服务器)
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst为
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# 添加3(添加默认的一个内部时钟数据,使用它为局域网用户提供服务。)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
vi /etc/sysconfig/ntpd
# 增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
重新启动ntpd
service ntpd status
service ntpd start
chkconfig ntpd on
3)其他节点配置
crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop2
hadoop配置完成
1.上传并解压文件
tar -zxf zookeeper-3.4.5-cdh5.14.2.tar.gz
2.移动并命名文件
mv zookeeper-3.4.5-cdh5.14.2.tar.gz /soft/zk345
3.在zk345目录下创建文件夹(配置文件存放路径)
mkdir -p tmp/data
4.配置zoo.cfg
进入文件conf
cd conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
具体配置
修改dataDir
dataDir=/opt/soft/zk345/tmp/data
在文件末尾增加如下配置(注意和上文连接不要有空格,不然zookeeper输入启动命令没反应)
server.2=hadoop2:2288:3388
server.3=hadoop3:2288:3388
server.4=hadoop4:2288:3388
5.集群操作(每台机器都编写)
1)在dataDir指定目录下创建一个myid的文件(文件名不可乱写)
touch myid
2)配置myid(与zoo.cfg里的server)
在对应机器里的id中添加与server对应的编号
hadoop2里myid添加2
hadoop3里myid添加3
hadoop4里myid添加4
6.配置环境变量(3台机器)
vi /etc/profile
export ZK_HOME=/opt/soft/zk345
export PATH=$PATH:$ZK_HOME/bin
使环境变量生效
source /etc/profile
7.分别启动zookeeper服务
zkServer.sh start
8.jps查看进程
出现QuorumPeerMain表示启动成功
9.查看状态(follower和leader)
zkServer.sh status
三、高可用集群搭建(HDFS-HA集群)
1.前提:hadoop完全分布式和zookeeper完全分布式环境已经安装完成
2.配置文件(主节点上)(文件的存储路径和机器名称根据自己的修改)
/opt/soft/hadoop260/data/tmp
/opt/soft/hadoop260/data/jn
两个目录没有的话需自己创建
vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/soft/hadoop260/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop3:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop2:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop3:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/mycluster</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/soft/hadoop260/data/jn</value>
</property>
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop4:50090</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
vi mapred-site.xml
<configuration>
<property><name>mapreduce.framework.name</name><value>yarn</value></property>
</configuration>
vi yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop3</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop2:2181,hadoop3:2181,hadoop4:2181</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
3.将配置好的文件拷贝到其他节点
scp -r /opt/soft/hadoop260/etc/hadoop root@hadoop3:$pwd
scp -r /opt/soft/hadoop260/etc/hadoop root@hadoop4:$pwd
4.启动HDFS-HA集群
1)在各个JournalNode启动journalnode
sbin/hadoop-daemon.sh start journalnode
2)在hadoop2(nn1)上,进行格式化
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
3)在hadoop3(nn2)上,同步nn1的元数据信息
bin/hdfs namenode -bootstrapStandby
4)启动hadoop3
sbin/hadoop-daemon.sh start namenode
5)此时网页ip:50070显示状态为standby
6)在hadoop2上启动所有datanode
sbin/hadoop-daemons.sh start datanode
7)改变hadoop2状态为Active
bin/hdfs haadmin -transitionToActive nn1
问题:报错:
Automatic failover is enabled for NameNode at hadoop3/192.168.56.171:9000
Refusing to manually manage HA state, since it may cause
a split-brain scenario or other incorrect state.
If you are very sure you know what you are doing, please
specify the forcemanual flag.
强制更改状态
bin/hdfs haadmin -transitionToActive --forceactive --forcemanual nn1
5.自动故障转移
1)关闭所有HDFS服务
sbin/stop-dfs.sh
2)启动zookeeper集群
bin/zkServer.sh start
3)初始化HA在zookeeper中状态
bin/hdfs zkfc -formatZK
4)启动HDFS服务
sbin/start-dfs.sh
5)在各个namenode(hadoop2和hadoop3)上启动DFSZK Failover Controller,先在哪台机器启动,哪台就是Active NameNode
sbin/hadoop-daemon.sh start zkfc
6)验证
kill -9 namenode的id
7)查看hadoop2和hadoop3的状态
一台宕机,另一台就会变成active
遇到的问题
datanode启动查看进程jps里没有
解决方法1:
/opt/soft/hadoop260/data/tmp/dfs
删除文件
rm -rf data
格式化文件具体操作见上面
重新启动datanode
解决方法2:(三个节点)
/opt/soft/hadoop260/data/tmp/dfs/name/current
vi VERSION
把集群名称clusterid替换
/opt/soft/hadoop260/data/tmp/dfs/data/current里的clusterid
kill了active的节点,另一个namenode节点的状态不会自动变
解决方法1:
yum install psmisc(每个namenode节点都要安装)
解决方法2:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
6.配置YARN-HA集群
1)在hadoop3执行yarn(我的yarn在hadoop3上的,自己的看自己的配置)
sbin/start-yarn.sh
2)在hadoop2执行
sbin/yarn-daemon.sh start resourcemanager
3)查看服务状态
bin/yarn rmadmin -getServiceState rm1
jps查看进程
有两个resourcemanager(每个namenode)