Hadoop3.1.3完全分布式搭建(231018)
一、前置准备(模版机)
- 准备
jdk1.8.0_202
和hadoop-3.1.3
- 准备一台CentOS模版机
- 模版机要求配置静态IP地址
- 模版机要求修改主机名
1.1、修改ip地址
修改网卡:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
添加:
BOOTPROTO=static #static静态IP地址,dhcp动态IP地址
···
ONBOOT=yes #将ONBOOT="no"改为ONBOOT="yes",开启网卡自动连接
···
IPADDR=192.168.10.21 #ip地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.10.2 #网关
DNS1=8.8.8.8 #修改DNS服务器
重启网卡
service network restart
1.2、修改主机名
修改主机名:
vim /etc/hostname
1.3、必装组件
常用命令:
yum install update vim epel-release tree wget net-tools psmisc nc rsync lrzsz ntp libzstd openssl-static iotop git -y
1.4、修改hosts
vim /etc/hosts
添加:注意要把前面两行注释掉(使用 #)
172.16.84.21 hadoop21
172.16.84.22 hadoop22
172.16.84.23 hadoop23
# 这是你们的 根据自己电脑来
192.168.10.31 hadoop31
192.168.10.32 hadoop32
192.168.10.33 hadoop33
使用scp
同步到hadoop32、hadoop33
scp /etc/hosts root@172.16.84.32:/etc/hosts # 从31同步到32
scp /etc/hosts root@172.16.84.33:/etc/hosts # 从31同步到33
其他系统:
# Linux中的hosts路径
/etc/hosts
# Windows的hosts路径
C:\Windows\System32\drivers\etc
# MacOS的hosts路径
/etc/hosts
1.5、创建用户 & 设置密码
这一步三台机子都要创建,hadoop31、hadoop32、hadoop33
创建用户:
useradd ahdan
设置密码:
passwd ahdan
1.6、修改全局用户权限
设置权限:
vim /etc/sudoers # 大概100行,100gg
root ALL=(ALL) ALL
ahdan ALL=(ALL) NOPASSWD:ALL #先添加行 设置面免密操作
1.7、禁用防火墙
禁用防火墙:
systemctl stop firewalld
systemctl disable firewalld
二、安装JDK & Hadoop
克隆三台主机hadoop31、hadoop32、hadoop33后,在hadoop31里面操作
==以下所有步骤使用root用户操作==
2.1、在hadoop31上传/解压
创建:
# 在/opt下创建software module
mkdir /opt/software /opt/module
# 验证
ls /opt
上传:
cd /opt/software # 上传到该目录
[root@hadoop31 software]# pwd
/opt/software
[root@hadoop31 software]# ls
hadoop-3.1.3.tar.gz jdk-8u121-linux-arm64.tar.gz
解压:
cd /opt/software
# 解压Java 到/opt/module/
tar -zxvf jdk-8u121-linux-arm64.tar.gz -C /opt/module/
# 解压Hadoop 到/opt/module/
tar -zxvf hadoop-3.1.3.tar.gz -C ../module/
验证:
ls /opt/module/
[root@hadoop31 software]# ls /opt/module/
hadoop-3.1.3 jdk1.8.0_121
2.2、配置环境变量:
编辑文件
vim /etc/profile.d/my_env.sh
添加:注意修改路径
# 配置JDK环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_121 # 修改Java安装目录
export PATH=$PATH:$JAVA_HOME/bin
# 配置hadoop环境变量
export HADOOP_HOME=/opt/module/hadoop-3.1.3 # 修改Hadoop安装目录
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 设置HDFS&YARN用户
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
生效:
source /etc/profile
验证版本号:
java -version
hadoop version
验证命令:
java
javac
hadoop
2.3、修改目录用户 & 用户组权限
==以下步骤全部使用所创建的用户(addan)操作==
su ahdan
给/opt/module/hadoop-3.1.3
权限
sudo chown -R ahxin:ahxin /opt/module/hadoop-3.1.3
2.4、删除官方文档400多MB
切换:
cd $HADOOP_HOME/share
查看:
du -h --max-depth=1
[ahdan@hadoop31 share]$ du -h --max-depth=1
357M ./hadoop
479M ./doc # 删的就删它
835M .
删除:
rm -rf $HADOOP_HOME/share/doc/
三、把hadoop21的包发送给hadoop22 hadoop23
==克隆三台机:hadoop31、hadoop32、hadoop33==
==修改对应的ip地址和主机名字==
主机名 | ip地址 |
---|---|
Hadoop31 | 172.16.84.31 |
Hadoop32 | 172.16.84.32 |
Hadoop33 | 172.16.84.33 |
3.1、修改ip地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
3.2、修改主机名字
sudo vim /etc/hostname
3.3、拷贝hadoop文件
将hadoop31中的/opt
下的所有文件,拷贝到hadoop32、hadoop33
切换root
su root
拷贝到hadoop32
scp -r /opt/* root@hadoop22:/opt/
拷贝到hadoop33
scp -r/opt/* root@hadoop23:/opt/
3.4、免密登录
root用户和ahdan用户都要用
生成密钥:
ssh-keygen -t rsa
发送密钥:
# hadoop31
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33
# hadoop32
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33
# hadoop33
ssh-copy-id hadoop31
ssh-copy-id hadoop32
ssh-copy-id hadoop33
四、Hadoop集群配置
规划:
192.168.10.31 hadoop31 NN DN NM
192.168.10.32 hadoop32 DN RM NM
192.168.10.33 hadoop33 DN SN RM
172.16.84.31 hadoop31
172.16.84.32 hadoop32
172.16.84.33 hadoop33
- NN (NameNode) - 名称节点:
HDFS文件系统文件和目录的命位置信息
- DN (DataNode) - 数据节点:
存储HDFS数据块的具体位置
- NM (NodeManager) - 节点管理器:
管理该节点上的资源
- RM (ResourceManager) - 资源管理器:
集群的资源管理
- SN (Secondary NameNode) - 次要名称节点:
定时备份
实现网址:
namenode的web地址为:http://hadoop31:9870
yarn的web地址为:http://hadoop32:8088
3.1、core-site.xml
切换Hadoop目录:
cd /$HADOOP_HOME/etc/hadoop
vim core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop21:9820</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为ahdan -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>ahxin</value>
</property>
</configuration>
<!-- 以下是代理的使用,主要在hive时使用,可以暂时不用配置 -->
<!-- 配置该hadoop(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<!-- 配置该hadoop(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<!-- 配置该hadoop(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
3.2、hdfs-site.xml
vim hdfs-site.xml
添加:
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop21:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop23:9868</value>
</property>
<!-- 页面操作权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
3.3、yarn-site.xml
vim 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>hadoop22</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>
<!-- 以下为可选配置 -->
<!-- yarn容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- yarn容器允许管理的物理内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
3.3、mapred-site.xml
vim mapred-site.xml
添加:
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.4、创建data文件
cd $HADOOP_HOME
mkdir data
# 授权
sudo chown -R ahdan:ahdan /opt/module/hadoop-3.1.3/data
3.5、workers(后面其群启动要用到)
works 配置的为 DataNode节点的主机名
sudo vim workers
# 添加:
hadoop21
hadoop22
hadoop23
五、集群分发脚本xsync
6.1、编写集群分发脚本rsync
rsync用法:
-a # 归档拷贝
-v # 显示复制过程
rsync -av /opt/software/* root@hadoop32:/opt/software
# 将hadoop21的hadoop配置文件 同步到hadoop22
rsync -av /opt/module/hadoop-3.1.3/etc/hadoop/* root@hadoop22:/opt/module/hadoop-3.1.3/etc/hadoop
注意:
- rsync 只对差异文件做更新, rsync 源和目标不能都是远程的
- rsync 是 分块校验+传输, scp 是整个文件传输。. rsync 比 scp 有优势的地方在于单个大文件的一小部分存在改动时,只需传输 改动部分 ,无需重新传输整个文件。
实现一条命令同步把任意hadoop同步到hadoop31、hadoop32、hadoop33
实现语法:
my_rsync 同步目录
# 把当前主机/opt下所有文件同步到hadoop31、hadoop32、hadoop33中
my_rsync /opt/*
6.2、创建脚本xsync
创建目录
mkdir ~/bin
cd ~/bin
sudo vim my_rsync.sh
创建软连接
sudo ln -s ~/bin/my_rsync.sh /bin/my_rsync.sh
添加
#!/bin/bash
#参数预处理,判断参数个数,
if [ $# -lt 1 ];then
echo 参数不能为空
exit
fi
#遍历集群所有机器
for host in hadoop21 hadoop22 hadoop23;do
echo "==========$host================"
# 遍历所有目录,按个发送
for file in $@;do
# 判断文件是否存在
if [ -e $file ];then
# 1. 获取当前文件的目录结构,使用cd防止是软连接 cd -P
pdir=$(cd -P $(dirname $file); pwd)
# 2.获取当前文件名
fname=$(basename $file)
# 3. 登陆目标地址,创建同一目标结构
ssh $host "mkdir -p $pdir"
# 4.依次分发文件或目录
rsync -av $pdir/$fname $host:$pdir
else
echo "$host $file 不存在"
fi
done
done
6.3、添加权限
chmod +x my_rsync.sh
6.4、测试
my_rsync ~/bin/my_rsync.sh
去hadoop32、hadoop33看看
ll ~/bin
六、单点启动/停止
6.1、格式化namenode
hdfs namenode -format
6.2、hadoop31启动项
hdfs --daemon start namenode # 1
hdfs --daemon start datanode # 2
yarn --daemon start nodemanager # 5
6.3、hadoop32启动项
hdfs --daemon start datanode # 2
yarn --daemon start resourcemanager # 4
yarn --daemon start nodemanager # 5
6.4、hadoop33启动项
hdfs --daemon start datanode # 2
hdfs --daemon start secondarynamenode # 3
yarn --daemon start nodemanager # 5
6.5、Web地址
# nomenoded的Web
http://hadoop31:9870
# yarn的web地址为:
http://hadoop32:8088
==单点停止就是把上面的start换成stop==
格式化 HDFS 集群的 NameNode的注意事项
集群只有首次搭建后需要对NameNode进行格式化操作
如果集群在后期使用过程需要重新格式化,一定切记删除
所有机器hadoop安装目录下的 data logs 目录。
七、集群启动/停止
切换root用户执行以下步骤
7.1、设置Hadoop用户为root
编辑:
vim /etc/profile.d/my_env.sh
添加:
# 设置HDFS&YARN用户
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
7.2、hadoop31启动HDFS
start-dfs.sh
7.3、hadoop32启动YARN
start-yarn.sh
jps:
7.4、Web地址
HDFS:http://hadoop31:9870
YARN:http://hadoop32:8088
利用hadoop提供的 群启/群停 脚本完成集群操作
群启: start-dfs.sh start-yarn.sh
群停: stop-dfs.sh stop-yarn.sh
`注意事项`:启动hdfs的时候要在NameNode所在的机器执行脚本
启动yarn的时候要在resourcemanager所在的机器执行脚本
7.5、用Web界面上传文件到集群
Utilities-->Browse the file system:
若报错无法创建,则给HDFS添加777权限:
[root@hadoop21 /]# hdfs dfs -chmod 777 /
进入目录:
上传:
7.6、从linux上传文件到集群
命令:
hadoop fs -put Linux上的目录为止 上传到HDFS的什么位置
hadoop fs -put /root/demo1.txt /wc_input
在/opt下创建一个mode2 内容如下:
vim /opt/demo2.txt
hadoop hadoop
ss ss
cls cls
jiao
banzhang
xue
hadoop
sgg sgg sgg
nihao nihao
bigdata0111
laiba
上传HDFS,/wc_input
中
hdfs dfs -put /opt/demo2.txt /wc_input
查看HDFS
的/
目录:
hdfs dfs -ls /
hdfs dfs -ls /wc_input
拓展:
# Hadoop命令
hadoop fs -ls <path>:列出指定路径下的文件和目录。
hadoop fs -mkdir <path>:在指定路径下创建新目录。
hadoop fs -rm <path>:删除指定路径下的文件或目录。
hadoop fs -mv <source> <destination>:将文件或目录从源路径移动到目标路径。
hadoop fs -cp <source> <destination>:将文件或目录从源路径复制到目标路径。
# HDFS命令
hdfs dfs -du <path>:显示指定路径下文件或目录的大小。
hdfs dfs -chown <user>:<group> <path>:更改文件或目录的所有者和所属组。
hdfs dfs -chmod <permissions> <path>:更改文件或目录的权限。
hdfs dfs -tail <path>:显示文件末尾的内容。
7.7、执行wordcount程序
执行前查看:
执行wordcount程序:
# 切换到
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output
执行后查看:
八、历史服务器
切换目录:
cd $HADOOP_HOME/etc/hadoop/
编辑:
vim mapred-site.xml
添加:
<configuration>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop21:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop21:19888</value>
</property>
</configuration>
分发一下:
my_rsync /opt/module/hadoop-3.1.3/etc/hadoop/
重启HDFS(需要先重启,否则无法正常打开历史):
stop-dfs.sh # 在hadoop21启动
start-dfs.sh # 在hadoop21启动
mapred --daemon start historyserver # 在hadoop21启动
[ahxin@hadoop11 hadoop-3.1.3]$ jps
12593 NameNode
12709 DataNode
12999 JobHistoryServer
11479 NodeManager
13018 Jps
九、日志的聚集
切换目录:
cd $HADOOP_HOME/etc/hadoop/
编辑:
vim yarn-site.xml
添加:
<configuration>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop21:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 秒为单位-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
先停止先前的:
stop-dfs.sh # hadoop21
mapred --daemon stop historyserver # hadoop21
stop-yarn.sh # hadoop21
启动:
# hadoop21
start-dfs.sh
mapred --daemon start historyserver
# hadoop22
start-yarn.sh
Web日志服务器:hadoop21:19888/jobhistory/
执行wordcount程序:
# 切换到
cd $HADOOP_HOME/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount /wc_input /wc_output
十、hadoop集群启停脚本
10.1、创建my_hadoop.sh
vim ~/bin/my_hadoop.sh
添加:
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 yarn ---------------"
ssh hadoop22 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop21 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
授权:
chmod +x ~/bin/my_hadoop.sh
创建软链接:
ln -s ~/bin/my_hadoop.sh /bin/my_hadoop
命令用法:
my_hadoop stop # 停止
my_hadoop start # 启动