目录
4.1 在所有虚拟机根目录下新建文件夹export,export文件夹中新建data、servers和software文件
6.4 配置hadoop集群中主机hadoop01、hadoop02、hadoop03时间同步
1.安装三台虚拟机
注意:这里不要使用克隆去克隆虚拟机,因为ub克隆后网络会出现问题,所建议大家直接安装三台虚拟机
2.配置静态网络(三台虚拟机都要操作)
2.1 查看网络是否连通
ping baidu.com
2.2 安装net-tools
sudo su
apt upgrade
apt install net-tools
2.3.查看物理地址
ifconfig
2.4 查看ip地址的起始和结束地址
ip addr show
从上图中我们可以看到,网络接口 enp0s5
的详细信息如下:
- 接口名称:
enp0s5
- IPv4 地址:
10.211.55.9/24
- 广播地址:
10.211.55.255
- 子网掩码:
/24
(等价于255.255.255.0
)
/24
表示前 24 位用于表示网络号,剩下 8 位
用于主机号。这意味着该子网的 IP 地址范围是 10.211.55.0
到 10.211.55.255
。
2.5 修改网络配置文件
- ip地址设置参照2.4小节中IP地址范围自行选择(在起始地址和结束地址的范围内)
- 子网掩码设置为默认值:255.255.255.0
- 采用route -n命令查看主机的网关,把网关IP改为10.211.55.1:
DNS
使用谷歌提供的免费dns
:8.8.8.8- 然后重启网卡。激活配置 测试ip是否配置完成:
ip a
- 测试
DNS
是否配置成功,测试能否访问百度:
ping 8.8.8.8
ping baidu.com
2.6 修改三台主机名
hostnamectl set-hostname hadoop01
reboot
hostnamectl set-hostname hadoop0
reboot
hostnamectl set-hostname hadoop03
reboot
3. 配置hosts文件和ssh免密登录
3.1 修改hosts配置文件(所有虚拟机都需要)
apt install vim
vim /etc/hosts
3.2 开启ssh服务
sudo apt-get update
sudo apt-get install openssh-server
- 当安装完后
sudo service ssh start
- 检查是否运行
sudo service ssh status
- 运行成功会显示
3.3 开机自启动
sudo systemctl enable ssh
- 生成密钥文件
ssh-keygen -t rsa
- 将本机公钥文件复制到其他虚拟机上
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
一定要切回初始用户,因为Ubuntu的root用户密码是随机的确定不了
3.4 查看是否配置成功
ssh分别连接hadoop02、hadoop03:
4. Hadoop集群配置
4.1 在所有虚拟机根目录下新建文件夹export,export文件夹中新建data、servers和software文件
cd /
sudo mkdir -p /export/{data,servers,software}
4.2 准备安装包
hadoop-3.3.6.tar.gz:Apache Hadoop
jdk-8u391-linux-x64.tar.gz:Java Archive Downloads - Java SE 8u211 and later
4.3 先修改三台虚拟机的export权限
sudo chmod 777 /export
sudo chmod 777 /export/software
4.4 安装jdk(所有虚拟机都要有的操作)
- 解压jdk
sudo su
cd /export/software
tar -zxvf jdk-8u391-linux-x64.tar.gz -C /export/servers/
- 重命名jdk目录
cd /export/servers
mv jdk1.8.0_391 jdk
- 配置jdk环境变量
vim /etc/profile
#在配置文件末尾追加
export JAVA_HOME=/export/servers/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- 使配置文件生效
source /etc/profile
- 查看是否生效
java -version
4.4 Hadoop安装(所有虚拟机都要操作)
- 解压hadoop
cd /export/software
tar -zxvf hadoop-3.3.6.tar.gz -C /export/servers/
- 打开配置文件
vim /etc/profile
- 配置hadoop环境变量
#在文件末尾追加
export HADOOP_HOME=/export/servers/hadoop-3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 使配置文件生效
source /etc/profile
- 查看是否配置成功
hadoop version
4.5 Hadoop集群配置
- 进入主节点设置目录
cd /export/servers/hadoop-3.3.6/etc/hadoop/
- 修改hadoop-env.sh文件
vim hadoop-env.sh
# 添加
export JAVA_HOME=/export/servers/jdk
- 修改core-site.xml
vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-3.3.6/tmp</value>
</property>
</configuration>
- 修改hdfs-site.xml
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/servers/hadoop-3.3.6/tmp/dfs/name</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop02:50090</value>
</property>
</configuration>
- 修改mapred-site.xml
vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 修改yarn-site.xml
vim yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 修改slaves文件
#将文件中的localhost删除,添加主节点与子节点的hostname
vim workers
- 将主节点中配置好的文件和hadoop目录copy给子节点
scp /etc/profile hadoop02:/etc/profile
scp /etc/profile hadoop03:/etc/profile
scp -r /export/ hadoop02:/
scp -r /export/ hadoop03:/
- 使子节点中的配置文件生效
# 返回子节点hadoop02,hadoop03
source /etc/profile
- 在主节点格式化文件系统
hdfs namenode -format
5. Hadoop集群测试
5.1 启动集群:在主节点启动所有HDFS服务进程
start-dfs.sh
5.2 在主节点启动所有YARN服务进程
start-yarn.sh
5.3 使用jps命令查看进程
主节点hadoop01:
hadoop02:
hadoop03:
- NameNode(名称节点):有时候也叫MasterNode(主节点),它不保存实际数据,只保存元数据(数据块的数目、大小、存储位置)。它也维护着文件系统的命名空间和路径信息。名称节点应当位于可靠的服务器上。
- SecondaryNameNode(第二名称节点):用于在名称节点失效时进行替换。
- DataNode(数据节点):有时候也叫SlaveNode(从节点)。它保存实际的数据,根据名称节点的指令,执行数据块的创建、删除、复制。数据节点的数量可以很庞大,但对服务器的要求不高。
5.4 通过UI界面查看Hadoop运行状态
在Windows系统下,访问http://hadoop01:50070,查看HDFS集群状态。如果查看不了关闭虚拟机防火墙:
sudo ufw disable
5.5 查看Yarn集群状态
在Windows系统下,访问http://hadoop01:8088
6 hadoop集群时间同步
6.1. 确保日志一致性
Hadoop 集群中的各个节点需要有一致的时间戳,以确保各节点产生的日志能够按照时间顺序正确地排列和分析。如果节点之间的时间不同步,日志的时间戳可能会出现错乱,导致以下问题:
- 难以定位故障:分析日志时,时间戳错乱可能导致难以关联不同节点之间发生的事件。
- 数据处理流程混乱:调度任务、数据写入和读取等操作依赖时间顺序,时间不同步可能会导致调度错误或者数据异常。
6.2. 分布式文件系统的一致性
Hadoop 使用的 HDFS(Hadoop Distributed File System)是一个分布式文件系统,文件的创建、修改和访问时间(时间戳)在分布式环境中都依赖于系统时间来维护一致性。如果节点之间时间不同步,可能导致以下问题:
- 文件冲突:文件在多个节点之间同步时,时间戳不同可能导致文件被错误覆盖或丢失。
- 数据一致性错误:HDFS 依赖文件的创建和修改时间来进行数据管理和同步,时间不同步会破坏 HDFS 的一致性。
6.3. YARN 作业调度和执行
Hadoop 中的 YARN(Yet Another Resource Negotiator)负责作业的调度和资源分配,调度和执行流程中对各个节点的时钟有以下依赖:
- 任务启动和结束时间的记录:调度器需要记录每个任务的开始和结束时间,用来计算任务的执行时间、判断是否需要重试、是否超时等。
- 任务重启机制:如果节点之间的时间不一致,调度器可能会认为某些任务没有按时完成而触发重启机制,从而导致任务的无效重启或失败。
6.4 配置hadoop集群中主机hadoop01、hadoop02、hadoop03时间同步
-
1. 在所有虚拟机上安装
chrony
,在三台虚拟机上分别执行以下命令:
sudo apt update
sudo apt install chrony -y
- 2. 配置时间服务器(hadoop01),在时间服务器(hadoop01)上编辑
chrony
配置文件:
sudo vim /etc/chrony/chrony.conf
在配置文件中进行以下修改:
- 注释掉默认的时间服务器(
pool
和server
行)。 - 添加本机作为服务器的配置。
- 允许客户端(hadoop02和 hadoop03)访问此服务器。
配置文件如下:
10.211.55.0使本机作为时间源,local stratum 10 设置本机的层次结构,allow 10.211.55.0/24 允许局域网内的所有设备访问时间服务器。
- 启动并启用
chrony
服务:
sudo systemctl restart chrony
sudo systemctl enable chrony
- 检查
chrony
服务状态,确保其正常运行:
sudo systemctl status chrony
- 检查时间服务器状态:
- 3. 配置客户端(hadoop02和 hadoop03)
编辑 chrony
配置文件:
sudo vim /etc/chrony/chrony.conf
在配置文件中进行以下修改:
- 注释掉默认的时间服务器。
- 设置时间服务器为 hadoop01 的 IP 地址。
配置文件示例如下:
- 保存配置并退出。启动并启用
chrony
服务
sudo systemctl restart chrony
sudo systemctl enable chrony
- 检查
chrony
服务状态:
sudo systemctl status chrony
- 检查客户端是否成功连接到时间服务器:
chronyc sources
- 4. 验证集群时间同步
在所有虚拟机上分别运行以下命令,查看时间是否同步:
timedatectl
或者使用 chronyc
查看同步状态:
chronyc tracking
- 5. 如果你希望 hadoop02 和 hadoop03也可以作为时间源(冗余配置)
可以将 hadoop02 和 hadoop03配置成时间服务器(类似于 hadoop01 的配置),并在每台机器上设置彼此为时间源。这样就形成了一个完整的时间同步集群结构,任何一台服务器故障时,其余机器仍能保持时间同步。
配置文件可以修改如下(三台虚拟机都需要):
server10.211.55.8 iburst
server 10.211.55.9 iburst
server 10.211.55.10 iburst
这样设置后,即使某台时间服务器不可用,其他客户端仍然可以与剩余的服务器同步时间。
7. Ubuntu搭建Hadoop集群搭建常见问题
当我们启动hdfs服务时,即运行如下命令:
start-dfs.sh
报错:hadoop01: ERROR: Cannot set priority of datanode process 540655
找了很多篇帖子,很多都没有把问题说清楚,下面我提供一种解决方案:
首先这个问题可能是由如下几种情况引起的:
7.1 配置 HADOOP_NICENESS
变量
将 HADOOP_NICENESS
配置为默认值 0
,这将禁止 Hadoop 在启动时尝试更改进程优先级。可以在 hadoop-env.sh
中进行配置。
-
打开
hadoop-env.sh
配置文件(通常位于$HADOOP_HOME/etc/hadoop/hadoop-env.sh
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export HADOOP_NICENESS=0
- 保存并退出文件,然后重新启动 Hadoop 集群:
stop-dfs.sh
stop-yarn.sh
start-dfs.sh
start-yarn.sh
这会确保 Hadoop 在启动各个服务时不会更改进程的优先级,从而避免该错误。
7.2 修改文件夹hadoop-3.3.6的权限
- 首先停掉所有服务:
stop-all.sh
- 在主节点格式化文件系统
hdfs namenode -format
- 修改文件夹hadoop-3.3.6的权限
sudo chmod -R 777 /home/user/hadoop-3.3.6/
- 最后重启所有服务:
start-all.sh
经过上面一系列操作,我们就可以查看HDFS集群状态和Yarn集群状态 :
参考的帖子:
https://zhuanlan.zhihu.com/p/669223842?utm_medium=social&utm_psn=1820168962375282688&utm_source=wechat_session [Hadoop] Namenode Error (localhost: ERROR: Cannot set priority of datanode process ) — B's