环境:windows10、centos7.9、hadoop3.x、jdk1.8-8u162
hadoop各版本
jdk各版本
特此说明:Hadoop版本最好不要选hadoop3.1.0,因为官网显示此hadoop版本对于各个版本Hbase都不能完全兼容,java版本建议为1.8。
准备3台虚拟机,并配置静态ip、关闭防火墙、更改主机名、进行主机名映射、进行jdk安装和配置环境变量、配置ssh无密登录。
这里先建立一台虚拟机进行上述软件安装和环境配置,之后克隆剩下两台虚拟机,剩下两台虚拟机只需要更改ip地址、Mac地址、主机名即可。
集群规划如下:
IP地址 | 主机名 | 集群身份 |
---|---|---|
192.168.138.100 | hadoop00 | 主节点 |
192.168.138.101 | hadoop01 | 从节点 |
192.168.138.102 | hadoop02 | 从节点 |
确保网络模式为NAT模式。
进入网卡配置文件并修改相应选项:
命令:vim /etc/sysconfig/network-scripts/ifcfg-ens33
注:IPADDR为静态ip地址(自定义)、HWADDR为Mac地址(根据虚拟机进行配置)
若是克隆虚拟机只需要更改Mac地址和ip地址即可,Mac地址需要在开启虚拟机界面的网络适配器的高级选项里重新生成。
重启网络后生效:
systemctl restart network
建议将NetworkManager服务关闭
systemctl stop NetworkManager
或service NetWorkManager stop
注:NetWorkManager和network服务都是管理网络配置,Centos7之前只有network服务,Centos8只有NetWorkManager服务,所以Centos7是用于过渡更改网络管理配置的版本,但是NetworkManager服务在Centos7版本的兼容性不好,二者可能会起冲突导致网络服务不可用,所以这里选择将NetworkManager服务关闭。
systemctl stop firewalld
systemctl disable firewalld
# 查看防火墙的状态
systemctl status firewalld
在关闭防火墙后也可以将selinux关闭,这里linux系统的一个安全机制,可能会影响后虚拟机之间的通信,进入其配置文件将SELINUX设置为disabled
vim /etc/selinux/config
…………
SELINUX=disabled
更改主机名:
vim /etc/hostname
主机名称自定义,这里选择hadoop100作为主机名,并打算将剩下的两台虚拟机主机名配置为hadoop101、hadoop102,ip地址配置为192.168.138.101、192.168.138.102
配置主机映射:
vim /etc/hosts
注:ip地址和主机名的位置不要弄错,即“ip地址 主机名”格式。
重启后生效。
验证:ping hadoop100
不丢包即配置成功。
后续剩余两台配置成功后也可以ping hadoop101/hadoop102
注:后续配置剩余虚拟机时也要进行三台主机和ip地址的映射
1)若虚拟机自带jdk需要将其卸载
rpm -qa | grep jdk # 如果有,将其卸载
rpm -e xxxxxxx --nodeps # 将查询到的jdk强制卸载
注:一般情况下最小化安装没有内置jdk。
2)利用xtfp或xshell将软件包上传到 /root/software 文件夹下。
注:software是笔者自己创建的。
xhell上传方法为:将文件拉到会话窗口或使用命令
rz
,然后选择要上传的文件。
3)将jdk解压到/usr/local/文件夹下
tar -zxvf jdk-8u162-linux-x64.tar.gz -C /usr/local/
并将解压后的文件夹改名为jdk
mv /usr/local/jdk1.8.0_162 /usr/local/jdk
4)配置jdk环境变量
vim /etc/profile
…………
# jdk环境变量配置
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
使更改立即生效
source /etc/profile
5)验证
java -version
出现对应jdk版本提示即配置成功。
6)添加软连接
ln -s /usr/local/jdk/bin/java /bin/java
因为卸载了centos7自带的java,为防止hadoop识别不到java路径,故添加软连接到/bin/java
注:/bin :存放普通用户可执行的指令,即使在单用户模式下也能够执行处理
1)使用rsa加密技术,生成公匙和私匙
cd ~
ssh-keygen -t rsa
2)进入~/.ssh目录下,使用ssh-copy-id命令
cd ~/.ssh
ssh-copy-id root@hadoop100
3)进行验证
ssh hadoop100
注:后续克隆剩余两台虚拟机之后,完成主机名的更改等基本配置之后,三台虚拟机可以互登ssh
若是三台机器提前安装好的情况下就需要同步公匙文件。
同步公匙文件
1)用ssh-key-gen在本机主机上创建公匙和密匙
ssh-keygen -t rsa
2)把公匙复制到本机上
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3)把公匙复制到远程主机上
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop101
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop102
4)直接登录远程主机
ssh hadoop101
如若无错,可直接登录,无需密码。
注:若想要每台虚拟机都能无密登录另外两个,需要在每台虚拟机上同步公匙文件,即上述操作需要重复三次。
此时,可以将此机器克隆出另外两台,并更改ip地址、Mac地址、主机名,以便后续操作。
选择集群中的一台机器作为时间服务器,这里选择hadoop100
1)安装ntp并开启服务
yum install -y ntp # 安装ntp
systemctl start ntpd # 开启服务
chkconfig ntpd on # 设置开机自启动
2)配置相应的文件
vim /etc/ntp.conf
# 以下是文件内容
…………
# Hosts on local network are less restricted.
# restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 添加集群中的网络段位
restrict 192.168.138.100 mask 255.255.255.0 nomodify notrap # ip地址为hadoop100的静态ip
…………
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# server 0.centos.pool.ntp.org iburst #注释掉
# server 1.centos.pool.ntp.org iburst #注释掉
# server 2.centos.pool.ntp.org iburst #注释掉
# server 3.centos.pool.ntp.org iburst #注释掉
server 127.127.1.0 # -master作为服务器
4)其它的机器也需要安装ntp
安装ntp执行下面的命令使用root定义定时器,以同步hadoop100机器的时间
/usr/sbin/ntpdate -u hadoop100
同步后可以使用
date
命令查看时间。
Hadoop的安装目录:/usr/local/hadoop
配置环境变量:vim /etc/profile
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
下面需要通过配置若干配置文件,来实现Hadoop集群的配置信息,需要配置的文件有:
hadoop-env.sh
yarn-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
集群规划
Node | Applications |
---|---|
hadoop100 | NameNode 、DataNode、ResourceManager、NodeManager |
hadoop101 | SecondaryNameNode、DataNode、NodeManager |
hadoop102 | DataNode、NodeManager |
注:修改配置文件时需要注意将主机名和一些文件路径修改成自己配置的名称和路径。
首先进入到hadoop目录下:cd $HADOOP_HOME/etc/hadoop
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoop100:9000value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/usr/local/hadoop/tmpvalue>
property>
configuration>
<configuration>
<property>
<name>dfs.namenode.name.dirname>
<value>file://${hadoop.tmp.dir}/dfs/namevalue>
property>
<property>
<name>dfs.datanode.datadirname>
<value>file://${hadoop.tmp.dir}/dfs/datavalue>
property>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.blocksizename>
<value>134217728value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>hadoop101:9868value>
property>
<property>
<name>dfs.namenode.http-addressname>
<value>hadoop100:9870value>
property>
configuration>
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>hadoop100:10020value>property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>hadoop100:19888value>
property>
<property>
<name>mapreduce.application.classpathname> <value>/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*value>
property>
configuration>
注:最后一项中的classpath的配置,中的值需要写自己虚拟机的路径。
在终端使用命令
hadoop classpath
获取。
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>hadoop100value>
property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.classname> <value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
<property>
<name>yarn.resourcemanager.addressname>
<value>hadoop100:8032value>
property>
<property>
<name>yarn.resourcemanager.scheduler.addressname>
<value>hadoop100:8030value>
property>
<property>
<name>yarn.resourcemanager.resource-tracker.addressname>
<value>hadoop100:8031value>
property>
<property>
<name>yarn.resourcemanager.admin.addressname>
<value>hadoop100:8033value>
property>
<property>
<name>yarn.resourcemanager.webapp.addressname>
<value>hadoop100:8088value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1name>
<value>hadoop101:8088value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2name>
<value>hadoop102:8088value>
property>
<property>
<name>yarn.application.classpathname> <value>/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*value>
property>
configuration>
注:classpath的值与mapred-site.xml中的相同。
vim hadoop-env.sh
…………
# The java implenentation to use.
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
…………
vim yarn-env.sh
…………
# some Java parameters
export JAVA_HOME=/usr/local/jdk
if ["$JAVA_HOME" != ""]; then
# echo "run java in #JAVA_HOME"
JAVA_HOME=$JAVA_HOME
fi
…………
此文件用于指定datanode守护进程所在的机器节点主机名
vim workers
hadoop100
hadoop101
hadoop102
若想要在root用户启动hadoop集群需要在/etc/profile上添加如下代码:
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
也可以直接克隆主节点虚拟机,更改主机名、IP地址和MAC地址即可。
1)同步Hadoop到另外两台节点
cd /usr/local #在hadoop100中进行同步操作
scp -r hadoop hadoop101:/usr/local/
scp -r hadoop hadoop102:/usr/lcoal/
2)同步profile到另外两台节点
scp /etc/profile hadoop101:/etc/
scp /etc/profile hadoop102:/etc/
注:在另外两台节点上不要忘记执行
source /etc/profile
命令使文件立即生效。
格式化hdfs:hdfs namenode -format
或hadoop namenode -format
启动hadoop:start-all.sh
在主节点(hadoop100)使用命令jps
显示以下进程:
4304 NameNode
4481 DataNode
5556 Jps
5206 NodeManager
4879 ResourceManager
在从节点1(hadoop101)使用jps
显示以下进程:
2866 NodeManager
2579 DataNode
2683 SecondaryNameNode
3020 Jps
在从节点2(hadoop102)使用jps显示以下进程:
2369 DataNode
2729 Jps
2574 NodeManager
修改hdfs文件夹的权限:hadoop fs -chmod -R 777 /
注:这样做是防止后续运行mapreduce程序时无权限创建文件夹。
hadoop fs -put input.txt /wc/
cd /usr/local/hadoop/share/hadoop/mapreduce
可以看到下面的内容:
hadoop jar hadoop-mapreduce-examples-3.1.0.jar wordcount /wc /outputwc
至此,Hadoop完全分布式环境配置完成。