Linux环境下安装配置Hadoop
参考Hadoop官方文档进行配置。
一 、 先决条件
Linux和Windows所需软件包括:
- Java™ 必须安装,通过Hadoop官方文档,提前检查匹配的版本。
- ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。
- 此次安装的版本
Linux:CentOS-8.3.2011-x86_64
Hadoop:hadoop3.3.0
JDK:jdk-8u202-linux-x64。 - VMware内的三台克隆好的Linux虚拟主机,已解压配置好hadoop安装包。
Windows下的附加软件需求
- Xshell,xftp- 或者提供上述软件之外的shell支持等软件。
二、 Linux虚拟机的准备配置
三台虚拟主机的静态ip,以及主机名。hadoop所需要的主机数量为奇数。
IP 主机名 操作系统 作用
192.168.31.66 Master CentOS8_x64 NameNode ResourceManager SecondaryNameNode
192.168.31.67 Slave1 CentOS8_x64 DataNode NodeManager
192.168.31.68 Slave2 CentOS8_x64 DataNode NodeManager
1. 静态网络设置
分别设置三台主机的静态网络
输入命令 vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改文件内容如下,
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#BOOTPROTO=dhcp
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=617068b3-eebd-4f00-92f2-52d722f2b5a2
DEVICE=ens33
#ONBOOT=no
ONBOOT=yes
PREFIX=24
IPADDR=192.168.31.66
GATEWAY=192.168.31.1
NETMASK=255.255.255.0
DNS1=192.168.31.1
此为master主机的配置文件,其他两个slave主机修改IP地址即可
ps:可先查询可连接外网的三台虚拟机中的ip、网关、dns、子网掩码地址,根据实际情况修改静态网络配置文件。这样在配置静态网络文件时,便于快速设置,且避免ping不通外网。
.
ps:可使用以下操作快速查询linux的ip、dns、网关
重启网络设置,不能重网络就重启虚拟机
使用方法:nmcli c reload +网卡名
例:nmcli c reload ens33
ip addr 查看网络配置 或者 nmcli:
ps:当windows主机的网络改变后,原先配置好静态网络的虚拟机,因不与windows主机在同一网段,将出现windows主机ping不通虚拟机,虚拟机连接不了外网等情况,需要的话可以重新修改网络配置。原先在同一网段的虚拟机可以相互ping通。
2. 分别修改主机名
输入命令 vim /etc/hostname
修改三台主机名分别如下:
Master
Slave1
Slave2
3. 映射 IP 地址及主机名
对 3 台虚拟机,依次修改/etc/hosts 文件。
输入命令 vim /etc/hosts
在文件末尾添加以下内容,IP 地址根据实际情况修改:
192.168.31.66 Master
192.168.31.67 Slave1
192.168.31.68 Slave2
4. 配置免密登录
密钥设置,这样启动hadoop时不会出现其他节点拒绝访问的情况。
输入命令 ssh-keygen -t rsa
连续回车,或者输入要设置的密码,直到出现如下页面
Ps:公钥(id_rsa.pub)和私钥(id_rsa)
复制公钥到所有节点,依次输入:
ssh-copy-id -i ~/.ssh/id_rsa.pub Master
ssh-copy-id -i ~/.ssh/id_rsa.pub Slave1
ssh-copy-id -i ~/.ssh/id_rsa.pub Slave2
ps:每次发送公钥到公钥发送给集群内的所有主机后,验证一下免密登录是否匹配成功。
ps:如输入命令 ssh Slave1,登录主机Slave1。当ssh远程登录到其主机后,现在控制的是远程主机,需要执行退出命令 :exit 后才能重新控制本地主机。
三、 Hadoop集群安装
su权限下操作
1.解压配置hadoop
(1) 将hadoop安装文件解压到根目录下。
后将文件夹名修改成hadoop,便于操作。
解压命令 tar -zxvf hadoop-3.3.0.tar.gz -C ~/
(2) 创建存储临时文件的文件夹
输入命令 mkdir tmp
ps:建议不要在根目录下,可能没有权限,例 创建在:/home/wang/hadoop/目录下
(3) 配置HADOOP_HOME
分别修改profile文件 和 bashrc文件,在文件中添加 Hadoop的环境变量。
输入命令 vim /etc/profile 和 vim ~/.bashrc
HADOOP_HOME的位置根据实际情况修改
都添加内容如下:
#HADOOP_HOME
export HADOOP_HOME=~/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
刷新配置文件,让修改的配置文件生效
输入命令 source /etc/profile
测试是否安装成功(如果Hadoop命令不生效就重启试试 reboot)
输入 hadoop version 显示如下情况
刷新使配置生效 source ~/.bashrc
输入whereis hdfs,如果能正常显示 hdfs 的路径说明配置正确。
2. 修改Hadoop配置文件
在hadoop/etc/hadoop/目录下。
(1) 配置hadoop-env.sh中的JAVA_HOME 。
输入命令 vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
修改成JAVA_HOME的目录位置,根据自己本机的实际情况修改
之后输入bin/hadoop ,显示如下内容代表javahome配置成功。
(2) 配置core-site.xml
输入命令 vim core-site.xml
ps: 设置hadoop.tmp.dir的目录时,最好不要在根目录下,可能没有权限,造成出错,无法使用。
修改文件内容如下:
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
<!—改成自己的主机名或ip地址,以及适合的端口号,例:8020,9000等 -->
</property>
<!-- 指定hadoop临时目录,需自行创建 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/wang/hadoop/tmp</value>
</property>
</configuration>
(3) 配置hdfs-site.xml
输入命令 vim hdfs-site.xml
添加文件内容如下
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name> dfs.namenode.http-address </name>
<value>http://Master:9870</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/wang/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/wang/hadoop/hdfs/data</value>
</property>
</configuration>
ps:配置dfs.namenode.http-address时,写http://localhost:9870,则只能在namenode节点的主机用localhost:9870访问,写主机名http://Master.Hadoop:9870,则在其他主机也可以访问,若没有写这项,会无法在浏览器访问namenode information页面。
.
ps:配置dfs.namenode.name.dir和dfs.datanode.data.dir时,先创建好/home/wang/hadoop/hdfs/name文件夹,便于存储name节点和data节点的信息。
(4) 配置yarn-site.xml
输入命令 vim yarn-site.xml
添加文件内容如下
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name> yarn.resourcemanager.address</name>
<value> Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value> Master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value> Master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value> Master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
</configuration>
(5) 配置 mapred-site.xml
输入命令 vim mapred-site.xml
文件所配置内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(6) 配置 workers 文件。
配置 workers 文件就是指定哪些主机是 worker从设备。
输入命令 vim workers
将文件内容修改如下,一行一个:
Slave1
Slave2
ps: hadoop 3.0以后的版本是workers,不是slavers
(7) 分发配置文件
将master主机的配置文件分发至其他主机,每个主机的hadoop配置文件需一致。
分发命令格式
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
依次输入命令:
scp -r ~/hadoop/etc/hadoop/ hadoop@ Slave1:~/hadoop/etc/
scp -r ~/hadoop/etc/hadoop/ hadoop@ Slave2:~/hadoop/etc/
ps:注意文件路径,此次只复制${HADOOP_HOME}/etc/hadoop/下的配置文件。因为之前克隆时已经在root目录下解压了hadoop,三台主机都有hadoop安装文件。这样需要传输的文件数量少,速度快。
(8) 格式化 HDFS
在 Master主机操作,格式化一次即可。
输入命令 hdfs namenode -format。
ps:多次格式化,会造成datanode的clusterID和初始格式化时的不相同,是造成启动hadoop时,datanode没有启动的原因之一。
datanode节点的clusterID只在第一次格式化的时候生成,后面不会自动修改.
解决方法:需要重新匹配CID,在所配置的dfs.n amenode.name.dir下
如 : /home/wang/hadoop/hdfs/name/current/
修改此目录下的VERSION文件,
将所有未启动的datanode节点的clusterID修改成和namenode节点相同的clusterID
(9) 启动和关闭Hadoop
在Master主机上执行
输入命令 start-dfs.sh 和 start-yarn.sh,
输入命令 start-all.sh也可,代表将(start-dfs.sh,start-yarn.sh,)依次执行一遍
输入 stop-all.sh,关闭所有节点。
关闭namenode节点 $HADOOP_HOME/bin/hdfs --daemon stop namenode
关闭datanode节点 $HADOOP_HOME/bin/hdfs --daemon stop datanode
关闭resourcemanager节点 $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
关闭nodemanager节点 $HADOOP_HOME/bin/yarn --daemon stop nodemanager
(10) 验证启动情况
- 查看启动的节点
输入命令 jps
-
访问web页面。
可以访问web页面,http://localhost:9870/(在虚拟机内的浏览器) 或者namedoes节点的主机IP地址http://192.168.31.66:9870/(不限主机的浏览器) 可以访问 ResourceManagerRM管理界面 - http://localhost:8088/ 开启历史服务器 mapred --daemon start historyserver,在Web中查看任务运行情况 - http://localhost:19888/(有设置的话)
.
Ps: Hadoop3.x版本后是默认接口是9870,不是50070.
浏览器显示页面:
四、 遇到的问题以及解决方案
-
若分发配置文件时,或者启动hadoop时,显示错误 Permission denied
解决方案:重新检查免密登录是否配置好,注意,要将公钥发送给集群内的所有主机,包括本机。
-
若出现 9870 网址访问不了,或者8088网址访问失败
解决方案:
检查防火墙是否关闭; 检查namenodes节点是否启动,datanode节点是否启动; 检查四个核心配置文件配置情况。
-
若 ResourceManager 启动不了 解决方案:
检查四个核心配置文件的配置情况; 检查jdk版本是否和hadoop版本匹配,本次使用的版本hadoop3.x和jdk8 (jdk1.8) 匹配。 目前jdk8以后的版本和hadoop3.x不匹配所产生的这个bug还没有解决。
-
若出现错误
Starting namenodes on [Master.Hadoop]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [Master.Hadoop]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
解决方案:
编辑 $HADOOP_HOME/etc/hadoop/hadoop-env.sh
在文件内添加:
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
已可以正确启动hadoop。