教程Hadoop完全分布式环境搭建全过程
Posted MN979323
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程Hadoop完全分布式环境搭建全过程相关的知识,希望对你有一定的参考价值。
文章目录
- 简介
- 内容&流程
- 参考资料
- 资源分享
简介
- 保姆级入门教程:图片讲解 + 各种问题解决方案
- 集群服务器:hadoop102、hadoop103和hadoop104
- 虚拟机版本:CentOS7-1804
- 资源分享处(文章最后)提供CentOS7和Hadoop各组件压缩包(也可以自行下载,要注意版本兼容的问题),有需要自取~
内容&流程
1, 模板虚拟机准备
2, 克隆三台虚拟机,作为完全分布式集群
3, Hadoop完全分布式环境搭建
4, ZooKeeper & HBase & Maven & IDEA安装
一、模板虚拟机准备
安装模板虚拟机
注:下方未出现的步骤,选择默认选项即可
1,选择 - 自定义(高级)
2,稍后安装操作系统(也可以选择直接安装,没有太大区别)
3,虚拟机名称只作标识该虚拟机的作用,自定义即可
4,处理器数量1,内核数量2
5, 内存4G & 硬盘50G
(此虚拟机只为演示Hadoop完全分布式环境搭建过程所用,4G内存基本够用)
硬盘50G
(安装内容包含JDK、Hadoop、ZooKeeper、HBase、Maven和IDEA,50G够用)
6,自定义硬件
6.1 选择ISO映像文件
选择稍后安装的要在这一步选择自定义硬件,添加ISO映像文件
6.2 USB兼容性 - USB 3.1
7,开启此虚拟机,选择install centos 7(对应选项呈白色)
8,语言 - 中文 - 简体中文
(在操作体验上,与选择英语差别不大,建议英语不太好的童靴选择中文)
进入安装信息摘要界面
9,日期和时间:亚洲-上海
10,软件选择:只选择GNOME桌面
11,安装位置:自动配置分区
选择自动配置分区即可
(若想要手动分区,则点击 我要配置分区 - 完成,就会出现手动分区的界面)
12,网络和主机名
12.1 选择配置
12.2 查看个人虚拟机的相关信息
-
虚拟机 - 编辑选项卡 - 虚拟网络编辑器
-
选择NAT模式
-
NAT设置 - 查看子网掩码和网关
-
DHCP设置 - 查看IP地址范围
- 之后在配置静态IP地址时,所有的IP地址都必须在这个范围之内
- 之后在配置静态IP地址时,所有的IP地址都必须在这个范围之内
-
回到配置界面 - 选择IPv4配置 - 点击 Add
-
根据前面的步骤,地址填IP地址范围内的地址,子网掩码和网关照填即可
-
附加DNS服务器:填入与网关IP相同的地址
-
-
点击保存 - 回到配置界面 - 打开网络
☭问题1:打开网络后出现DNS1或者无法连接网络
出现DNS1:检查网关地址是否正确
无法连接网络:检查IP地址是否在起始和终止的IP地址范围之内
- 点击完成
13, 开始安装
将出现以下界面:
14, 设置ROOT密码
建议密码不要太复杂
15, 创建用户
- 创建一个普通用户,名称可自定义(我创建的用户名称是hadoop,之后用此名称指代普通用户)
- 目的: 在搭建项目的过程中,所有的项目有关的操作都由普通用户来执行,以此与超级用户(root用户)作区别,来维护系统的安全性(防止一些涉及到系统内核的操作被执行)。
- 建议密码不要太复杂
模板虚拟机环境准备
1, 配置静态网络
Q: 为什么使用静态IP地址?
A: 在使用虚拟机的时候,默认情况下使用的DHCP协议分配的动态IP地址,使得每次打开虚拟机后当前的IP地址都会发生变化,这样不方便管理。为了能够给当前虚拟机设置一个静态IP地址,方便后期使用XShell连接工具进行连接,以及配置各种服务。所以,我们需要为虚拟机设置一个静态IP地址。
1.1 打开终端,查看网卡名称 - 我的网卡名称为ens33,如下图所示
[root@bogon ~]$ ip addr
1.2 修改网卡配置文件(记得后面要改成自己的网卡名称)
[root@bogon ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 修改以下选项
BOOTPROTO='dhcp' -> 'static'
ONBOOT='no' -> 'yes'
- 如果在前面安装过程中,设置 网络和主机名 没有出错,那下列选项应该没有问题
IPADDR='要设置的IP地址'
PREFIX='子网掩码'
GATEWAY='网关IP'
DNS1='网关IP'
1.3 重启网络
[root@bogon ~]$ service network restart
2,设置hostname
- 设置主机名很重要,我设置的模板机的主机名为hadoop100,之后集群服务器中的主机名为hadoop102、hadoop103和hadoop104
- 下面的命令按自己的主机名来
[root@bogon ~]$ hostnamectl set-hostname 主机名
例如:hostnamectl set-hostname hadoop100
2.1 查看hostname
[root@bogon ~]$ cat /etc/hostname
hadoop100
2.2 编辑hosts文件
目的: 修改/etc/hosts 文件,该文件主要用于映射 IP 地址和域名之间的连接
[root@bogon ~]$ vi /etc/hosts
- 在第二行添加:原本第二行如果有内容删除即可;
- 之后保存退出
IP地址 主机名
例如:
我设置的IP地址为xxx.xxx.xxx.130,那么我要添加的内容就是
xxx.xxx.xxx.130 hadoop100
☭问题2:主机名变为bogon如何解决?
# 执行su命令
[root@bogon ~]$ su
[root@localhost ~]$
3,SSH免密登录
# hadoop 普通用户
[root@localhost ~]$ su hadoop
# 第一次配置免密登录,执行下面这个命令后点三次回车即可
[hadoop@localhost root]$ ssh-keygen
[hadoop@localhost root]$ ssh-copy-id localhost
[hadoop@localhost root]$ ssh localhost
Last login: Web Feb 8 21:43:26 2023
[hadoop@localhost ~]$
4,安装工具包
[root@localhost ~]$ yum install -y epel-release
...
已安装:
epel-release.noarch 0:7-11
完毕!
[root@localhost ~]$ yum install -y net-tools
[root@localhost ~]$ yum install -y vim
☭问题3:报错14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误”
CentOS7下报错14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误”-解决方法
5,关闭防火墙,并设置关闭防火墙开机自启
[root@localhost ~]$ systemctl stop firewalld
[root@localhost ~]$ systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# 查看防火墙是否已关闭
[root@localhost ~]$ systemctl list-unit-files |grep firewalld
firewalld.service disabled
6,修改/etc/sudoers文件,使hadoop用户(普通用户)具有 root 权限,方便后期加 sudo 执行 root 权限的命令
[root@localhost ~]$ vim /etc/sudoers
在%wheel 这行下面添加一行,其他为文件本身内容,不要改动
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL
7,在/opt 目录下创建 module、software 文件夹
7.1 module文件夹存放解压后的文件,software文件夹存放待解压的压缩包
[root@localhost ~]$ mkdir /opt/module /opt/software
7.2 修改两个目录的所属组和所有者均为hadoop用户
[root@localhost ~]$ chown -R hadoop:hadoop /opt/module
[root@localhost ~]$ chown -R hadoop:hadoop /opt/software
7.3 查看 module、software 文件夹的所有者和所属组
[root@localhost ~]$ cd /opt/
[root@localhost opt]$ ll
总用量 0
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 21:53 module
drwxr-xr-x. 2 root root 6 9月 7 2017 rh
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 12:53 software
8,卸载虚拟机自带JDK并重启虚拟机
[root@localhost opt]$ rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
[root@localhost opt]$ reboot
8.1 查看JDK版本(看是否卸载干净)
[root@hadoop100 ~]$ java -version
bash: java: 未找到命令...
二、克隆虚拟机准备
使用VMware自带的克隆功能,利用模板虚拟机克隆三台虚拟机:
主机名分别为hadoop102、hadoop103和hadoop104
IP地址为xxx.xxx.xxx.132、xxx.xxx.xxx.133和xxx.xxx.xxx.134(根据自己虚拟机的IP地址范围配置,下面有具体配置过程)
注意:克隆时,要先关闭hadoop100
1,修改克隆机 IP
以下过程以hadoop102为例,三台虚拟机都需要做
1.1 修改网卡配置文件(记得后面要改成自己的网卡名称)
[root@hadoop100 ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 修改以下选项
UUID='原来的UUID' -> '新生成的UUID'
IPADDR='原来的IP地址' -> '要设置的IP地址'
1.2 重启网络
[root@hadoop100 ~]$ service network restart
2,修改克隆机主机名
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ vim /etc/hostname
hadoop102
3,修改/etc/hosts文件
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ vim /etc/hosts
3.1 添加如下内容
依然是IP地址要修改成你自己的:
尤其是hadoop102~104,对应的IP地址为你要设置的IP
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
4,重启虚拟机
以下过程以hadoop102为例,三台虚拟机都需要做
[root@hadoop100 ~]$ reboot
4.1 重启之后,打开终端发现主机名已经修改成功
[root@hadoop102 ~]$
5,修改 windows 的主机映射文件
5.1 如果操作系统是window7,可以直接修改
- 进入C:\\Windows\\System32\\drivers\\etc 路径
- 打开hosts 文件并添加如下内容,然后保存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108
5.2 如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可
- 进入C:\\Windows\\System32\\drivers\\etc 路径
- 拷贝hosts 文件到桌面
- 打开桌面 hosts 文件并添加同上内容
- 将桌面 hosts 文件覆盖 C:\\Windows\\System32\\drivers\\etc 路径 hosts 文件
修改完毕后,就可以在windows环境下使用xshell连接虚拟机了,操作会方便很多哦~
附:XShell免费版的安装配置教程以及使用教程(超级详细、保姆级)
6,在hadoop102上安装JDK
6.1 首先确保虚拟机自带JDK卸载干净
[root@hadoop102 ~]$ java -version
bash: java: 未找到命令...
6.2 解压JDK到/opt/module
- 提示1:xshell中可以使用rz命令将本地文件上传至虚拟机,或者建立共享文件夹也有同样效果。
- 提示2:文章末尾提供JDK8等各组件的安装包,需要自取~
- 进入/opt/software文件夹,查看压缩包名称
[root@hadoop102 ~]$ cd /opt/software
[root@hadoop102 software]$ ls
- 解压JDK压缩包
[root@hadoop102 software]$ su hadoop
[hadoop@hadoop102 software]$ sudo tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt/module
6.3 修改JDK安装包名称
[hadoop@hadoop102 software]$ cd ../module
[hadoop@hadoop102 module]$ ls
jdk1.8.0_211
[hadoop@hadoop102 module]$ mv jdk1.8.0_211 jdk
[hadoop@hadoop102 module]$ ls
jdk
6.4 配置 JDK 环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
- 添加以下内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
- 刷新shell环境,让环境变量生效
[hadoop@hadoop102 module]$ source /etc/profile
- 查看JDK版本信息
[hadoop@hadoop102 module]$ java -version
☭问题4:执行 source /etc/profile命令时,报错:bash: #: 未找到命令
首先再仔细检查一下 /etc/profile.d/my_env.sh 文件,尤其是注释前面的 # 有没有省略,以及HOME目录有没有配错。
7,在hadoop102安装Hadoop
7.1 进入/opt/software文件夹,解压Hadoop到/opt/module
[hadoop@hadoop102 software]$ sudo tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/module
7.2 修改Hadoop安装包名称
[hadoop@hadoop102 module]$ ls
hadoop-2.6.0-cdh5.14.2 jdk
[hadoop@hadoop102 module]$ mv hadoop-2.6.0-cdh5.14.2 hadoop
[hadoop@hadoop102 module]$ ls
hadoop jdk
# 确保hadoop用户具有操作module目录下文件的权限
[hadoop@hadoop102 module]$ cd ..
[hadoop@hadoop102 opt]$ chown -R hadoop:hadoop module
7.3 将 Hadoop 添加到环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
- 添加以下内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
- 刷新shell环境,让环境变量生效
[hadoop@hadoop102 module]$ source /etc/profile
- 查看Hadoop版本信息
[hadoop@hadoop102 module]$ hadoop version
三、完全分布式环境部署
1,本地测试
里面有些步骤与后续内容相关,尽量不要跳过
#创建hello.txt文件,用来测试hadoop自带的wordcount程序
[hadoop@hadoop102 module]$ mkdir /hadoop/wcinput
[hadoop@hadoop102 module]$ cd /hadoop/wcinput
[hadoop@hadoop102 wcinput]$ vim hello.txt
1.1 在hello.txt文件中填入任意内容即可,举例:
hello world
hello java
I'm MOSS
1.2 运行wordcount程序
注:在$HADOOP_HOME/share/hadoop/mapreduce/目录下找对应jar包
[hadoop@hadoop102 hadoop]$ pwd
/opt/module/hadoop
[hadoop@hadoop102 hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount wcinput wcoutput
[hadoop@hadoop102 hadoop]$ cat wcoutput/part-r-00000
2,编写集群分发脚本 xsync
2.1 执行以下命令同步jdk和hadoop文件到hadoop103和hadoop104,顺便测试scp和rsync命令
注意执行各命令的服务器
[hadoop@hadoop102 hadoop]$ scp -r /opt/module/jdk hadoop@hadoop103:/opt/module
[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/hadoop /opt/module/
[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/* hadoop@hadoop104:/opt/module
# 在hadoop103上删除wcinput目录,执行rsync同步命令后,hadoop103上wcinput目录恢复
[hadoop@hadoop103 hadoop]$ rm -rf wcinput/
[hadoop@hadoop102 opt]$ rsync -av hadoop/ hadoop@hadoop103:/opt/module/hadoop/
2.2 编写xsync脚本
- 期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径):
[hadoop@hadoop102 opt]$ echo $PATH
[hadoop@hadoop102 opt]$ cd /home/hadoop
[hadoop@hadoop102 ~]$ mkdir bin
- 将/home/hadoop/bin目录添加到全局环境变量中
[hadoop@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
- 添加以下内容:
#XSYNC_HOME
export XSYNC_HOME=/home/hadoop
export PATH=$PATH:$XSYNC_HOME/bin
- 刷新shell环境,让环境变量生效
[hadoop@hadoop102 ~]$ source /etc/profile
# 查看发现全局环境变量中已有/home/hadoop/bin目录
[hadoop@hadoop102 ~]$ echo $PATH
- 在/home/hadoop/bin目录下编写xsync脚本
[hadoop@hadoop102 ~]$ cd bin
[hadoop@hadoop102 bin]$ vim xsync
- 在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
2.3 修改脚本 xsync 具有执行权限
[hadoop@hadoop102 bin]$ chmod +x xsync
2.4 测试脚本
[hadoop@hadoop102 bin]$ xsync /home/hadoop/bin
2.5 同步环境变量配置
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。
[hadoop@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
2.6 让环境变量生效
[hadoop@hadoop103 bin]$ source /etc/profile
[hadoop@hadoop104 bin]$ source /etc/profile
3,ssh免密登录
3.1 生成公钥和私钥
[hadoop@hadoop102 ~]$ cd /home/hadoop/.ssh
[hadoop@hadoop102 .ssh]$ ssh-keygen -t rsa
3.2 将公钥拷贝到要免密登录的目标机器上
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop103
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop104
注意:
- 还需要在 hadoop103 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
- 还需要在 hadoop104 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
- 还需要在 hadoop102 上采用 root 账号,配置一下无密登录到 hadoop102、hadoop103、hadoop104。
接下来就可以通过ssh 主机名命令免密登录到别的服务器了~
以下为测试:
[hadoop@hadoop102 .ssh]$ ssh hadoop103
Last login: Tue Feb 14 11:57:09 2023 from hadoop102
[hadoop@hadoop103 ~]$ pwd
/home/hadoop
[hadoop@hadoop103 ~]$ exit
登出
Connection to hadoop103 closed.
[hadoop@hadoop102 .ssh]$
4,集群配置
4.1 集群部署规划
- 元数据节点、资源管理器和从元数据节点分别安装在三台服务器上
- 数据节点和节点管理器在三台服务器上均安装
4.2 配置集群
- 核心配置文件配置 core-site.xml
[hadoop@hadoop102 .ssh]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop102 hadoop]$ vim core-site.xml
- core-site.xml修改内容如下:
注意这个hadoop数据存储目录哦,如果没有指定的话,hadoop会在HOME目录下生成一个tmp目录,现在我们指定了,就变成 /opt/module/hadoop/data目录。
所以如果在进行hadoop的格式化之前要删除的tmp目录和logs目录,就变成了data目录和logs目录了。
附:如何重新格式化Hadoop文件系统
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
- HDFS 配置文件-配置 hdfs-site.xml
[hadoop@hadoop102 hadoop]$ vim hdfs-site.xml
- hdfs-site.xml修改内容如下:
<configuration>
<!-- nn web 端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!-- 2nn web 端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
- YARN 配置文件-配置 yarn-site.xml
[hadoop@hadoop102 hadoop]$ vim yarn-site.xml
- yarn-site.xml修改内容如下:
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
</property>
</configuration>
- MapReduce 配置文件-配置 mapred-site.xml
[hadoop@hadoop102 hadoop]$ vim mapred-site.xml
- mapred-site.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
以上是关于教程Hadoop完全分布式环境搭建全过程的主要内容,如果未能解决你的问题,请参考以下文章