【大数据】hadoop的运行模式(root用户下、尚硅谷Hadoop入门)


前言

Hadoop 运行模式包括:本地模式、伪分布式模式以及完全分布式模式
了解更多详情👉hadoop官方网站


一、三种运行模式

  • 本地(独立)模式:无需运行任何守护进程,所有程序都在同一个JVM上执行,在独立模式下测试和调试MapReduce都非常方便,因此该模式在开发阶段比较适合(学习用)
  • 伪分布式模式:Hadoop守护进程运行在本地机器上,模拟一个小规模的集群
  • 完全分布式:Hadoop守护进程运行在一个集群上(企业用)

数据存储方式不同:

  1. 本地模式数据存储在本地
  2. 伪分布模式数据存储在HDFS
  3. 完全分布式数据存储在HDFS,多台服务器工作

二、本地运行模式(官方WordCount)

🎯在hadoop文件夹下创建一个wcinput文件夹

mkdir wcinput
# 进入文件夹中
cd wcinput
# 编辑word.txt文本
vim word.txt
# 操作如下
i
11 11 11
22 22
33

# 回到Hadoop目录下执行(3.3.6版本的就是3.3.6,建议按tab键自动补全)
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
# 查看结果
cat wcoutput/part-r-00000

结果如下:

11      3
22      2
33      1

三、完全分布式运行模式

1. 编写集群分发脚本xsync

1.1 scp 安全拷贝

🎯语法:scp [选项] 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
🎯功能:可以实现服务器之间的数据拷贝

🎯选项:

选项说明
-C这会在复制过程中压缩文件或目录
-P如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口
-r此选项递归复制目录及其内容
-p保留文件的访问和修改时间

🎯例子:

