Hadoop 集群的安装配置大致为如下流程:

  1. 选定一台机器作为 Master
  2. 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
  3. 在 Master 节点上安装 Hadoop,并完成配置
  4. 在其他 slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
  5. 将 Master 节点上的 /usr/local/hadoop 目录复制到其他 slave 节点上
  6. 在 Master 节点上开启 Hadoop
    (注意,本文操作如果没有明确指出是在master还是slave上进行,一般默认为对master和slave一起进行配置,有些地方master和slave配置不一样,我会在注释的地方给与说明,本文用了两台虚拟机,CentOS系统,一台作为master,一台作为slave)

1. 修改网络配置

网关(GATEWAY)改成VMware Virtual Ethernet Adapter for VMnet1IP地址,这里设置的网络模式是HOST_ONLY模式,虚拟网卡 VMWare Virtual Ethernet Adapter for VMnet1作为虚拟机的网关接口,为虚拟机提供服务,虚拟机只能和主机ping通,如果想要虚拟机能ping通外网,需要进行以下操作,真实网卡–>属性–>共享–>允许其他网络用户通过此计算机的Internet连接来连接关闭防火墙

vi /etc/sysconfig/network 
#将里面的东西清空,写入以下语句,最后按ESC键,然后 :wq  保存,vi保存的方式,不会vi的可以去网上查一下
#master和slave的这个文件配置是一样的
NETWORKING=yes
GATEWAY=192.168.137.1

vi /etc/sysconfig/network-scripts/ifcfg-ens32 
#将里面的东西清空,写入以下语句
#我这里master是,192.168.137.100,slave1是192.168.137.101
TYPE=Ethernet 
IPADDR=192.168.137.100
NETMASK=255.255.255.0

修改主机名(主机名千万不能有下划线!)

#如果是slave配置,后面要把master改成slave
hostnamectl set-hostname master

修改hosts表(master和slave的机器都要修改)

sudo vim /etc/hosts

例如本教程使用两个节点的名称与对应的 IP 关系如下:(windows的hosts表也最好上这两条)

192.168.137.100		master
192.168.137.101		slave1

重启网络

service network restart

互相ping,看是否测试成功,若不成功,注意防火墙的影响。

关闭Windows或者虚拟机的防火墙。

systemctl stop firewalld 
system disable firewalld

2. 安装JDK(master和slave的操作一样)

/usr/目录下创建java目录

mkdir /usr/java
cd /usr/java

将下载好的JDK传入这个目录,解压(最后的是压缩文件的名字,你的是啥就写啥,可能跟我的不一样)

tar -zxvf jdk-8u201-linux-x64.tar.gz

设置环境变量

vi /etc/profile

在内容的最下面添加(JAVA_HOME,JER_HOME 中的jkd目录(jdk1.8.0_201)要与你自己的安装版本一致)

#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_201
JRE_HOME=/usr/java/jdk1.8.0_201/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

让修改生效:

source /etc/profile

验证JDK的有效性

java -version

如果成功则会显示版本信息,如果失败,去检测以上步骤哪出错了

java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

3. 创建hadoop用户(master和slave的操作一样)

为什么要创建hadoop用户,因为root用户权限过大,很容易将系统的配置弄乱,可以不创建hadoop用户吗?可以,但是不推荐。

#添加用户
useradd -m hadoop -s /bin/bash 
#修改密码
passwd hadoop

为 hadoop 用户增加管理员权限,方便部署,避免一些比较棘手的权限问题,执行:

visudo

找到 root ALL=(ALL) ALL 这行,然后在这行下面增加一行内容:hadoop ALL=(ALL) ALL (当中的间隔为tab),如下图所示:

hadoop集群动态扩展节点 hadoop2.7.2集群教程_java

然后切换hadoop用户登录

4. 安装SSH、配置SSH无密码登录

集群模式需要用到SSH登录,一般情况下,CentOS默认已安装了SSH clientSSH server,打开终端执行如下命令进行校验:

rpm -qa | grep ssh

如果得到以下内容,包含SSH client跟·,说明已经安装了ssh,不需要再安装。

openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-clients-7.4p1-16.el7.x86_64
libssh2-1.4.3-10.el7_2.1.x86_64

若需要安装,则可以通过 yum 进行安装(安装过程中会让你输入 [y/N],输入 y 即可):

sudo yum install openssh-clients
sudo yum install openssh-server

接着执行如下命令测试一下 SSH 是否可用:

ssh localhost

此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:75FAkQ4BdgBnlCvyLOFIB0JnVBGljWOsWaQP7B8Jtwc.
ECDSA key fingerprint is MD5:cc:7e:f4:51:fd:6d:1c:83:a6:42:c8:53:bc:d1:f3:0e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
hadoop@localhost's password:

Master 节点可以无密码 SSH 登陆到各个 slave 节点上。

首先生成 Master 节点的公匙,在 Master 节点的终端中执行

#master上的操作
  cd ~/.ssh               # 如果没有该目录,先执行一次ssh localhost
    rm ./id_rsa*            # 删除之前生成的公匙(如果有)
    ssh-keygen -t rsa       # 一直按回车就可以

让 Master 节点需能无密码 SSH 本机,在 Master 节点上执行:

#master上的操作
cat ./id_rsa.pub >> ./authorized_keys

