192.168.17.128 xiaobai1 192.168.17.132 xiaobai2 192.168.17.133 xiaobai3 关闭防火墙和selinux
使用hadoop用户操作,如果使用的是root用户就不要上面的配置
#三台机器操作 [root@xiaobai1] su - hadoop #root用户跳过此步 [hadoop@xiaobai1] mkdir -p /apps/svr/java/ [hadoop@xiaobai1] tar xzvf jdk-8u111-linux-x64.tar.gz -C /apps/svr/java/ [hadoop@xiaobai1] vim ~/.bash_profile export JAVA_HOME=/apps/svr/java/jdk1.8.0_111 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH=$PATH:$JAVA_HOME/bin [hadoop@xiaobai1] source ~/.bash_profile [hadoop@xiaobai1] mkdir -p /apps/svr/hadoop/{data1,data2,lib,run,logs} [hadoop@xiaobai1] mkdir -p /apps/svr/hadoop/data1/{dn,nn} [hadoop@xiaobai1] mkdir -p /apps/svr/hadoop/data2/{dn,nn} [hadoop@xiaobai1] tar xzvf hadoop-2.7.3.tar.gz -C /apps/svr/hadoop/ [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/hadoop-env.sh export JAVA_HOME=/apps/svr/java/jdk1.8.0_111 #在主节点上操作 [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml <configuration> <!-- 设置NameNode运行的主机 --> <property> <name>fs.defaultFS</name> <value>hdfs://xiaobai1:9000</value> </property> <!-- hadoop文件系统依赖的基础配置 --> <property> <name>hadoop.tmp.dir</name> <value>/apps/svr/hadoop/run/</value> </property> <!-- hadoop的用户代理机制 --> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property> </configuration> [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml <configuration> <!-- datanode数据保存路径 --> <property> <name>dfs.datanode.data.dir</name> <value>/apps/svr/hadoop/data1/dfs/dn,/apps/svr/hadoop/data2/dfs/dn</value> </property> <!-- namenode所使用的元数据保存路径 --> <property> <name>dfs.namenode.name.dir</name> <value>/apps/svr/hadoop/data1/dfs/nn,/apps/svr/hadoop/data2/dfs/nn</value> </property> <!-- hdfs数据块的复制份数 --> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- dfs权限是否打开 --> <property> <name>dfs.permissions</name> <value>true</value> </property> </configuration> [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/slaves #配置slaves,设置DataNode运行的主机 localhost xiaobai2 xiaobai3 [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/yarn-site.xml <configuration> <!-- ResourceManager对客户端暴露的地址 --> <property> <name>yarn.resourcemanager.address</name> <value>xiaobai1:8032</value> </property> <!-- ResourceManager对ApplicationMaster暴露的访问地址 --> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>xiaobai1:8030</value> </property> <!-- ResourceManager对NodeManager暴露的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>xiaobai1:8031</value> </property> <!-- ResourceManager对管理员暴露的访问地址 --> <property> <name>yarn.resourcemanager.admin.address</name> <value>xiaobai1:8033</value> </property> <!-- ResourceManager对外web ui地址 --> <property> <name>yarn.resourcemanager.webapp.address</name> <value>xiaobai1:8038</value> </property> <!-- mapreduce中间需要经过shuffle过程 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/mapred-site.xml <configuration> <!-- mapreduce运行在yarn平台上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> [hadoop@xiaobai1] scp -r /apps/svr/hadoop/ hadoop@xiaobai2:/apps/svr [hadoop@xiaobai1] scp -r /apps/svr/hadoop/ hadoop@xiaobai3:/apps/svr #所有主机操作 [hadoop@xiaobai1] vim ~/.bash_profile export HADOOP_HOME=/apps/svr/hadoop/hadoop-2.7.3 export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/* export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin [hadoop@xiaobai1] source ~/.bash_profile #在主节点上操作 [hadoop@xiaobai1] hadoop namenode -format [hadoop@xiaobai1] start-dfs.sh [hadoop@xiaobai1] start-yarn.sh [hadoop@xiaobai1] yarn node -list访问192.168.17.128:50070 访问192.168.17.128:8038 可以翻译为中文,看到存活节点为三个
创建历史服务器,在xiaobai3上操作
[hadoop@xiaobai3] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>xiaobai3:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>xiaobai3:19888</value> </property> <property> <name>mapreduce.jobhistory.done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value> </property> <property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/tmp/hadoop-yarn/staging</value> </property> </configuration> #启动历史服务器 [hadoop@xiaobai3] mr-jobhistory-daemon.sh start historyserver访问192.168.17.133:19888
配置jdk,hadoop,安装解压,和前面一样
#所有主机都操作 [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml <configuration> <!-- 完全分布式集群名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode节点名称 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>xiaobai1:8020</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>xiaobai2:8020</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>xiaobai1:50070</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>xiaobai2:50070</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://xiaobai1:8485;xiaobai2:8485;xiaobai3:8485/mycluster</value> </property> <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <value>shell(/bin/true)</value> </property> <!-- ssh别的主机私钥存放地址,可以自动切换存活的namenode--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 声明journalnode服务器存储目录--> <property> <name>dfs.journalnode.edits.dir</name> <value>/apps/svr/hadoop/node/data</value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> </configuration> #记得将namenode上的公钥分别拷贝到各个namenode的节点上 [hadoop@xiaobai1] ssh-copy-id -i xiaobai [hadoop@xiaobai1] mkdir -p /apps/svr/hadoop/node/data [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml <configuration> <property> <!--这里改端口要和hdfs.site.xml文件里的RPC端口一直,默认8020--> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/apps/svr/hadoop/module/data</value> </property> </configuration> [hadoop@xiaobai1] mkdir -p /apps/svr/hadoop/module/data [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml #在这个文件的<configuration>标签中添加 <!--开启Automatic Failover模式--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml #在这个文件的<configuration>标签中添加 <!--zookeeper集群地址--> <property> <name>ha.zookeeper.quorum</name> <value>xiaobai1:2181,xiaobai2:2181,xiaobai3:2181</value> </property> [hadoop@xiaobai1] vim /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop/slaves #配置slaves,设置DataNode运行的主机 xiaobai1 xiaobai2 xiaobai3 #以上是hadoop的配置文件配置zookeeper
#所有机器都操作 [hadoop@xiaobai1] mkdir -p /apps/svr/zookeeper [hadoop@xiaobai1] tar xzvf zookeeper-3.4.8.tar.gz -C /apps/svr/zookeeper [hadoop@xiaobai1] cd /apps/svr/zookeeper/zookeeper-3.4.8/ [hadoop@xiaobai1 zookeeper-3.4.8] cp conf/zoo_sample.cfg conf/zoo.cfg [hadoop@xiaobai1 zookeeper-3.4.8] vim conf/zoo.cfg dataDir=/apps/svr/zookeeper/data dataLogDir=/apps/svr/zookeeper/logs clientPort=2181 tickTime=2000 initLimit=20 syncLimit=10 server.1=xiaobai1:2888:3888 server.2=xiaobai2:2888:3888 server.3=xiaobai3:2888:3888 #文件后不要留空格 [hadoop@xiaobai1 zookeeper-3.4.8] mkdir -p /apps/svr/zookeeper/{data,logs} #接下来三台机器分别操作,id号分别为1,2,3 [hadoop@xiaobai1 zookeeper-3.4.8] echo 1 > /apps/svr/zookeeper/data/myid [hadoop@xiaobai2 zookeeper-3.4.8] echo 2 > /apps/svr/zookeeper/data/myid [hadoop@xiaobai3 zookeeper-3.4.8] echo 3 > /apps/svr/zookeeper/data/myid #三台机器都操作 [hadoop@xiaobai1 zookeeper-3.4.8] cd bin/ [hadoop@xiaobai1 bin] ./zkServer.sh start [hadoop@xiaobai1 bin] ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /apps/svr/zookeeper/bin/../conf/zoo.cfg Mode: follower #在xiaobai1,xiaobai2机器上配置 [hadoop@xiaobai1 bin] cd /apps/svr/hadoop/hadoop-2.7.3 [hadoop@xiaobai1 hadoop-2.7.3] bin/hdfs zkfc -formatZK启动qjm,namenode
#所有机器操作 [hadoop@xiaobai1 hadoop-2.7.3] hadoop-daemon.sh start journalnode #在一台上格式化namenode,不要两台都格式化 [hadoop@xiaobai1 hadoop-2.7.3] hadoop namenode -format #格式化xiaobai1上的namenode [hadoop@xiaobai1 hadoop-2.7.3] sbin/hadoop-daemon.sh start namenode #启动 [hadoop@xiaobai1 hadoop-2.7.3] jps 5329 JournalNode 5145 Jps 5267 QuorumPeerMain 6379 NameNode #在第二台上同步第一台的namenode [hadoop@xiaobai2 hadoop] bin/hdfs namenode -bootstrapStandby [hadoop@xiaobai2 hadoop] sbin/hadoop-daemon.sh start namenode #xiaobai1上操作,启动集群命令 [hadoop@xiaobai1 hadoop] start-dfs.sh访问IP:50070可以看到两台机器都是standby状态
[hadoop@xiaobai1 hadoop] bin/hdfs haadmin -transitionToActive nn1 #将nn1机器状态切换为active #会有报错,使用下面的命令 [hadoop@xiaobai1 hadoop] bin/hdfs haadmin -transitionToActive --forcemanual nn1 #强制将nn1机器状态切换为active [hadoop@xiaobai1 hadoop] bin/hdfs haadmin -getServiceState nn1 active [hadoop@xiaobai1 hadoop] bin/hdfs haadmin -getServiceState nn2 standby用jps查看,如果没有DataNode节点,就将/apps/svr/hadoop/module/data/dfs/name/current/VERSION里的clusterID复制到/apps/svr/hadoop/module/data/dfs/data/current/VERSION里并重启
测试
#在xiaobai1机器上有jps查看到namenode的id号,kill -9杀掉 [hadoop@xiaobai1 hadoop] bin/hdfs haadmin -getServiceState nn1 20/10/19 09:20:08 INFO ipc.Client: Retrying connect to server: xiaobai1/10.20.184.229:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS) Operation failed: Call From xiaobai1/10.20.184.229 to xiaobai1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused #namenode1连接不上 [hadoop@xiaobai2 hadoop] bin/hdfs haadmin -getServiceState nn2 active #已经自动转换 #如果没有自动转换重启nn1,并且在xiaobai1上重新同步 [hadoop@xiaobai1 hadoop] sbin/hadoop-daemon.sh start namenode [hadoop@xiaobai1 hadoop] bin/hdfs namenode -bootstrapStandby #再次重复上面的操作,发现nn1和nn2可以自动切换了前面配置不变,和Hadoop-HA配置一样,然后启动hdfs和zookeeper
[hadoop@xiaobai1 hadoop] cd /apps/svr/hadoop/hadoop-2.7.3/etc/hadoop [hadoop@xiaobai1 hadoop] vim 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>yarn-cluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>192.168.17.128这里配置主节点ip,因为要跳转,配置解析过的名字是跳转不到的</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>192.168.17.132这里配置主节点ip,因为要跳转,配置解析过的名字是跳转不到的</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>xiaobai1:2181,xiaobai2:2181,xiaobai3:2181</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds</name> <value>3600</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/tmp/logs</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> </configuration> [hadoop@xiaobai1 hadoop] vim mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> [hadoop@xiaobai1 hadoop] start-yarn.sh #在yarn主节点上执行 [hadoop@xiaobai1 hadoop] start-all.sh #在主节点运行 [hadoop@xiaobai1 hadoop] yarn-daemon.sh start resourcemanager #在备用节点启动resourcemanager访问192.168.17.128加8088端口
访问192.168.17.132加8088端口 可以发现只能够显示一个主节点的界面,访问另一个会跳转到yarn-site-xml文件里配置的ip,最后两个显示的都是192.168.17.128:8088也就是小白2的界面
#到xiaobai2上杀掉进程,看看能否跳转 [hadoop@xiaobai2 hadoop] jps 3413 ResourceManager 3687 Jps 2634 DFSZKFailoverController 2139 JournalNode 2236 NameNode 2349 DataNode 3342 NodeManager 1583 QuorumPeerMain [hadoop@xiaobai2 hadoop] kill -9 3342访问192.168.17.128:8088 显示了几秒这个界面后就访问不到了 访问192.168.17.132加8088端口 我们发现可以实现自动跳转