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/
注意:
- 如果只想同步源目录source里面的内容到目录destination,则需要在源目录后面加上斜杠
- 上面命令执行后,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.xml | hadoop-common-3.1.3.jar/core-default.xml |
hdfs-default.xml | hadoop-hdfs-3.1.3.jar/hdfs-default.xml |
yarn-default.xml | hadoop-yarn-common-3.1.3.jar/yarn-default.xml |
mapred-default.xml | hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml |
🎯自定义配置文件(常用):core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
、workers
五个配置文件存放在/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 UI | 9870 |
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 目录,然后再进行格式化
- 杀进程
sbin/stop-dfs.sh
- 删除每个虚拟机上的
logs
和data
- 格式化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)?
- HDFS的存储路径:
/opt/module/hadoop/data/dfs/data/current/BP-141094941-192.168.150.103-1689214323987/current/finalized/subdir0/subdir0
- 查看HDFS在磁盘存储文件内容:
cat blk_1073741825
,可以发现blk_一长串数字
即我们上传的文件,可以进行查看、解压等操作
🎯测试YARN(需要计算时才会显示任务):
# hadoop根目录下
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
查看执行详情http://hadoop103:8088、http://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
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>
![img](https://img-blog.csdnimg.cn/img_convert/f56af939b84e61a0e1697e5007be54dd.png)
![img](https://img-blog.csdnimg.cn/img_convert/d0b88540a99e7247c6e5100d4be402e9.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
能,需要**重新启动** NodeManager 、ResourceManager 和 HistoryServer
>
>
>
🎯配置yarn-site.xml
vim /opt/module/hadoop/etc/hadoop/yarn-site.xml
增加如下配置
yarn.log-aggregation-enable true[外链图片转存中…(img-LzDy9CSS-1714732775090)]
[外链图片转存中…(img-nIAS1fzh-1714732775091)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!