1. hadoop HA部署

1.1 解压JDK安装包,配置环境变量。

1.1.1. 将/opt/data下的JDK包解压到/usr/local/src目录下。

tar -zxvf jdk-7u80-linux-x64.tar.gz -C /usr/local/src  

1.1.2 修改jdk名称

mv jdk1.7.0_80/ jdk 

1.1.3 设置JDK环境变量,并使环境变量只对当前root用户生效

vi /etc/profile 

export JAVA_HOME=/usr/local/src/jdk 
export PATH=$JAVA_HOME/bin:$PATH 

# 使环境变量生效 
source /etc/profile 

# 查看javab版本 
java -version 

1.2 创建 ssh 密钥,实现免密登录。

1.2.1 ***h密钥登录,在每台服务器的/root/.ssh/ 目录中,执行如下命令生成一对密 钥,并将本地主机的公钥添加到远程主机的authorized_keys文件上。三台机器两两双 向进行配置,注意包括自己对自已。(三台机器都需要)

ssh-keygen -t rsa 
ssh-copy-id ip 

1.2.2 从hadoop1复制JDK及环境变量文件到hadoop2、hadoop3节点

scp -r /usr/local/src root@hadoop2:/usr/local/ 
scp -r /usr/local/src root@hadoop3:/usr/local/ 
scp -r /etc/profile root@hadoop2:/etc 
scp -r /etc/profile root@hadoop3:/etc

1.3 将/opt/data/下的hadoop安装包解压到/usr/local/src目录下

1.3.1 进入/opt/data/目录,解压hadoop

cd /opt/data 
tar -zxvf hadoop-2.6.4.tar.gz -C /usr/local/src 

1.3.2 修改文件名

cd /usr/local/src 
mv hadoop-2.6.4/ hadoop

1.3.3 配置Hadoop环境变量 vi /etc/profile

export HADOOP_HOME=/usr/local/src/hadoop 
export HADOOP_INSTALL_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export HADOOP_MAPRED_HOME=$HADOOP_HOME 
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export YARN_HOME=$HADOOP_HOME 
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH 

使环境变量生效,并检查hadoop是否安装成功(直接输入hdfs命令)

hdfs 

1.3.4 将hadoop及环境变量拷贝到hadoop2和hadoop3上

scp -r /usr/local/src/hadoop root@hadoop2:/usr/local/src scp -r /usr/local/src/hadoop root@hadoop3:/usr/local/src scp -r /etc/profiel root@hadoop2:/etc 
scp -r /etc/profiel root@hadoop3:/etc 

使slave1、slave2环境变量生效

source /etc/profile 

1.4 安装配置zookeeper 将/opt/data/下的zookeeper安装包解压到/usr/local/src目录下

1.4.1 进入/opt/data/目录,解压hadoop

cd /opt/data 
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/src 

1.4.2 修改文件名

cd /usr/local/src 
mv zookeeper-3.4.6/ zookeeper 

1.4.3 进入zookeeper的conf目录下,将zoo_sample.cfg重命名为zoo.cfg,编辑此配置文 件

vi zoo.cfg

修改:dataDir=/usr/local/src/zookeeper/tmp 
在最后添加: 
server.1=hadoop1:2888:3888 
server.2=hadoop2:2888:3888 
server.3=hadoop3:2888:3888 

1.4.4 在zookeeper目录下创建一个tmp文件夹

mkdir /usr/local/src/zookeeper/tmp

创建空文件

touch /usr/local/src/zookeeper/tmp/myid 
# 并写入ID号 
echo 1 > /usr/local/src/zookeeper/tmp/myid 

将拷贝好的zookeeper拷贝到其他节点(slave1、slave2) 在/usr/local/src/目录下进行拷贝

scp -r zookeeper root@hadoop2:$/usr/local/src 
scp -r zookeeper root@hadoop3:$/usr/local/src  

并将各自zookeeper下的tmp目录里的myid文件内容分别改为2,3

1.5 配置hadoop(在master上)

1.5.1 配置core-site.xml文件

cd /usr/local/src/hadoop/etc/hadoop 
vi core-site.xml 

    <!--指定hdfs的nameservice为ns1--!>     
    <property>      
        <name>fs.defaultFS</name>      
        <value>hdfs://ns1</value>     
    </property>   

    <!--指定Hadoop临时目录--!>     
    <property>      
        <name>hadoop.tmp.dir</name>      
        <value>/usr/local/src/hadoop/tmp</value>     
    </property>  

    <!--指定zookeeper地址--!>     
    <property>      
        <name>ha.zookeeper.quorum</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</vaule>     
    </property> 

1.5.2 配置hdfs-site.xml

<!--指定hdfs的nameservice为ns1,需要和core-site.xml--!>     
<property>      
    <name>dfs.nameservices</name>      
    <value>ns1</value>     
</property>    

<!--ns1下面由两个NameNode,分别是nn1,nn2--!>     
<property>      
    <name>dfs.ha.namenodes.ns1</name>      
    <value>nn1,nn2</value>     
</property>   

 <!--nn1的RPC通信地址--!>     
<property>      
    <name>dfs.namenode.rpcaddress.ns1.nn1</name>
    <vaule>hadoop1:9000</value>     
</property>    

<!--nn1的http通信地址--!>     
<property>      
    <name>dfs.namenode.httpaddress.ns1.nn1</name>      
    <value>hadoop1:50070</value>     
</property>    

<!--nn2的RPC通信地址--!>     
<property>      
    <name>dfs.namenode.rpcaddress.ns1.nn2</name>      
    <vaule>hadoop2:9000</value>     
</property>  

