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