搭建hadoop完全分布式集群(版本:3.13)
前言:最近在学习大数据的知识,hadoop集群作为大数据入门知识,一定要非常熟悉,现在我将我自己搭建hadoop集群的步骤以及遇到的问题进行一个汇总。做到一个温故知新的作用。
一、准备一台安装Linux系统的虚拟机
1. 配置虚拟机环境
1.1 配置yum源
由于yum的网站在国外,因此访问的时候,比较耗时,因此我们可以选择配置国内的镜像文件,可以使用阿里云或者网易163都可以。为防止权限问题,前期练习时可以使用root用户,以下操作均是在root用户下进行的。
#1.首先下载wget
yum install wget
#2.然后移动位置到/etc/yum.repos.d文件目录下
cd /etc/yum.repos.d
#3.将该文件夹下的CentOS-Base.repo拷贝一份,以防万一失败能够改回来
cp CentOS-Base.repo CentOS-Base.repo.backup
#4.下载网易163的景象,或者阿里云的镜像
wget http://mirrors.aliyun.com/repo/Centos-7.repo //阿里云
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo //网易163
#5.使用下载好的repos文件替换默认的repos文件,我用的是网易的镜像
mv CentOS7-Base-163.repo CentOS-Base.repo
#6.配置完需要清理旧缓存数据,缓存新数据
yum clean all
yum makecache
#7.测试
yum list | grep firefox
#会显示如下效果:
yum -y install firefox.x86_64
1.2 安装辅助工具
我用的是CentOS7最小化版。因此要先安装一系列我们开发过程中所需要的工具。
#直接复制到命令行即可,复制的时候记得一行一行复制
sudo yum install -y epel-release
sudo yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop
1.3设置静态ip
修改ip地址的时候建议大家,按照虚拟机的名字来进行修改,如我的虚拟机名称为hadoop100,那么我的静态ip就可设置为192.168.xxx.100这样方便大家记忆。
如何确认192.168.xxx.100中间的xxx呢? 大家可以在自己的windows系统中输入ipconfig查看自己的ip地址,中间有一项vmnet8的如下图所示:
那那么你就可以设置为 192.168.182.100 虚拟机名更改为hadoop100
具体修改方法为:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
具体修改的内容可以参考下图
ip地址就按照上面的修改即可
至于GATEWAY,以及DNS1可以设置为自己vmnet8的ip地址然后加1
1.4 修改主机名
注意主机名是局域网内部大家互相称呼的名字
vim /etc/hostname
如果那你设置的ip地址为192.168.182.100
那么建议你设置主机名为hadoop100这样方便我们记忆
1.5 配置hosts文件
1.5.1 linux
vim /etc/hosts
添加,(注意中间那个1你要替换为你自己的ip网段)
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
192.168.1.105 hadoop105
192.168.1.106 hadoop106
192.168.1.107 hadoop107
192.168.1.108 hadoop108
配置hosts文件的目的是:为了是你的主机名和ip地址形成映射关系,当你访问另外一台主机时输入ip地址会不太方便,那么你只需要输入相对好记忆的主机名即可。具体使用可参考下图所示:
1.5.2 windows
- 进入C:\Windows\System32\drivers\etc路径
- 打开hosts文件并添加如下内容
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
192.168.1.105 hadoop105
192.168.1.106 hadoop106
192.168.1.107 hadoop107
192.168.1.108 hadoop108
1.6关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1.7添加root权限的用户
useradd wukong 添加用户
passwd wukong 为新用户设置密码
配置wukong用户具有root权限
vi /etc/sudoers
修改/etc/sudoers文件,找到下面一行(91行),在root下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
wukong ALL=(ALL) NOPASSWD:ALL
在/opt目录下创建文件夹
(1)在/opt目录下创建module、software文件夹
mkdir module
mkdir software
(2)修改module、software文件夹的所有者
mkdir /opt/module /opt/software
chown wukong:wukong /opt/module /opt/software
2. 安装JDK和hadoop
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/
将你上传的java文件包解压到module下
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/
将你上传的hadoop文件包解压到module下
配置环境变量
vim /etc/profile.d/my_env.sh
添加如下内容
#JAVA_HOME
JAVA_HOME=/opt/module/jdk1.8.0_212
#HADOOP_HOME
HADOOP_HOME=/opt/module/hadoop-3.1.3
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME PATH HADOOP_HOME
配置完成之后
source /etc/profile
3. 克隆
接着克隆三台电脑,每台电脑需要修改ip地址以及hostname
二、配置hadoop的各项配置文件
我们的规划是
hadoop102 namenode datanode nodemanager
hadoop103 resourcemanager datanode nodemanager
hadoop104 secondarynamenode datanode nodemanager
在第二项的时候,我们既可以切换自己的具有管理员权限的用户了
2.1 配置:hadoop-env.sh
Linux系统中获取JDK的安装路径:
[wukong@ hadoop101 ~]# echo $JAVA_HOME
/opt/module/jdk1.8.0_212
修改JAVA_HOME 路径(直接添加到最后一行就行,强迫症可以搜索JAVA_HOME然后在下面进行配置):
export JAVA_HOME=/opt/module/jdk1.8.0_212
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9mVUTOJ-1586668519684)(assets/1586667723787.png)]
2.2 核心配置文件
- 配置整体:配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9820</value>
</property>
<!-- 指定hadoop数据的存储目录
官方配置文件中的配置项是hadoop.tmp.dir ,用来指定hadoop数据的存储目录,此次配置用的hadoop.data.dir是自己定义的变量, 因为在hdfs-site.xml中会使用此配置的值来具体指定namenode 和 datanode存储数据的目录
-->
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
</configuration>
- 配置HDFS:配置hdfs-site.xml
vim hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode数据的存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<!-- 指定Datanode数据的存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<!-- 指定SecondaryNameNode数据的存储目录 -->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<!-- 兼容配置,先跳过 -->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30s</value>
</property>
<!-- 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
vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<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_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
- MapReduce配置文件:配置mapred-site.xml
vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!—指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
2.3 配置ssh免密登录
1.生成公钥和私钥:
ssh-keygen -t rsa
2.将公钥拷贝到要免密登录的目标机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
2.4 编写分发文件的shell脚本
在/home/wukong 目录下创建bin目录,并在bin目录下创建xsync文件
*将下面的文件拷贝进xsync中,编写完xsync后一定要将上述的hadoop安装和jdk安装分发给各个用户,然后在给各个用户配置环境变量。分发的具体命令在下面:
#!/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
编写完成之后给xsync运行权限,为了方便我直接给了全部权限
chmod 777 xsync
具体分发hadoop和java的命令为
xsync /opt/module/hadoop-3.1.3
2.5 群起集群
2.5.1配置workers
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
#在该文件中增加如下内容:
hadoop102
hadoop103
hadoop104
#注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
#同步所有节点配置文件:
xsync workers
在确保每台机器都安装了hadoop以及java文件,并且配置了相关的环境变量之后,就可以对集群进行格式化了注意格式化操作一般只在集群第一次启动的时候操作一下,文章后面的注意事项会详细说明为什么。
#在hadoop102上面格式namenodee
hdfs namenode -format
#在hadoop102上面启动namenode
hdfs --daemon start namenode
#在hadoop103上面启动resourcemanager
yarn --daemon start resourcemanager
#在hadoop104上面启动secondarynamenode
hdfs --daemon start secnodarynamenode
#并分别在hadoop102,hadoop103,hadoop104上面启动datanode以及nodemanager
hdfs --daemon start datanode
yarn --nodemanager
是不是感觉命令挺多的 如果不想操作 那么我们编写一个shell脚本来进行群起集群,这样能够大大方便我们的启动效率。
2.5.2启动集群
- 格式化
hdfs namenode -format
如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有 namenode和datanode进程,然后再删除data和log数据)
- 启动HDFSstart-dfs.sh
start-dfs.sh
- 在配置了ResourceManager的节点(hadoop103)启动YARN
start-yarn.sh
编写群起集群的shell脚本
脚本的位置放在和xsync同一个位置,即/home/wukong/bin wukong是你的用户名
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input Error!!!!!"
exit
fi
case $1 in
"start")
echo "======================== start hdfs ========================== "
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "======================== start yarn ========================== "
ssh hadoop104 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
echo "======================== start historyserver ========================== "
ssh hadoop103 mapred --daemon start historyserver
;;
"stop")
echo "======================== stop yarn ========================== "
ssh hadoop104 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
echo "======================== stop hdfs ========================== "
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
echo "======================== stop historyserver ========================== "
ssh hadoop103 mapred --daemon stop historyserver
;;
"restart")
echo "======================== stop yarn ========================== "
ssh hadoop104 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
echo "======================== stop hdfs ========================== "
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
echo "======================== stop historyserver ========================== "
ssh hadoop103 mapred --daemon stop historyserver
echo "======================== start hdfs ========================== "
ssh hadoop103 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "======================== start yarn ========================== "
ssh hadoop104 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
echo "======================== start historyserver ========================== "
ssh hadoop103 mapred --daemon start historyserver
;;
*)
echo "Input Args Error!!!!!"
;;
esac
2.6 配置历史服务器
- 配置mapred-site.xml
vi mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
-
分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml -
在hadoop102启动历史服务器
mapred --daemon start historyserver -
查看历史服务器是否启动
jps -
查看JobHistory:http://hadoop102:19888/jobhistory
2.7 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
- 配置yarn-site.xml
vim yarn-site.xml
在该文件里面增加如下配置。
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
- 分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml - 关闭NodeManager 、ResourceManager和HistoryServer
在103上执行: stop-yarn.sh
在102上执行: mapred --daemon stop historyserver - 启动NodeManager 、ResourceManager和HistoryServer
在103上执行:start-yarn.sh
在102上执行:mapred --daemon start historyserver - 删除HDFS上已经存在的输出文件
hdfs dfs -rm -R /user/atguigu/output - 执行WordCount程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/atguigu/input /user/atguigu/output - 查看日志
http://hadoop102:19888/jobhistory
三,注意事项
1.格式化namenode
在格式化namenode之后,hadoop-3.1.3文件目录下,会出现data以及logs两个文件目录
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式
NameNode时,一定要先删除data数据和logs日志,然后再格式化NameNode。
[wukong@hadoop101 hadoop-3.1.3]$ cd data/tmp/dfs/name/current/
[wukong@hadoop101 current]$ cat VERSION
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837
[wukong@hadoop101 hadoop-3.1.3]$ cd data/tmp/dfs/data/current/
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837
gu/output
- 执行WordCount程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/atguigu/input /user/atguigu/output - 查看日志
http://hadoop102:19888/jobhistory
三,注意事项
1.格式化namenode
在格式化namenode之后,hadoop-3.1.3文件目录下,会出现data以及logs两个文件目录
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。所以,格式
NameNode时,一定要先删除data数据和logs日志,然后再格式化NameNode。
[wukong@hadoop101 hadoop-3.1.3]$ cd data/tmp/dfs/name/current/
[wukong@hadoop101 current]$ cat VERSION
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837
[wukong@hadoop101 hadoop-3.1.3]$ cd data/tmp/dfs/data/current/
clusterID=CID-f0330a58-36fa-4a2a-a65f-2688269b5837