完成后可执行 ssh Master 验证一下(可能需要输入 yes,成功后执行 exit 返回原来的终端)。接着在 Master 节点将上公匙传输到 slave1 节点:

#master上的操作
scp ~/.ssh/id_rsa.pub hadoop@slave1:/home/hadoop/

scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。执行 scp 时会要求输入 slave1 上 hadoop 用户的密码(hadoop),输入完成后会提示传输完毕,如下图所示:

hadoop集群动态扩展节点 hadoop2.7.2集群教程_hadoop安装_02

接着在 slave1 节点上,将 ssh 公匙加入授权:

#slave机器上的操作
    mkdir ~/.ssh       # 如果不存在该文件夹需先创建,若已存在则忽略
    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    rm ~/id_rsa.pub    # 用完就可以删掉了

如果有其他 slave 节点,也要执行将 Master 公匙传输到 slave 节点、在 slave 节点上加入授权这两步。

这样,在 Master 节点上就可以无密码 SSH 到各个 slave 节点了,可在 Master 节点上执行如下命令进行检验,如下图所示:

#master上的操作
ssh slave1

如果还是提示你输入密码可能是slave中权限的问题,解决方案如下

#在slave的机器上进行操作
sudo chmod 644 ~/.ssh/authorized_keys
sudo chmod 700 ~/.ssh

5. 安装配置hadoop(master和slave机器上一样,可以先配置一个,然后复制到另一个机器上)

首先将hadoop压缩包传入虚拟机,然后解压

#压缩包名字与你自己的保持一致
tar -zxvf hadoop-2.7.6.tar.gz
#将解压缩的文件移到/usr/local目录下
sudo mv hadoop-2.7.6 /usr/local
#改个名字,方便配置环境变量
cd /usr/local
sudo mv hadoop-2.7.6 hadoop
# 修改文件权限
sudo chown -R hadoop:hadoop ./hadoop

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

cd /usr/local/hadoop
./bin/hadoop version

将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用 hadoophdfs 等命令了,如果还没有配置的,需要在 Master 节点上进行配置。首先执行 vim ~/.bashrc,加入一行:

export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin

保存后执行 source ~/.bashrc 使配置生效。

集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5个配置文件,更多设置项可点击查看官方说明,这里仅设置了正常启动所必须的设置项: slaves、core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml

  • 文件 slaves,将作为 DataNode 的主机名写入该文件,每行一个,默认为 localhost,所以在伪分布式配置时,节点即作为 NameNode 也作为 DataNode。分布式配置可以保留 localhost,也可以删掉,让 Master 节点仅作为 NameNode 使用。
#slaves文件用来说明哪些是slave节点
slave1
slave2

本教程让 Master 节点仅作为 NameNode 使用,因此将文件中原来的 localhost 删除,只添加一行内容:slave1(这个名字要与你hosts表中的保持一致)。

  • 文件 core-site.xml 改为下面的配置:
<configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://master:9000</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>file:/usr/local/hadoop/tmp</value>
                    <description>Abase for other temporary directories.</description>
            </property>
    </configuration>
  • 文件 hdfs-site.xmldfs.replication 一般设为 3,但我们只有一个 slave 节点,所以 dfs.replication 的值还是设为 1:
<configuration>
            <property>
                    <name>dfs.namenode.secondary.http-address</name>
                    <value>Master:50090</value>
            </property>
            <property>
                    <name>dfs.replication</name>
                    <value>1</value>
            </property>
            <property>
                    <name>dfs.namenode.name.dir</name>
                    <value>file:/usr/local/hadoop/tmp/dfs/name</value>
            </property>
            <property>
                    <name>dfs.datanode.data.dir</name>
                    <value>file:/usr/local/hadoop/tmp/dfs/data</value>
            </property>
    </configuration>
  • 文件 mapred-site.xml (可能需要先重命名,默认文件名为 mapred-site.xml.template),然后配置修改如下:
<configuration>
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>Master:10020</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>Master:19888</value>
            </property>
    </configuration>
  • 文件 yarn-site.xml
<configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>Master</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
           <property>
                   <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
                   <value>org.apache.hadoop.mapred.ShuffleHandler</value>
           </property>
    </configuration>

首次启动需要先在 Master 节点执行 NameNode 的格式化:

# 首次运行需要执行初始化,之后不需要
hdfs namenode -format

接着可以启动 hadoop 了,启动需要在 Master 节点上进行:

start-dfs.sh

通过命令 jps 可以查看各个节点所启动的进程。正确的话,在 Master 节点上可以看到 NameNodeSecondrryNameNode 进程,如下图所示:

hadoop集群动态扩展节点 hadoop2.7.2集群教程_hadoop_03

在 Slave 节点可以看到 DataNode进程,如下图所示:

hadoop集群动态扩展节点 hadoop2.7.2集群教程_xml_04

#启动yarn
start-yarn.sh

再用jps查看进程,你会发现master上多了一个ResourceManager,slave上多了一个NodeManager

如图所示

hadoop集群动态扩展节点 hadoop2.7.2集群教程_xml_05

hadoop集群动态扩展节点 hadoop2.7.2集群教程_hadoop安装_06

也可以通过 Web 页面看到查看 DataNodeNameNode 的状态:http://master:50070/。如果不成功,可以通过启动日志排查原因。