Hadoop 环境搭建

0. 环境准备

本实验基于以下 8 台测试机器进行:

IP hostname
10.4.79.90 hadoop-1
10.4.79.8 hadoop-2
10.4.79.6 hadoop-3
10.4.79.58 hadoop-4
10.4.79.38 hadoop-5
10.4.79.96 hadoop-6
10.4.79.62 hadoop-7
10.4.79.92 hadoop-8

首先确认每个机器都安装了如下软件:

  • JAVA >= 1.8.x
  • SSH,并确保所有集群节点之间可互相 SSH免密登录

为集群每个节点配置 hostname:vi /etc/hosts

10.4.79.90 hadoop-1
10.4.79.8  hadoop-2
10.4.79.6  hadoop-3
10.4.79.58 hadoop-4
10.4.79.38 hadoop-5
10.4.79.96 hadoop-6
10.4.79.62 hadoop-7
10.4.79.92 hadoop-8

1. zookeeper 集群搭建

为什么要搭建 zookeeper 集群呢?这是为了保障后续 hadoop 集群的高可用性,zookeeper 可以为 hadoop 集群的主备切换控制器提供主备选举支持。详细搭建步骤移步至 zookeeper 集群搭建

2. hadoop 集群搭建

本文所使用的 hadoop 版本为:3.2.3

搭建高可用 Hadoop 集群之前,我们需要对集群做一个规划,分配好每个节点在集群中扮演的角色;

hostname NameNode JournalNode ZKFC DataNode ResourceManager NodeManager
hadoop-1 Y Y Y Y Y Y
hadoop-2 Y Y Y Y Y Y
hadoop-3 Y Y Y
hadoop-4 Y Y
hadoop-5 Y Y
hadoop-6 Y Y
hadoop-7 Y Y
hadoop-8 Y Y

2.1 解压 hadoop 安装包

tar -zxvf hadoop-3.2.3.tar.gz

2.2 添加 hadoop 环境变量

编辑 /etc/profile

export JAVA_HOME=/opt/jdk1.8.0_281
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export HADOOP_HOME=/opt/hadoop-3.2.3
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

编辑 hadoop/etc/hadoop/hadoop-env.sh,配置 JAVA_HOME

# The java implementation to use.
export JAVA_HOME=/opt/jdk1.8.0_281

2.3 验证 hadoop 是否安装成功

hadoop version

2.4 配置 hadoop 集群

接着配置 hadoop 的 4 个核心配置文件:core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,分别对应 hadoop 的 4 个主要组成部分:核心包,HDFS文件系统,MapReduce模型,yarn 资源调度框架。

如果没有相应文件,从当前目录下的模板文件复制:

cp hadoop/etc/hadoop/xxx.site.xml.template  hadoop/etc/hadoop/xxx.site.xml

core-site.xml 的配置:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    <!--临时文件存放位置-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop</value>
    </property>
    <!--zookeeper-->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop-1:2181,hadoop-2:2181,hadoop-3:2181</value>
    </property>
</configuration>

hdfs-site.xml 的配置

按照我们的规划,选择 hadoop-1,hadoop-2 作为 namenode,hadoop-1,hadoop-2,hadoop-3 作为 journalnode;

<configuration>
    <!--指定 hdfs 的 nameservice 为 mycluster,需要和 core-site.xml 中保持一致-->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    <!-- mycluster 下面有两个 NameNode,分别是 nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- nn1 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop-1:9000</value>
    </property>
    <!-- nn1 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop-1:50070</value>
    </property>
    <!-- nn2 的 RPC 通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop-2:9000</value>
    </property>
    <!-- nn2 的 http 通信地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop-2:50070</value>
    </property>
    <!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop-1:8485;hadoop-2:8485;hadoop-3:8485/mycluster</value>
    </property>
    <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/hadoop/journaldata</value>
    </property>
    <!-- 开启 NameNode 失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</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>
    <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <!-- 配置 sshfence 隔离机制超时时间(30s) -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
</configuration>

mapred-site.xml 的配置

<configuration>
    <!-- 指定 mr 框架为 yarn 方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 设置 mapreduce 的历史服务器地址和端口号 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop-1:10020</value>
    </property>
    <!-- mapreduce 历史服务器的 web 访问地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop-1:19888</value>
    </property>
</configuration>

yarn-site.xml 的配置

按照我们的规划,选择 hadoop-1,hadoop-2 作为 ResourceManager

