文章目录
HadoopHA
环境部署
配置主机映射
[root@master software]# vim /etc/hosts
分发映射
[root@master software]# scp /etc/hosts slave1:/etc/hosts
[root@master software]# scp /etc/hosts slave2:/etc/hosts
配置免密登录
[root@master software]# ssh-keygen
[root@slave1 software]# ssh-keygen
[root@slave2 software]# ssh-keygen
拷贝公钥
[root@master software]# ssh-copy-id slave1
[root@master software]# ssh-copy-id slave2
[root@master software]# ssh-copy-id master
[root@slave1 software]# ssh-copy-id slave1
[root@slave1 software]# ssh-copy-id slave2
[root@slave1 software]# ssh-copy-id master
[root@slave2 software]# ssh-copy-id slave1
[root@slave2 software]# ssh-copy-id slave2
[root@slave2 software]# ssh-copy-id master
安装jdk
解压java安装包
[root@master software]# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local/src
[root@master software]# cd /usr/local/src
[root@master src]# mv jdk1.8.0_144/ java
修改环境变量
[root@master src]# vim /etc/profile
##java
export JAVA_HOME=/usr/local/src/java
export PATH=$PATH:$JAVA_HOME/bin
分发环境变量
[root@master src]# scp /etc/profile slave1:/etc/profile
[root@master src]# scp /etc/profile slave2:/etc/profile
分发java安装目录
[root@master src]# scp -r /usr/local/src/java slave1:/usr/local/src
[root@master src]# scp -r /usr/local/src/java slave2:/usr/local/src
配置zookeeper
解压zookeeper安装包
[root@master software]# tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/src[root@master software]# cd /usr/local/src[root@master src]# mv zookeeper-3.4.5/ zookeeper
配置环境变量
[root@master src]# vim /etc/profile[root@master src]# source /etc/profile##zookeeperexport ZOOKEEPER_HOME=/usr/local/src/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin
分发环境变量
[root@master src]# scp /etc/profile slave1:/etc/profile[root@master src]# scp /etc/profile slave2:/etc/profile
修改配置文件
[root@master src]# cd /usr/local/src/zookeeper/conf[root@master conf]# mv zoo_sample.cfg zoo.cfg[root@master conf]# vim zoo.cfg
id号要和myid里面一致
[root@master conf]# cd /usr/local/src/zookeeper[root@master zookeeper]# mkdir zkData[root@master zookeeper]# cd zkData/[root@master zkData]# vim myid
分发zookeeper目录
[root@master zkData]# scp -r /usr/local/src/zookeeper slave1:/usr/local/src[root@master zkData]# scp -r /usr/local/src/zookeeper slave2:/usr/local/src
修改myid
启动zookeeper集群
[root@master src]# zkServer.sh start[root@slave1 src]# zkServer.sh start[root@slave2 src]# zkServer.sh start
配置hadoop
解压安装包
[root@master software]# tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/src[root@master software]# cd /usr/local/src/[root@master src]# mv hadoop-2.6.0/ hadoop
配置环境变量
[root@master src]# vim /etc/profile[root@master src]# source /etc/profile##hadoopexport HADOOP_HOME=/usr/local/src/hadoopexport PATH=$PATH:$HADOOP_HOME/binexport PATH=$PATH:$HADOOP_HOME/sbin###export HADOOP_PREFIX=$HADOOP_HOMEexport HADOOP_MAPRED_HOME=$HADOOP_HOMEexport HADOOP_COMMON_HOME=$HADOOP_HOMEexport HADOOP_HDFS_HOME=$HADOOP_HOMEexport YARN_HOME=$HADOOP_HOMEexport HADOOP_INSTALL=$HADOOP_HOMEexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/bin/native
分发环境变量
[root@master src]# scp /etc/profile slave1:/etc/profile[root@master src]# scp /etc/profile slave2:/etc/profile
尚大修改配置文件
core-site.xml
<configuration> <!-- 把两个 NameNode)的地址组装成一个集群 mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定 hadoop 运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/src/hadoop/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property></configuration>
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>master:9000</value> </property> <!-- nn2 的 RPC 通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>slave1:9000</value> </property> <!-- nn1 的 http 通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master:50070</value> </property> <!-- nn2 的 http 通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>slave1:50070</value> </property> <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用隔离机制时需要 ssh 无秘钥登录--> <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>/usr/local/src/hadoop/jn</value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <property> <name>dfs.support.append</name> <value>true</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.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/src/hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/src/hadoop/data</value> </property> </configuration>
yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--启用 resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--声明两台 resourcemanager 的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slave1</value> </property> <!--指定 zookeeper 集群的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <!--启用自动恢复--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定 resourcemanager 的状态信息存储在 zookeeper 集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property></configuration>
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property></configuration>
修改配置文件
core-site.xml
<configuration> <!-- 指定hdfs的nameservice为mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/src/hadoop/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <!-- hadoop链接zookeeper的超时时长设置 --> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>30000</value> <description>ms</description> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
hdfs-site.xml
<configuration> <!-- journalnode集群之间通信的超时时间 --> <property> <name>dfs.qjournal.start-segment.timeout.ms</name> <value>60000</value> </property> <!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标识符。 配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。 例如,如果使用"mycluster"作为nameservice ID,并且使用"master"和"slave1"作为NameNodes标识符 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- mycluster下面有两个NameNode,分别是master,slave1 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- master的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master:9000</value> </property> <!-- slave1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>slave1:9000</value> </property> <!-- master的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master:50070</value> </property> <!-- slave1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>slave1:50070</value> </property> <!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表 该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId journalId推荐使用nameservice,默认端口号是:8485 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</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.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/src/hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/src/hadoop/data</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/src/hadoop/jn</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 启用webhdfs --> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> </configuration>
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>master</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slave1</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>86400</value> </property> <!-- 启用自动恢复 --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 制定resourcemanager的状态信息存储在zookeeper集群上 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property></configuration>
mapred-site.xml
<configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 指定mapreduce jobhistory地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <!-- 任务历史服务器的web地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property></configuration>
声明集群
[root@master hadoop]# vim slaves
修改JAVA_HOME
[root@master hadoop]# vim yarn-env.sh [root@master hadoop]# vim hadoop-env.sh [root@master hadoop]# vim mapred-env.sh
分发配置文件
[root@master hadoop]# scp -r /usr/local/src/hadoop slave1:/usr/local/src/[root@master hadoop]# scp -r /usr/local/src/hadoop slave2:/usr/local/src/
启动集群
启动journalnode
[root@master hadoop]# hadoop-daemons.sh start journalnode
格式化namenode
[root@master hadoop]# hadoop namenode -format//复制namenode元数据到其他节点[root@master hadoop]$ scp -r /usr/local/src/hadoop/name slave1:/usr/local/src/hadoop/[root@master hadoop]$ scp -r /usr/local/src/hadoop/name slave2:/usr/local/src/hadoop/
格式化zkfc
[root@master hadoop]# hdfs zkfc -formatZK
启动hdfs
[root@master hadoop]# start-dfs.sh
启动yarn
[root@master hadoop]# start-yarn.sh [root@slave1 hadoop]# yarn-daemon.sh start resourcemanager
启动历史服务器
[root@master hadoop]# mr-jobhistory-daemon.sh start historyserver