搭建高可用hadoop集群

来源:互联网 发布:c语言strlen 编辑:程序博客网 时间:2024/05/17 07:12

环境说明:

red-hat 6.7

hadoop-2.7.3

zookeeper-3.4.9

jdk1.8.0_131

备注:我将所有需要的包,都放置在/usr/local/路径下了

本次环境搭建的机器总共为3台

192.168.40.140 hd1   主节点

192.168.40.141 hd2   主备节点

192.168.40.142 hd3   从节点

若集群安装成功,各个节点的进程说明:

hd1:namenoderesouremanager datanodeQuorumPeerMain journalnodeZKFC
hd2:namenode resouremanagerdatanode QuorumPeerMainjournalnode ZKFC
hd3:nodemanager datanodeQuorumPeerMain journalnode

环境前期准备:

第一步:

更改主机名(有两种方式)

方法一:在shell命令模式下,直接输入hostname  hd1则可将当前主机名更改为hd1,但是此方法只能临时生效,重启后将失效

方法二(推荐):vi /etc/sysconfig/network,此方法需要重启 才生效,并且永久生效

192.168.40.140更改主机名为 hd1

192.168.40.141更改主机名为 hd2

192.168.40.143更改主机名为 hd3

第二步:修改域名关系(所有机器都需修改)

vi /etc/hosts   添加如下内容

192.168.40.140 hd1

192.168.40.141 hd2

192.168.40.142 hd3

第三步:创建hadoop用户(所有机器都需修改)

useradd hadoop

为hadoop用户创建密码

passwd hadoop  (敲入此命令回车,输入密码即可,密码将隐藏不见)

第四步:安装JDK(所有机器都需修改)

解压jdk-8u131-linux-x64.tar 到/usr下

第五步:修改环境变量   vi /etc/profile  (所有机器都需修改)

export JAVA_HOME=/usr/jdk1.8.0_131
export JAVA_BIN=/usr/jdk1.8.0_131/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

第六步:使环境变量生效  source /etc/profile  (所有机器都需要执行)

第七步:切换到hadoop用户(所有机器都执行)

第八步:做免密钥登录(所有机器都执行)

产生密钥:ssh-keygen -t rsa
将密钥拷贝到其他节点
ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hd1
ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hd2
ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hd3

安装zookeeper集群(只需要主节点执行)

第一步:解压zookeeper软件包

tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/local

第二步:修改配置文件

