ps:mx为用户名
ha的搭建:
集群的规划:
hdfs:
namenode(2个) datanode(4个) journalnode(3台) zkfc(2个)
mapreduce
yarn:
resourcemanager(2个) nodemanager(4个)
zookeeper:
3台 QuorumPeerMain
hadoop05 hadoop06 hadoop07 hadoop08
hdfs namenode namenode
datanode datanode datanode datanode
journalnode journalnode journalnode
zkfc zkfc
yarn resourcemanager resourcemanager
nodemanager nodemanager nodemanager nodemanager
zk: QuorumPeerMain QuorumPeerMain QuorumPeerMain
集群搭建步骤:
集群准备:
1)ip 主机名
2)hosts
3)关闭防火墙 selinux
4)修改系统的启动级别 3
5)添加普通用户的selders权限
6)进行免密码登录
7)安装jdk
8)进行时间同步
搭建集群:
1.上传 hadoop-2.7.6.tar.gz
--------------------------------------------------------
2.解压
tar -xvzf hadoop-2.7.6.tar.gz -C /home/mx/apps/
--------------------------------------------------------
3.配置环境变量----之前创建过软链,不需要重新配置
vi /etc/profile
export HADOOP_HOME=/home/mx/apps/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
验证:
hadoop version
-----------------------------------------------------
4.修改hadoop的配置文件
cd /home/mx/apps/hadoop/etc/hadoop
在此目录下修改配置文件
vi ......
-----------------------------------------------------
1)hadoop-env.sh 导入jdk的环境变量
-----------------------------------------------------
# The java implementation to use.
export JAVA_HOME=/home/mx/apps/jdk
-----------------------------------------------------
2)core-site.xml
-----------------------------------------------------
<!-- 指定 hdfs 的 nameservice 为 bd1805 将两个namanode划分为一组 这里nameservice类似于组名 当前的bd1805代表的就是组名 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bd1805/</value>
</property>
<!-- 指定 hadoop 工作目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/mx/data/hadoopdata/</value>
</property>
<!-- 指定 zookeeper 集群访问地址 hadoop05\06\07为zookeeper配置的节点:2181默认端口-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value>
</property>
----------------------------------
3)hdfs-site.xml
----------------------------------
<!-- 指定副本数 4个节点副本数设为3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定 hdfs 的 nameservice 为 bd1805,需要和 core-site.xml 中保持一致-->
<property>
<name>dfs.nameservices</name>
<value>bd1805</value>
</property>
<!-- bd1805 下面有两个 NameNode,分别是 nn1,nn2(主机代名 随便起 配置时与主机一一对应即可 例如nn1对应hadoop05 则nn1通信地址对应hadoop05:9000) -->
<property>
<name>dfs.ha.namenodes.bd1805</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 的 RPC 通信地址 内部通信 -->
<property>
<name>dfs.namenode.rpc-address.bd1805.nn1</name>
<value>hadoop05:9000</value>
</property>
<!-- nn1 的 http 通信地址 外部通信 -->
<property>
<name>dfs.namenode.http-address.bd1805.nn1</name>
<value>hadoop05:50070</value>
</property>
<!-- nn2 的 RPC 通信地址 内部通信 -->
<property>
<name>dfs.namenode.rpc-address.bd1805.nn2</name>
<value>hadoop06:9000</value>
</property>
<!-- nn2 的 http 通信地址 外部通信-->
<property>
<name>dfs.namenode.http-address.bd1805.nn2</name>
<value>hadoop06:50070</value>
</property>
<!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 journalnode默认的通信的端口8485 qjournal(通信协议)://hadoop05(主机名):8485(端口);hadoop06:8485;hadoop07:8485/bd1805 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop05:8485;hadoop06:8485;hadoop07:8485/bd1805</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/mx/data/hadoopdata/journaldata</value>
</property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<!-- 注意:此处配置在安装的时候切记检查不要换行!!!
否则使用hadoop fs 命令会报错 Couldn't create proxy provider null -->
<property>
<name>dfs.client.failover.proxy.provider.bd1805</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 失败自动切换的时候 杀死active的方式-->
<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/mx/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
-------------------------------------
4)mapred-site.xml
-------------------------------------
<!-- 指定 mr 框架为 yarn 方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 设置 mapreduce 的历史服务器地址和端口号 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop06:10020</value>
</property>
<!-- mapreduce 历史服务器的 web 访问地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop06:19888</value>
</property>
---------------------------
5)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>yarnha</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>hadoop07</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop08</value>
</property>
<!-- 指定 zk 集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop05:2181,hadoop06:2181,hadoop07:2181</value>
</property>
<!-- 要运行 MapReduce 程序必须配置的附属服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启 YARN 集群的日志聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- YARN 集群的聚合日志最长保留时长 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
</property>
<!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
-----------------------
6)配置从节点
-----------------------
vi slaves
hadoop05
hadoop06
hadoop07
hadoop08
5.远程发送hadoop的安装包和环境变量
cd /home/mx/apps
scp -r hadoop-2.7.6 hadoop06:/home/hadoop/apps/
scp -r hadoop-2.7.6 hadoop07:/home/hadoop/apps/
scp -r hadoop-2.7.6 hadoop08:/home/hadoop/apps/
之前配置过环境变量,添加了软连接 不需要再次配置
但需要重新加载环境变量
source /etc/profile
查看hadoop版本信息
hadoop version
================================================================
6.格式化并启动集群(严格按照顺序执行!!!)
----------------------------------------------------------------
1)启动zookeeper
hadoop05/hadoop06/hadoop7三个节点启动zookeeper
zkServer.sh start
zkServer.sh status查看是否启动成功
----------------------------------------------------------------
2)启动journalnode 存放共享文件的
各个节点~目录上启动:(没要求)
hadoop06: hadoop-daemon.sh start journalnode
hadoop07: hadoop-daemon.sh start journalnode
hadoop08: hadoop-daemon.sh start journalnode
----------------------------------------------------------------
3)格式化namenode
在一个namenode节点上进行格式化(hadoop05或者hadoop06)
hadoop05:hadoop namenode -format
将这个节点的格式化的数据发送到另外一个namenode节点中
scp -r /home/mx/data/hadoopdata/dfs hadoop06:/home/mx/data/hadoopdata/
----------------------------------------------------------------
4)格式化zkfc 在一个namenode节点上就可以
hdfs zkfc -formatZK
在zookeeper集群中创建namenode的相关状态信息存储目录
----------------------------------------------------------------
5)启动hadoop集群
先启动hdfs
start-dfs.sh 在任意节点执行
启动yarn: 最好在yarn的主节点执行 任意一个resourcemanager的节点hadoop07/hadoop08
start-yarn.sh
注意:
这里只能启动当前节点的resourcemanager 另外一个节点的resourcemanager需要手动启动
yarn-daemon.sh start resourcemanager
------------------------------------------------------------------
查看各主节点的状态
HDFS:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
YARN:
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
------------------------------------------------------------------
测试:
hdfs的测试:
namenode的节点:
hadoop05:50070
hadoop06:50070
主备切换:
kill activenamenode
yarn的测试:
resourcemanager节点:
hadoop07:8088
hadoop08:8088
--------------------------------------------------------
1、干掉 active namenode,standby变为active 重新启动---standby
2、在上传文件的时候干掉 active namenode, 文件上传不受影响
3、干掉 active resourcemanager, standby变为active 重新启动---standby
4、在执行任务的时候干掉 active resourcemanager,任务不受影响