集群安装规划

为了合理分配资源,需要对集群进行节点规划。本示例使用三台主机(master、slave01、slave02)。

注意: 三台主机需要配置 SSH 互信,且 /etc/hosts 文件中需要配置 IP 和主机名映射。

节点规划

主机名IP 地址角色
master10.10.2.113NameNode、SecondaryNameNode、JobHistoryServer
slave0110.10.2.114ResourceManager、DataNode
slave0210.10.2.115DataNode

初始化配置

# 生成密钥(三台机器均需执行)
ssh-keygen
# 将三台机器的公钥复制到 authorized_keys

# /etc/hosts 示例
root@master:~# cat /etc/hosts
127.0.0.1 localhost
10.10.2.113 master
10.10.2.114 slave01
10.10.2.115 slave02

安装 Java

注意:集群中的三台机器均需要安装。

安装 OpenJDK 8

apt install openjdk-8-jdk-headless

配置 Java 环境变量

vim ~/.bashrc

在文件末尾添加以下内容:

# java config
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

使配置生效:

source ~/.bashrc

检查安装结果

root@master:~# java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-8u412-ga-1~22.04.1-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

安装 Hadoop

注意:先在 master 节点安装,后面直接同步给 slave 节点。

下载并解压

wget https://archive.apache.org/dist/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz
tar -zxvf hadoop-2.8.5.tar.gz -C /data/hadoop

配置 Hadoop 环境变量

vim ~/.bashrc

添加以下内容:

# HADOOP PATH
export HADOOP_HOME=/data/hadoop/hadoop-2.8.5
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

使配置生效:

source ~/.bashrc

检查安装

root@ubuntu:~# hadoop version
Hadoop 2.8.5
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 0b8464d75227fcee2c6e7f2410377b3d53d3d5f8
Compiled by jdu on 2018-09-10T03:32Z
Compiled with protoc 2.5.0
From source with checksum 9942ca5c745417c14e318835f420733
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-2.8.5.jar

配置 Hadoop

四个重要的配置文件位于 $HADOOP_HOME/etc/hadoop 目录下:

  • core-site.xml — 核心配置文件
  • hdfs-site.xml — HDFS 配置文件
  • yarn-site.xml — YARN 配置文件
  • mapred-site.xml — MapReduce 配置文件

core-site.xml

<configuration>
    <!-- 指定 NameNode 的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:8020</value>
    </property>

    <!-- 指定 Hadoop 数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/hadoop-2.8.5/data</value>
    </property>
    
    <!-- 配置 HDFS 网页登录使用的静态用户为 root -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
    
    <!-- 设置集群用户权限 -->
    <property>
      <name>hadoop.proxyuser.root.hosts</name>
      <value>*</value>
    </property>

    <property>
     <name>hadoop.proxyuser.root.groups</name>
      <value>*</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>
  <!-- nn(NameNode) web 端访问地址 -->
  <property>
        <name>dfs.namenode.http-address</name>
        <value>master:9870</value>
    </property>
    
  <!-- 2nn(SecondaryNameNode) web 端访问地址 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>slave02:9868</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <!-- 指定 MR 走 shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定 ResourceManager 的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>slave01</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>

    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    
    <!-- 设置日志聚集服务器地址 -->
    <property>  
        <name>yarn.log.server.url</name>  
        <value>http://master:19888/jobhistory/logs</value>
    </property>
    
    <!-- 设置日志保留时间为 7 天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
</configuration>

mapred-site.xml

<configuration>
    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!-- 历史服务器端地址 -->
    <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>

修改 hadoop-env.sh

# JAVA_HOME 如实填写 Java 路径
export JAVA_HOME=/usr/local/jdk1.8.0_161
# hadoop 默认 ssh 22 端口,如果集群机器不是 22 端口需要修改
export HADOOP_SSH_OPTS="-p 10022"

配置 slaves 文件

vi $HADOOP_HOME/etc/hadoop/slaves

# 添加你的主机
master
slave1
slave2

注意: 该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

文件分发

上述配置都只在主节点 master 中进行,现在需要把所有文件分发给从机 slave01 和 slave02。

# 分发环境变量
rsync -r ~/.bashrc slave01:~/.bashrc
rsync -r ~/.bashrc slave02:~/.bashrc

# 分发 Hadoop
scp -r /data/hadoop/hadoop-2.8.5 slave01:/data/hadoop
scp -r /data/hadoop/hadoop-2.8.5 slave02:/data/hadoop

分发完成后,进入两台从机,刷新环境变量使其立即生效:

source ~/.bashrc

启动集群

格式化 NameNode

如果集群是第一次启动,则需要先格式化 NameNode 节点:

hdfs namenode -format

启动各服务

# 在主节点中运行(启动 HDFS)
start-dfs.sh

# 在 ResourceManager 节点(slave01)中运行(启动 YARN)
start-yarn.sh

# 或者使用一键启动命令(在主节点运行)
start-all.sh

# 在主节点中启动历史服务器
mr-jobhistory-daemon.sh start historyserver

验证启动状态

启动完成后,输入 jps 命令检查各节点进程是否正常:

节点应有进程
masterNameNode、DataNode、SecondaryNameNode、JobHistoryServer
slave01ResourceManager、DataNode、NodeManager
slave02DataNode、NodeManager

访问 Web 界面

在本地浏览器中查看 Hadoop Web 界面:

http://10.10.2.113:9870

请将 IP 地址修改为你的实际 master 主机 IP。