cd /usr/local/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改dataDir=/usr/local/zookeeper-3.4.9/tmp
在配置文件最后添加
server.1=hd1:2888:3888
server.2=hd2:2888:3888
server.3=hd3:2888:3888
2.1   创建tmp目录(需在/usr/local/zookeeper-3.4.9目录下执行

mkdir tmp

2.2   将配置好的zookeeper复制到其他节点
scp -r /usr/local/zookeeper-3.4.9/ hd2:/usr/local
scp -r /usr/local/zookeeper-3.4.9/ hd3:/usr/local

2.3   在hd1机器上修改文件

vi   /usr/local/zookeeper-3.4.9/tmp/myid

输入1  (本值与上面的server.1保持一致)

2.4   在hd2机器上修改文件

vi   /usr/local/zookeeper-3.4.9/tmp/myid

输入2  (本值与上面的server.2保持一致)

2.5   在hd1机器上修改文件

vi   /usr/local/zookeeper-3.4.9/tmp/myid

输入3  (本值与上面的server.3保持一致)

        注意修改tmp/myid

安装hadoop集群(主节点执行即可)

第一步:解压软件包

tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local

第二步:配置hadoop用户的环境变量,需要到hadoop的家目录下执行

vi .bash_profile

添加

export JAVA_HOME=/usr/jdk1.8.0_131
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export PATH=$PATH:$JAVA_HOME/bin:/$HADOOP_HOME/bin

第三步:修改配置文件(配置文件都在$HADOOP_HOME/etc/hadoop目录下面)

3.1 vi hadoop-env.shvi hadoop-env.sh

添加   export JAVA_HOME=/usr/jdk1.8.0_131

3.2 vi core-site.xml(注意,将所有参数配置都加在<configuration></configuration>标签对里面,若文件里面有这个标签了,就不用再将 下方的<configuration></configuration>标签写入,后面参数配置都是如此,需细心)

<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bi/</value>
</property>
<!-- 指定hadoop临时目录 -->     
<property>
<name>hadoop.tmp.dir</name>
<value>
/usr/local/hdpdata/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hd1:2181,hd2:2181,hd3:2181</value>
</property>
</configuration>

注:/usr/local/hdpdata目录,需要自己创建   

3.3 vi hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice为bi,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>bi</value>
</property>
<!-- bi下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.bi</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn1</name>
<value>hd1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn1</name>
<value>hd1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn2</name>
<value>hd2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn2</name>
<value>hd2:50070</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hd1:8485;hd2:8485;hd3:8485/bi</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/
usr/local/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.bi</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

注:/usr/local/journaldata<目录,需要自己创建 

3.4 vi mapreduce-site.xml

<configuration>                      
      <!-- 指定mr框架为yarn方式 -->        
     <property>                           
     <name>mapreduce.framework.name</name>
     <value>yarn</value>                  
     </property>                          
     </configuration>

3.5  vi yarn-site.xml

<configuration>                                                     
     <!-- 开启RM高可用 -->                          
     <property>                                     
     <name>yarn.resourcemanager.ha.enabled</name>   
     <value>true</value>                            
     </property>                                    
     <!-- 指定RM的cluster id -->                    
     <property>                                     
     <name>yarn.resourcemanager.cluster-id</name>   
     <value>yrc</value>                             
     </property>                                    
     <!-- 指定RM的名字 -->                          
     <property>                                     
     <name>yarn.resourcemanager.ha.rm-ids</name>    
     <value>rm1,rm2</value>                         
     </property>                                    
     <!-- 分别指定RM的地址 -->                      
     <property>                                     
     <name>yarn.resourcemanager.hostname.rm1</name> 
     <value>hd1</value>                           
     </property>                                    
     <property>                                     
     <name>yarn.resourcemanager.hostname.rm2</name> 
     <value>hd2</value>                           
     </property>                                    
     <!-- 指定zk集群地址 -->                        
     <property>                                     
     <name>yarn.resourcemanager.zk-address</name>   
     <value>hd1:2181,hd2:2181,hd3:2181</value>
     </property>                                    
     <property>                                     
     <name>yarn.nodemanager.aux-services</name>     
     <value>mapreduce_shuffle</value>               
     </property>                                    
     </configuration>

3.6  vi slaves

hd1

hd2

hd3

第四步:配置好的hadoop拷贝到其他节点

scp -r /usr/local/hadoop-2.7.3 hd2:/usr/local
scp -r /usr/local/hadoop-2.7.3 hd3:/usr/local 

第五步:开启集群(许先将zookeeper开启)

到zookeeper安装目录(所有机器都需要执行)

cd /usr/local/zookeeper-3.4.9/bin

第六步、启动集群严格按照下面步骤
6.1、启动zookeeper集群(三台都要启动)
./zkServer.sh start    
查看状态
./zkServer.sh status

查看zookeeper是否成功

./zkServer.sh status查看zookeeper状态,若有一个leader,其他为follwer则是成功

6.2、启动journalnode(三台都要启动)
cd /hadoop-2.7.3
sbin/hadoop-daemon.sh start journalnode
   jps命令查看进程
6.3、格式化HDFS(只能格式化一次)
hdfs namenode -format 
格式化后会根据core-site.xml生成hadoop.tmp.dir,将目录复制到hd2节点上
scp -r tmp/ hd2:/usr/local/hadoop-2.7.3/
6.4、格式化ZKFC(在hd1上执行一次即可)

hdfs zkfc -formatZK    
6.5、启动呢HDFS(在hd1上执行) 
./start-dfs.sh
6.6、启动YARN(在hd1上执行) 
./start-yarn.sh
6.7 另外一个节点上启动resourcemanager
./yarn-daemon.sh start resourcemanager
可以在浏览器上面访问hd1:50070、hd2:50070   
查看hdfs的各节点状态信息bin/hdfs dfsadmin -report
获取一个namenode节点的HA状态bin/hdfs haadmin -getServiceState nn1
手动进行active和standly状态的切换bin/hdfs haadmin -failover nn1 nn2(将nn1的active状态切换到nn2上)
单独启动一个namenode进程sbin/hadoop-daemon.sh start namenode
单独启动一个zkfc进程./hadoop-daemon.sh start zkfc

原创粉丝点击