<configuration>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
        <discription>开启 RM 高可用</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>jyarn</value>
        <discription>指定 RM 的 cluster id,可以自定义</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
        <discription>指定 RM 的名字,可以自定义</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop-1</value>
        <discription>分别指定 RM 的地址</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop-2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop-1:2181,hadoop-2:2181,hadoop-3:2181</value>
        <discription>指定 zk 集群地址</discription>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        <discription>要运行 MapReduce 程序必须配置的附属服务</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
        <discription>启用自动恢复</discription>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        <discription>设定 resourcemanager 的状态信息存储在 zookeeper 集群上</discription>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>8192</value>
        <discription>每个nodemanager最多分配内存,单位MB</discription>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>4</value>
        <discription>每个节点的可用 CPU 虚拟核心数量</discription>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
        <discription>开启 YARN 集群的日志聚合功能</discription>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>/tmp/logs</value>
        <discription>日志聚合hdfs存储路径</discription>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
        <discription>YARN 集群的聚合日志最长保留时长</discription>
    </property>
    <property>
        <name>yarn.nodemanager.delete.debug-delay-sec</name>
        <value>604800</value>
        <discription>应用执行完日志保留的时间,默认0,即执行完立刻删除</discription>
    </property>
</configuration>

2.5 配置集群 workers 节点

编辑 hadoop/etc/hadoop/workers 文件,配置 worker 节点,每行一个:

hadoop-1
hadoop-2
hadoop-3
hadoop-4
hadoop-5
hadoop-6
hadoop-7
hadoop-8

注:hadoop-2.x.x 版本是需要编辑 master 文件作主节点,编辑 slaves 文件作为 worker 节点。因为 slave 这个单词具有别样色彩,在 hadoop-3.x.x 版本中调整为了光荣的工人阶级 worker。

到此,hadoop 的 master 节点配置就基本完成了,将配置好的 hadoop 从 master 节点复制到其它节点,但要保证 hadoop 在每个节点的存放路径相同同时不要忘记在各个节点配置 HADOOP 环境变量

2.6 启动 JournalNode

分别在每个 journalnode 节点(hadoop-1,hadoop-2,hadoop-3)启动 journalnode 进程:

cd hadoop/sbin

hadoop-daemon.sh start journalnode

2.7 格式化 HDFS 文件系统

在第一个 namenode 节点(hadoop-1)输入以下命令格式化 HDFS 文件系统

hadoop namenode -format

出现以下结果就算成功

格式化 HDFS 文件系统

2.8 格式化 ZKFC

任选一个 namenode 节点格式化 ZKFC

hdfs zkfc -formatZK

出现以下信息说明格式化成功:

格式化 ZKFC

2.9 启动 NameNode:

启动主 namenode(hadoop-1):

./sbin/hadoop-daemon.sh start namenode

在备用 namenode(hadoop-2)上同步元数据:

hadoop namenode -bootstrapStandby

出现以下信息说明元数据同步成功:

同步 namenode 元数据

2.10 启动 HDFS

在第一个 namenode 节点(hadoop-1)启动 hdfs:

./sbin/start-dfs.sh

执行个 hdfs 命令测试一下是否启动成功:

hdfs dfs -ls /

如果没有异常输出就代表启动成功。

2.11 启动 YARN

在第一个 resourcemanager 节点(hadoop-1)启动 yarn:

./sbin/start-yarn.sh

在另一个 resourcemanager 节点(hadoop-2)手动启动 resourcemanager:

./sbin/yarn-daemon.sh start resourcemanager

启动成功后,可以在浏览器访问 yarn 管理控制台: http://hadoop-1:8088

2.12 附

如果想要不重启集群来动态刷新 hadoop 配置可尝试如下方法:

刷新 hdfs 配置

在每个 namenode 节点上执行:

hdfs dfsadmin -fs hdfs://hadoop-1:9000 -refreshSuperUserGroupsConfiguration
hdfs dfsadmin -fs hdfs://hadoop-2:9000 -refreshSuperUserGroupsConfiguration

刷新 yarn 配置

在每个 namenode 节点上执行:

yarn rmadmin -fs hdfs://hadoop-1:9000 -refreshSuperUserGroupsConfiguration
yarn rmadmin -fs hdfs://hadoop-2:9000 -refreshSuperUserGroupsConfiguration
posted @ 2022-06-17 16:39  watermark's  阅读(316)  评论(0编辑  收藏  举报