1、环境准备
- 安装jdk配置环境变量 /etc/hosts等信息
- ssh免密登录
- 关闭防火墙
检查防火墙状态(如果active(running)那么关闭)
systemctl status firewalld
service iptables status
临时关闭防火墙
systemctl stop firewalld
service iptables stop
永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
2、集群规划
目前使用5台机器、相关的角色分配如下
hadoop1101 | hadoop1102 | hadoop1103 | hadoop1104 | hadoop1105 |
---|---|---|---|---|
zk | zk | zk | - | - |
NameNode | NameNode | NameNode | - | - |
zkfc | zkfc | zkfc | - | - |
- | - | JournalNode | JournalNode | JournalNode |
DataNode | DataNode | DataNode | DataNode | DataNode |
- | - | - | ResourceManager | ResourceManager |
NodeManager | NodeManager | NodeManager | NodeManager | NodeManager |
3 配置Zookeeper集群
- 下载zookeeper
- tar -xvf apache-zookeeper-3.6.2-bin.tar.gz -C /opt/(可换成安装目录我安装在/opt下面)
- 进入安装目录(apache-zookeeper-3.6.2-bin/conf) cp zoo_sample.cfg zoo.cfg 编辑zoo.cfg
主要进行两处修改:
a、修改dataDir 指定zk的数据信息放在哪里
b、server.1(id)=hadoop1101:2888:3888.
然后写入id信息到数据目录中的myid 文件中
echo 1 > /opt/data/zookeeper/myid
- 复制配置好的信息到另外两台机器
scp -r apache-zookeeper-3.6.2-bin root@hadoop1102:/opt/
ssh root@hadoop1102 "mkdir -p /opt/data/zookeeper ;echo 2 >/opt/data/zookeeper/myid"
scp -r apache-zookeeper-3.6.2-bin root@hadoop1103:/opt/
ssh root@hadoop1103 "mkdir -p /opt/data/zookeeper ;echo 3 >/opt/data/zookeeper/myid"
- 分别启动zookeeper
分别在三台机器上启动: bin/zkServer.sh start
- 检查是否启动成功
bin/zkServer.sh status
HDFS-HA配置
<br />1)官方地址:http://hadoop.apache.org/<br />2) 创建Hadoop安装目录,创建Hadoop的数据文件name元数据信息 journalNode 信息文件
mkdir -p /opt/data/hadoop/{name,jn,data}
- 配置hadoop-env.sh (hadoop全局环境) yarn 和hdfs用户最好不要配置,会报错.有解决方案是把这些配置信息加在启动脚本中
export JAVA_HOME=/usr/java/jdk1.8.0_131
#config the user of hdfs
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
#export HADOOP_SECURE_DN_USER=hdfs
#config user of yarn
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
#export HDFS_DATANODE_SECURE_USER=yarn
- 配置core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--零时文件路径,如果其他没有配置相对路径,所有的都会基于这个路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
<!-- 指定zkfc(namenode用于检活的一个线程)要连接的zkServer地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1101:2181,hadoop1102:2181,hadoop1103:2181</value>
</property>
- 配置hdfs-site.xml
<configuration>
<!-- NameNode数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/data/hadoop/name</value>
</property>
<!-- DataNode数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/data/hadoop/data</value>
</property>
<!-- JournalNode数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/data/hadoop/jn</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- NameNode的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1101:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop1102:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop1103:8020</value>
</property>
<!-- NameNode的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1101:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop1102:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop1103:9870</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1103:8485;hadoop1104:8485;hadoop1105:8485/mycluster</value>
</property>
<!-- 访问代理类:client用于确定哪个NameNode为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>
</property>
<!-- 使用隔离机制时需要ssh秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 启用nn故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
至此hdfs的相关配置已经完成,当然一般会跟yarn一起启动.
单独启动:
1、全部节点上配置Hadoop的环境变量(vi /etc/profile.d/my_env.sh)
直接在profile.d 构建一个文件,便于分发.
##HADOOP_HOME
export HADOOP_HOME=/opt/hadoop-3.2.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
2、在zookeeper中为nameNode创建目录(/hadoop-ha/mycluster)
hdfs zkfc -formatZK
3、在hadoop1103-1105上启动journalnode
hdfs --daemon start journalnode
4、在Hadoop101上对nameNode进行格式化,并启动namenode
hdfs namenode -format
hdfs --daemon start namenode
5、在hadoop1102 和 Hadoop1103 上同步nn1的元数据信息
hdfs namenode -bootstrapStandby
6、启动hadoop1102 和 Hadoop1103上的namenode
hdfs --daemon start namenode
7、在datanode上启动dataNode
hdfs --daemon start datanode
单独启动有点傻傻的感觉,可以直接使用start-dfs.sh,也可以使用start-all.sh.
start-dfs.sh 主要启动nameNode secondaryName datanode journal nodes zkfc
workers 是默认的datanode启动节点,同时也是默认的yarn 的nodemanager的启动节点信息
9870端口查看namenode信息
YARN-HA配置
1)、配置 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>
<!-- 声明2台resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!--指定resourcemanager的逻辑列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- ========== rm1的配置 ========== -->
<!-- 指定rm1的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1104</value>
</property>
<!-- 指定rm1的web端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1104:8088</value>
</property>
<!-- 指定rm1的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1104:8032</value>
</property>
<!-- 指定AM向rm1申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1104:8030</value>
</property>
<!-- 指定供NM连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop1104:8031</value>
</property>
<!-- ========== rm2的配置 ========== -->
<!-- 指定rm2的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop1105</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop1105:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop1105:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop1105:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop1105:8031</value>
</property>
<!-- 指定zookeeper集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1101:2181,hadoop1102:2181,hadoop1103: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>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!-- Site specific YARN configuration properties -->
</configuration>
- 、开启yarn
start-yarn.sh
8088端口查看服务