3.1.3
节点 | 角色 |
---|---|
node1 | NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager |
node2 | NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager |
node3 | NameNode,JournalNode,DFSZKFailoverController,DataNode,ResourceManager,NodeManager |
接下来配置以三台服务器组成Hadoop高可用集群,目前是一个比较紧凑的集群,每个节点上都存在所有的角色,实际生产环境中管理节点和工作节点角色应尽量分离,管理节点在小型集群(几十台以内)中有3台即可, 大型集群配置5台管理节点。
当前Hadoop环境的安装目录定为:/opt/hadoop-3.1.3
,数据目录定为:/data/hadoop
,3个节点均已经安装ZooKeeper服务。
然后进行安装:
解压文件夹
tar zxvf hadoop-3.1.3.tar.gz -C /opt/
# 进入配置文件所在目录
cd /opt/hadoop-3.1.3/etc/hadoop
在配置文件目录下进行配置
编辑hadoop-env.sh
配置文件,例如:vim hadoop-env.sh
,添加变量如下:
# 服务器jdk路径请自行确认
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
export HADOOP_HEAPSIZE_MAX="8192"
export HADOOP_HEAPSIZE_MIN="4096"
编辑core-site.xml
配置文件,例如: vim core-site.xml
,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdfscluster</value>
</property>
<!--临时文件路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
<!-- 配置ZooKeeper集群地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
编辑hdfs-site.xml
配置文件,例如: vim hdfs-site.xml
,配置内容如下:
此文件conf目录中没有, 需要新建
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hdfscluster</value>
</property>
<!-- nn1,nn2,nn3名称可以自定义, 此处指定3台, 无需更改, 默认即可 -->
<property>
<name>dfs.ha.namenodes.hdfscluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- 端口不变, 修改作为namenode的3台主机的host或ip -->
<property>
<name>dfs.namenode.rpc-address.hdfscluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdfscluster.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdfscluster.nn3</name>
<value>node3:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hdfscluster.nn1</name>
<value>node1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.hdfscluster.nn2</name>
<value>node2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.hdfscluster.nn3</name>
<value>node3:9870</value>
</property>
<!-- 副本数量 当前设置为: 2 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- qjournal文件管理, 修改host或ip-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/hdfs-ha</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hdfscluster</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.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/dfs/journalnode</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 指定数据目录路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/dfs/name</value>
</property>
<!-- data目录可以配置多个, 用逗号分隔 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>100</value>
</property>
</configuration>
编辑yarn-site.xml
配置文件,例如: vim yarn-site.xml
,配置内容如下:
<configuration>
<!--启用高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<description>是否开启resourcemanager高可用</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarncluster</value>
<description>标识集群的id, 以确保RM不会接替另一个群集的活动状态, 名称自定义</description>
</property>
<!-- resourcemanager的id, 此处指定3台, 名称自定义, 使用默认即可 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
<description>集群管理节点id列表, id可以自定义 e.g. 节点1: rm1, 节点2: rm2, 节点3: rm3 ...,保证至少有2台管理节点即可</description>
</property>
<!-- 指定3台resourcemanager的host或ip -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node1</value>
<description>节点1的真实服务器地址(hostname或ip), name中的rm1为节点1的id, 与节点id列表中的id一致</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node2</value>
<description>节点2的真实服务器地址(hostname或ip), name中的rm2为节点2的id, 与节点id列表中的id一致</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>node3</value>
<description>节点3的真实服务器地址(hostname或ip), name中的rm2为节点2的id, 与节点id列表中的id一致</description>
</property>
<!-- 指定web端口 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>node3:8088</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
<description>开启自动恢复</description>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
<description>指定存储状态信息到zookeeper的类</description>
</property>
<!--指定zookeeper服务地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
<description>zookeeper集群地址</description>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>启用或禁用日志聚合, 默认关闭</description>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>2592000</value>
<description>删除聚合日志前要保留多长时间 当前为30天, 默认-1, 即关闭删除功能</description>
</property>
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>86400</value>
<description>检查间隔, 单位秒, 默认为聚合日志保留时间的十分之一</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>聚合日志所在的hdfs路径</description>
</property>
<!-- 日志服务地址, 指定一台即可 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
<description>日志服务url,与mapred-site.xml中配置有关</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark2_shuffle</value>
<description>辅助服务</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>指定mapreduce的shuffle类</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark2_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
<description>指定spark的shuffle类</description>
</property>
<!-- 指定spark程序包所在位置, 启动yarn前, 保证spark已经解压到相应位置 -->
<property>
<name>yarn.nodemanager.aux-services.spark2_shuffle.classpath</name>
<value>/opt/spark-2.4.8-bin-hadoop2.7/yarn/*</value>
<description>指定spark的shuffle类路径, 以具体安装位置为准</description>
</property>
<!--资源分配, 请根据机器实际硬件配置, 推荐内存为单台实际内存的0.5-0.8, 核心为实际逻辑核心的数量 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>关闭虚拟内存检查</description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>131072</value>
<description>单个节点能够分配的内存量, 结合集群实际内存进行调整, 单位mb</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>32</value>
<description>单个节点能够分配的核心, 结合集群实际总核心数进行调整, 默认为物理核心数 * 1</description>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>4096</value>
<description>容器分配的最小内存, 单位mb</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>131072</value>
<description>容器分配的最大内存, 此处设置为了单台机器能够分配最大内存, 单位mb</description>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
<description>容器分配的最小vcore数</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>32</value>
<description>容器分配的最大vcore数, 此处设置为了单台机器能够分配的最多vcore数</description>
</property>
</configuration>
编辑配置文件mapred-site.xml
,例如vim mapred-site.xml
,配置内容如下:
<configuration>
<!-- 历史日志服务地址要与yarn-site.xml中yarn.log.server.url为同一台服务器 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
</configuration>
编辑workers
配置文件,例如:vim workers
,添加节点如下:
node1
node2
node3
启动命令添加用户
切换至sbin目录:cd /opt/hadoop-3.1.3/sbin
# 在启动脚本头部添加以下信息
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
# 在启动脚本头部添加以下信息
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root
分发到其他节点
scp -r hadoop-3.1.3 node2:$PWD
scp -r hadoop-3.1.3 node2:$PWD
添加环境变量 vim /etc/profile
#HADOOP
export HADOOP_HOME=/opt/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
namenode初始化
所有节点启动journalnode hdfs --daemon start journalnode
选择一台机器(例如node1)初始化
hdfs zkfc -formatZK
hdfs namenode -format
hdfs --daemon start namenode
其他两台机器执行命令同步
hdfs namenode -bootstrapStandby
启动集群
start-all.sh
查看状态
jps查看进程
web访问 http://node1:9870, http://node2:9870, http://node3:9870, 查看hdfs状态
保证有一台机器处在active状态, 其他两台机器处在standby状态
停止集群使用: stop-all.sh