# 文件夹在hadoop102上,拷贝到其他虚拟机上
# 102 --> 103
scp -r  /opt/module/java8/ root@hadoop103:/opt/module/
# 103 <-- 102
scp -r root@hadoop102:/opt/module/hadoop/ /opt/module/
# (103)102 --> 104
scp -r root@hadoop102:/opt/module/* root@hadoop104:/opt/module/

上面命令将本地目录xxx复制到远程 module 目录下,会创建子目录

1.2. rsync 远程同步工具

rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点

🎯rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更新。scp 是把所有文件都复制过去
🎯语法:rsync [选项] 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称

🎯选项:

选项功能
-a归档拷贝
-v显示复制过程
-l拷贝符号链接

🎯例子:

# 更新同步hadoop103里面hadoop内容
rsync -av hadoop/ root@hadoop103:/opt/module/hadoop/

注意

  1. 如果只想同步源目录source里面的内容到目录destination,则需要在源目录后面加上斜杠
  2. 上面命令执行后,source目录里面的内容,就都被复制到了destination目录里面,不会在destination下面创建一个source子目录

1.3. xsync 集群分发脚本

🎯需求:循环复制文件到所有节点的相同目录下
🎯期待脚本:xsync 要同步的文件名称
🎯将脚本放在声明了全局环境变量的路径中

# 查看全局变量
$PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/opt/module/java8/bin:/opt/module/hadoop/bin:/opt/module/hadoop/sbin

# 如果全局变量中没有java、hadoop
source /etc/profile

发现/root/bin路径,故选择在根目录下创建bin目录,创建脚本xsync全局可用

🎯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

🎯小试牛刀:

# 将xsync脚本分发到其他虚拟机上
xsync /root/bin/

# 将java、hadoop环境变量分发到其他虚拟机上
xsync /etc/profile.d/my_env.sh
# 非root用户
sudo ./bin/xsync /etc/profile.d/my_env.sh

2. ssh 免密登录

🎯免密登录原理
在这里插入图片描述
🎯对每一台虚拟机:从根目录进入.shh目录下,生成公钥和私钥:ssh-keygen -t rsa,接着将公钥拷贝给所有虚拟机(包括自己)ssh-copy-id hadoop102

3.集群配置

NameNode 和 SecondaryNameNode 不要安装在同一台服务器,很消耗内存,ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上

🎯集群配置部署
在这里插入图片描述
🎯配置文件说明:Hadoop 配置文件分两类,默认配置文件自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值

🎯默认配置文件

默认配置文件文件存放在 Hadoop 的 jar 包中的位置
core-default.xmlhadoop-common-3.1.3.jar/core-default.xml
hdfs-default.xmlhadoop-hdfs-3.1.3.jar/hdfs-default.xml
yarn-default.xmlhadoop-yarn-common-3.1.3.jar/yarn-default.xml
mapred-default.xmlhadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml

🎯自定义配置文件(常用):core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xmlworkers 五个配置文件存放在/opt/module/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置
🎯核心配置文件:vim core-site.xml,相当于内部通讯,在<configuration></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网页登录使用的静态用户为root -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>

🎯HDFS配置文件:外部通讯的接口,vim hdfs-site.xml,在<configuration></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>

🎯YARN配置文件:vim yarn-site.xml,在<configuration></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_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>

🎯MapReduce配置文件:mapred-site.xml,在<configuration></configuration>之间插入以下内容

<!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

🎯分发到其他虚拟机:xsync hadoop/,在hadoop103/104上查看是否搞定cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml

  • 常用端口号:
端口名称端口号
NameNode 内部通信端口8020 / 9000 / 9820
NameNode HTTP UI9870
MapReduce 查看执行任务端口8088
历史服务器通信端口19888

4. 群起集群

🎯配置workers:vim /opt/module/hadoop-3.1.3/etc/hadoop/workers ,增加以下内容(该文件中添加的内容结尾不允许有空格,文件中不允许有空行)

hadoop102
hadoop103
hadoop104

# 保存退出,同步配置文件
xsync /opt/module/hadoop/etc/hadoop/workers

🎯启动集群:如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode

# 在hadoop根目录输入
hdfs namenode -format
# 随后会产生data和logs两个文件

格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化

  1. 杀进程sbin/stop-dfs.sh
  2. 删除每个虚拟机上的logsdata
  3. 格式化NameNode:hdfs namenode -format

🎯启动HDFS

# hadoop 根目录下启动 hdfs
sbin/start-dfs.sh

🤯启动hadoop集群时还有可能会报如下错误

Starting namenodes on [hadoop102]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop104]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

🎯解决方案:

vim /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

🎯查看是否启动成功:

# 分发并刷新配置文件
xsync /etc/profile ; source /etc/profile
# hadoop 根目录下启动 hdfs
sbin/start-dfs.sh
# jps查看启动的进程(Java进程的相关信息)
jps

🎯启动YARN(hadoop103上启动)

# 同样在hadoop根目录下
source /etc/profile
sbin/start-yarn.sh

# jps查看启动的进程
jps

🎯web端查看 HDFS 的 NameNode:浏览器中输入 http://hadoop102:9870;Web 端查看 YARN 的 ResourceManager:浏览器中输入 http://hadoop103:8088

5. 集群基本测试

🎯上传文件到集群(hadoop102上操作):

# 创建一个目录,后续操作才得以开展
hadoop fs -mkdir /wcinput
# 上传小文件
hadoop fs -put wcinput/word.txt /wcinput
# 上传大文件到根目录
hadoop fs -put /opt/software/jdk-8u371-linux-x64.tar.gz /

🎯web端查看上传情况:http://hadoop102:9870/explorer.html#/,可以看到在这里插入图片描述副本为3

上传文件后查看文件存放在什么位置(hadoop102)?

  1. HDFS的存储路径:/opt/module/hadoop/data/dfs/data/current/BP-141094941-192.168.150.103-1689214323987/current/finalized/subdir0/subdir0
  2. 查看HDFS在磁盘存储文件内容:cat blk_1073741825,可以发现blk_一长串数字即我们上传的文件,可以进行查看、解压等操作

🎯测试YARN(需要计算时才会显示任务):

# hadoop根目录下
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput

查看执行详情http://hadoop103:8088http://hadoop102:9870/explorer.html#/,不过还查看不了历史(history)

6. 配置历史服务器

🎯配置mapred-site.xml
vim /opt/module/hadoop/etc/hadoop/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>

🎯回到/opt/module/hadoop/etc/hadoop分发配置xsync mapred-site.xml,并在hadoop102上启动历史服务器:bin/mapred --daemon start historyserver
🎯查看是否启动成功:jps

🎯测试一下:

# 先创建文件夹
hadoop fs -mkdir /input
# 上传文件
hadoop fs -put wcinput/word.txt /input
# 测试yarn
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

web上查看记录http://hadoop102:19888/jobhistory

7. 配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上,可以方便的查看到程序运行详情,方便开发调试
在这里插入图片描述开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer

🎯配置yarn-site.xml

vim /opt/module/hadoop/etc/hadoop/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>
<!-- 设置日志保留时间为 7 天 -->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>

🎯保存之后分发

xsync yarn-site.xml

🎯重启NodeManager 、ResourceManager 和 HistoryServer:mapred --daemon stop historyserver,单个服务停止;切换至hadoop103上sbin/stop-yarn.sh
关闭yarn,sbin/start-yarn.sh重启yarn,切回hadoop102mapred --daemon start historyserver

🎯测试一下:

# hadoop根目录下
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2

web上查看logs是否有运行信息http://hadoop102:19888/jobhistory
注意输出的文件不能已经存在了,要么删除原有的,要么新建一个

8. 集群启动/停止方式

🎯各个模块分开启动/停止(配置 ssh 是前提)

# 整体启动/停止HDFS
start-dfs.sh
stop-dfs.sh
# 整体启动/停止yarn(hadoop103)
start-yarn.sh
stop-yarn.sh

🎯各个服务组件逐一启动/停止

# 单独启动/停止HDFS组件(namenode或datanode或secondarynamenode其中之一)
hdfs --daemon start namenode或datanode或secondarynamenode
hdfs --daemon stop namenode或datanode或secondarynamenode
# 单独启动/停止YARN组件
yarn --daemon stop resourcemanager或nodemanager
yarn --daemon stop resourcemanager或nodemanager

🎯注意到上述操作繁杂重复,故可以用脚本一键启动/关停所有vim /bin/myhadoop.sh

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi

case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

🎯先加上权限chmod 777 myhadoop.sh,再分发脚本xsync myhadoop.sh
🎯myhadoop.sh start一键启动、myhadoop.sh stop一键关停

🤯但是行不通,myhadoop.sh stop/start显示:

 =================== 关闭 hadoop集群 ===================
 --------------- 关闭 historyserver ---------------
 --------------- 关闭 yarn ---------------
Stopping nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
Stopping resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
 --------------- 关闭 hdfs ---------------
Stopping namenodes on [hadoop102]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.Stopping datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.Stopping secondary namenodes [hadoop104]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

🎯解决方法:vim /opt/module/hadoop/etc/hadoop/hadoop-env.sh

# 添加全局变量,跟上一个一样😵
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

最后分发脚本xsync /opt/module/hadoop/etc/hadoop/hadoop-env.sh即可

🎯一键查看所有服务器java进程的脚本,拒绝一台一台jps,vim /bin/jpsall

#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
        echo =============== $host ===============
        ssh $host jps
done

🎯先加上权限chmod 777 myhadoop.sh,再分发脚本xsync jpsall,最后jpsall 即可查看

9. 集群时间同步

如果服务器无法连接外网,需要时间同步
了解即可,影响性能,无需操作在这里插入图片描述
NTPD(Network Time Protocol daemon)是 Linux 操作系统的一个守护进程,其完整的实现了 NTP 协议,用于校正本地系统与时钟源服务器之前的时间

🎯查看所有节点 ntpd 服务状态和开机自启状态

systemctl status ntpd
# 启动 ntpd
systemctl start ntpd
# 查看开机是否自启
systemctl is-enabled ntpd
# 开机自启
systemctl enable ntpd

🎯修改 ntp.conf 文件,vim /etc/ntp.conf:

# 将这一行去掉注释,并修改为自己的网段
restrict 192.168.150.0 mask 255.255.255.0 nomodify notrap

# 集群在局域网中,不使用其他互联网上的时间,注释以下4行
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
fudge 127.127.1.0 stratum 10

🎯修改hadoop102的/etc/sysconfig/ntpdvim /etc/sysconfig/ntpd:

# 增加(让硬件时间和系统时间一起同步,时间更精准)
SYNC_HWCLOCK=yes

🎯重启ntdp服务:systemctl start ntdp

🎯其他机器配置:

# 关闭所有节点上ntdp服务和自启动
systemctl stop ntdp
systemctl disable ntdp

# 在其他机器上配置每1分钟与时间服务器同步一次
crontab -e
*/1 * * * * /usr/sbin/ntpdate hadoop102

如果你按照上面步骤操作了一遍,建议原路修改回去

10. 注意事项

🎯DataNode和NameNode进程同时只能工作一个
在这里插入图片描述

先关停所有进程,再删除信息,最后格式化


总结

过知识点时只有多敲多练测试案例才能找到学习过程中的bug,yarn相关操作要在hadoop103上进行…

完全分布模式的守护进程运行在由多台主机搭建的集群上,是真正的生产环境。在所有的主机上安装JDK和Hadoop,组成相互连通的网络。hadoop运行在多台机器上面,称之为hadoop集群。

✍下一任务:HDFS

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值