Hadoop 集群的安装配置大致为如下流程:
- 选定一台机器作为 Master
- 在 Master 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
- 在 Master 节点上安装 Hadoop,并完成配置
- 在其他 slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境
- 将 Master 节点上的 /usr/local/hadoop 目录复制到其他 slave 节点上
- 在 Master 节点上开启 Hadoop
(注意,本文操作如果没有明确指出是在master还是slave上进行,一般默认为对master和slave一起进行配置,有些地方master和slave配置不一样,我会在注释的地方给与说明,本文用了两台虚拟机,CentOS系统,一台作为master,一台作为slave)
1. 修改网络配置
网关(GATEWAY)改成VMware Virtual Ethernet Adapter for VMnet1
的IP地址
,这里设置的网络模式是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用户
登录
4. 安装SSH、配置SSH无密码登录
集群模式需要用到SSH登录
,一般情况下,CentOS默认已安装了SSH client
、SSH 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),输入完成后会提示传输完毕,如下图所示:
接着在 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 变量
中,这样就可以在任意目录中直接使用 hadoop
、hdfs
等命令了,如果还没有配置的,需要在 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.xml、hdfs-site.xml、mapred-site.xml、yarn-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.xml,
dfs.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 节点上可以看到 NameNode
、SecondrryNameNode
进程,如下图所示:
在 Slave 节点可以看到 DataNode进程
,如下图所示:
#启动yarn
start-yarn.sh
再用jps
查看进程,你会发现master上多了一个ResourceManager
,slave上多了一个NodeManager
如图所示
也可以通过 Web 页面看到查看 DataNode
和 NameNode
的状态:http://master:50070/。如果不成功,可以通过启动日志排查原因。