<!--nn2的http通信地址--!>     
<property>      
    <name>dfs.namenode.httpaddress.ns1.nn2</name>      
    <value>hadoop2:50070</value>     
</property>  

<!--指定NameNode的元数据在JournalNode上的存放位 置--!>     
<property>      
    <name>dfs.namenode.shared.edits.dir</name>      
    <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns1</value> 
</property> 

<!--指定JournalNode在本地磁盘存放数据的位置--!> 
<property> 
    <name>dfs.journalnode.edits.dir</name>                     
    <value>/usr/local/src/hadoop/tmp</value> 
</property> 

<!--开启NameNode失败自动切换--!> 
<property> 
    <name>atic-failover.enabled</name> 
    <value>true</value> 
</property> 

<!--配置隔离机制方法,多个机制用换行分割,--!> 
<property> 
    <name>dfs.ha.fencing.methods</name> 
    <value>sshfence</value> 
</property> 

<!--***hfence隔离机制时需要ssh免登陆--!> 
<property>                 
    <name>dfs.ha.fencing.ssh.private-key-files</name> 
    <value>/home/hadoop/.ssh/id_rsa</value> 
</property> 

<!--***hfence隔离机制超时时间--!> 
<property> 
    <name>dfs.ha.fencing.ssh.connect-timeout</name> 
    <value>30000</value> 
</property> 

<!--Hadoop运行时 namenode datanode产生的文件--!>
<property>                      
    <name>dfs.namenode.name.dir</name> 
    <value>file:/usr/local/src/hadoop/tmp/dfs/name</value>    
</property> 

<property>      
    <name>dfs.datanode.data.dir</name>      
    <value>file:/usr/local/src/hadoop/tmp/dfs/data</value> 
</property>                   

1.5.3 配置mapred-site.xml

mv mapred-site.xml.template mapred-site.xml 

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

1.5.4 配置yarn-site.xml

vi yarn-site.xml 

<!--开启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>hadoop2</value>     
</property>     
<property>      
    <name>yarn.resourcemanager.hostname.rm2</name>      
    <value>hadoop3</value>     
</property>    
<!--指定zk集群地址--!>     
<property>      
    <name>yarn.resourcemanager.zkaddress</name>      
    <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>     
</property>     
<property>      
    <name>yarn.nodemanager.auxservices</name>      
    <value>mapreduce_shuffle</value>     
</property> 

1.5.5 配置slaves

vi slaves

    hadoop1     
    hadoop2     
    hadoop3

1.5.6 配置hadoop-env.sh vi hadoop-env.sh

vi hadoop-env.sh

export JAVA_HOME=/usr/local/src/jdk

1.6 启动hadoop集群

1.6.1 启动zookeeper集群(需要启动zookeeper进程机子上)<hadoop1、hadoop2、 hadoop3>

cd /usr/local/zookeeper/bin/
./zkSever.sh start

查看进程状态一个leader 两个follower

./zkSever.sh status

[root@hadoop1 bin]# zkServer.sh start 
JMX enabled by default 
Using config: /root/zookeeper/bin/../conf/zoo.cfg 
Starting zookeeper ... STARTED 
[root@hadoop1 bin]# zkServer.sh status  
JMX enabled by default   
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg   
Mode: leader


[root@hadoop2 bin]# zkServer.sh start 
JMX enabled by default 
Using config: /root/zookeeper/bin/../conf/zoo.cfg 
Starting zookeeper ... STARTED 
[root@hadoop2 bin]# zkServer.sh status   
JMX enabled by default   
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg   
Mode: follower 



[root@hadoop3 bin]# zkServer.sh start 
JMX enabled by default 
Using config: /root/zookeeper/bin/../conf/zoo.cfg 
Starting zookeeper ... STARTED 
[root@hadoop3 bin]# zkServer.sh status   
JMX enabled by default   
Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg   
Mode: follower  

1.6.2 启动journalnode(需要启动journalnode的电脑上)<hadoop1、hadoop2、 hadoop3>

cd /usr/local/hadoop/sbin 
./hadoop-daemon.sh start journalnode 

用jps查看master,slave1,slave2 是否多出journalnode( jps、journalnode、 QuorumPeerMain )

4072 Jps 
4062 JournalNode 
3909 QuorumPeerMain

1.6.3 格式化hdfs

在master 机子上执行命令(需要namenode)

hdfs namenode -format

格式化之后会根据core-site.xml中的hadoop.tmp.dir配置生成个文件(tmp)然后将 这个文件拷贝到hadoop2中(必须可以运行namenode进程)hadoop目录下

1.6.4 格式化 zkfs(执行一次即可 在有namenode的机子上执行)

hdfs zkfc -formatZK 

1.6.5 启动hdfs(在master的hadoop目录下)

./sbin/start-dfs.sh 

1.6.6 启动yarn(hadoop3) 因为namenode与resourcemanager都需要占用大量资源 最好是将两个进程分开 在需要启动resourcemanage机子上启动resourcemanager(hadoop3)

./sbin/start-yarn.sh

1.7 使用jps查看进程

hadoop1:

3914 DFSZKFailoverController  
3557 DataNode  
4081 NameNode  
2552 QuorumPeerMain  
3357 JournalNode  
3669 NodeManager  
5716 Jps

hadoop2:

3719 NameNode  
3129 DataNode  
6543 Jps  
2460 QuorumPeerMain  
3451 DFSZKFailoverController  
3241 NodeManager  
3025 JournalNode  

hadoop3:

2700 JournalNode  
2838 DataNode  
3569 Jps  
2952 ResourceManager  
3040 NodeManager  
2471 QuorumPeerMain