hadoop、zookeeper完全分布式搭建,高可用集群搭建

  • Post author:
  • Post category:其他




一、hadoop完全分布式搭建

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配置完成



二、zookeeper完全分布式搭建

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)



版权声明:本文为wfdsj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。