在集群环境中,主节点需要频繁的访问从节点,以获取从节点的运行状态,主节点每次访问从节点时都需要通过输入密码的方式进行验证,确定密码输入正确后才建立连接,这会对集群运行的连续性造成不良影响,为主节点配置SSH免密登录功能,可以有效避免访问从节点时频繁输入密码。接下来,虚拟机hadoop1作为集群环境的主节点实现SSH免密登录。
SSH免密登录原理(原理:非对称加密算法:公钥加密(给别人)、私钥解密给自己)
1)生成密钥
在虚拟机hadoop1中执行ssh-keygen -t rsa
命令,生成密钥。
查看秘钥文件
在虚拟机hadoop1中执行ll /root/.ssh
命令查看密钥文件。
2)复制公钥文件
将虚拟机hadoop1生成的公钥文件复制到集群中相关联的所有虚拟机,实现通过虚拟机hadoop1可以免密登录虚拟机hadoop1、hdp3-2和hdp3-3。
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
3)测试免密登录
ssh hadoop1
ssh hadoop2
ssh hadoop3
6. 安装JDK
约定:软件安装包存放于
/software
,软件安装至/opt
1)创建目录
在虚拟机hadoop1中执行mkdir /software
2)上传jdk
利用winscp将jdk-8u261-linux-x64.tar.gz
上传至hadoop1的/software
目录
3)解压jdk
cd /software
ll
tar -xvf jdk-8u261-linux-x64.tar.gz -C /opt
4)配置JDK系统环境变量
在虚拟机hadoop1执行vi /etc/profile
命令编辑环境变量文件profile,在该文件的底部添加配置JDK系统环境变量的内容。
export JAVA\_HOME=/opt/jdk1.8.0_261
export PATH=$PATH:$JAVA\_HOME/bin
记得执行source /etc/profile
重新加载系统环境变量
5)验证jdk
java -version
6)同步文件
分发JDK安装目录和系统环境变量文件至hadoop2、hadoop3
scp -r /opt/jdk* root@hadoop2:/opt
scp /etc/profile root@hadoop2:/etc
scp -r /opt/jdk* root@hadoop3:/opt
scp /etc/profile root@hadoop3:/etc
二、完全分布式部署
基于完全分布式模式部署Hadoop,需要将Hadoop中HDFS和YARN的相关服务运行在不同的计算机中,我们使用已经部署好的3台虚拟机Hadoop1、Hadoop2和Hadoop3。为了避免在使用过程中造成混淆,先规划HDFS和YARN的相关服务所运行的虚拟机。
虚拟机名 | 主机名 | IP | 角色 | 服务 |
---|---|---|---|---|
hadoop1 | hadoop1 | 192.168.121.160 | master | NameNode、ResourceManager |
hadoop2 | hadoop2 | 192.168.121.161 | workers | SecondaryNameNode、DataNode、NodeManager |
hadoop3 | hadoop3 | 192.168.121.162 | workers | DataNode、NodeManager |
1. 安装Hadoop
1)解压
以解压方式安装Hadoop,将Hadoop安装到虚拟机Hadoop1的/opt
目录。
tar -xvf /software/hadoop-3.3.6.tar.gz -C /opt
2)配置环境变量
在Hadoop1执行vi /etc/profile
命令配置系统环境变量,在该文件的底部添加如下内容。
export HADOOP\_HOME=/opt/hadoop-3.3.6
export PATH=$PATH:$HADOOP\_HOME/bin:$HADOOP\_HOME/sbin
3)验证
在虚拟机Hadoop1的任意目录执行hadoop version
命令查看当前虚拟机中Hadoop的版本号。
2. 修改配置文件
配置文件 | 功能描述 |
---|---|
hadoop-env.sh | 配置Hadoop运行时的环境,确保HDFS能够正常运行NameNode、SecondaryNameNode和DataNode服务 |
yarn-env.sh | 配置YARN运行时的环境,确保YARN能够正常运行ResourceManager和NodeManager服务 |
core-site.sh | Hadoop核心配置文件 |
hdfs-site.xml | HDFS核心配置文件 |
mapred-site.xml | MapReduce核心配置文件 |
yarn-site.xml | YARN核心配置文件 |
workers | 控制从节点所运行的服务器 |
1)配置Hadoop运行时环境
在Hadoop安装目录/etc/hadoop/目录,执行vi hadoop-env.sh
命令,在hadoop-env.sh文件的底部添加如下内容。
export JAVA\_HOME=/opt/jdk1.8.0_261
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
- 指定Hadoop使用的JDK
- 指定管理NameNode、DataNode等服务的用户为root
2)配置hadoop
在Hadoop安装目录/etc/hadoop/目录,执行vi core-site.xml
命令,在core-site.xml文件中添加如下内容。
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop-3.3.6</value>
</property>
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
注意:
- 上面的配置项要配置到
<configuration>
标签中,后面的配置项类似配置项:
- fs.defaultFS:指定HDFS的通信地址
- hadoop.tmp.dir:指定Hadoop临时数据的存储目录
- hadoop.http.staticuser.user:指定通过Web UI访问HDFS的用户root
- hadoop.proxyuser.root.hosts:允许任何服务器的root用户可以向Hadoop提交任务
- hadoop.proxyuser.root.groups:允许任何用户组的root用户可以向Hadoop提交任务
- fs.trash.interval:指定HDFS中被删除文件的存活时长为1440秒
更多参数请参考官网:https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-common/core-default.xml
3)配置HDFS
在Hadoop安装目录/etc/hadoop/目录,执行vi hdfs-site.xml
命令,在hdfs-site.xml文件中添加如下内容。
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2:9868</value>
</property>
配置项:
- dfs.replication:指定数据副本个数
- dfs.namenode.secondary.http-address:指定SecondaryNameNode服务的通信地址
更多参数请参考官网:https://hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
4)配置MapReduce
在Hadoop安装目录/etc/hadoop/目录,执行vi mapred-site.xml
命令,在mapred-site.xml文件中添加如下内容。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
配置项:
- mapreduce.framework.name:MapReduce的执行模式,默认是本地模式,另外可以设置成classic(采用MapReduce1.0模式运行) 或 yarn(基于YARN框架运行).
- mapreduce.job.ubertask.enable:是否允许开启uber模式,当开启后,小作业会在一个JVM上顺序运行,而不需要额外申请资源
- mapreduce.jobhistory.address:指定MapReduce历史服务的通信地址
- mapreduce.jobhistory.webapp.address:指定通过Web UI访问MapReduce历史服务的地址
- yarn.app.mapreduce.am.env:指定MapReduce任务的运行环境
- mapreduce.map.env:指定MapReduce任务中Map阶段的运行环境
- mapreduce.reduce.env:指定MapReduce任务中Reduce阶段的运行环境
更多参数请参考官网:https://hadoop.apache.org/docs/r3.3.6/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
5)配置YARN
在Hadoop安装目录/etc/hadoop/目录,执行vi yarn-site.xml
命令,在yarn-site.xml文件中添加如下内容。
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop1:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
配置项:
- yarn.resourcemanager.hostname:指定ResourceManager服务运行的主机
- yarn.nodemanager.aux-services:指定NodeManager运行的附属服务
- yarn.nodemanager.pmem-check-enabled:指定是否启动检测每个任务使用的物理内存
- yarn.nodemanager.vmem-check-enabled:指定是否启动检测每个任务使用的虚拟内存
- yarn.log-aggregation-enable:指定是否开启日志聚合功能
- yarn.log.server.url:指定日志聚合的服务器
- yarn.log-aggregation.retain-seconds:指定日志聚合后日志保存的时间
更多参数请参考官网:https://hadoop.apache.org/docs/r3.3.6/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
6)配置workers
在虚拟机Hadoop1的/opt/hadoop-3.3.6/etc/hadoop/
目录,执行vi workers
命令,将workers文件默认的内容修改为如下内容。
hadoop2
hadoop3
3. 同步文件
使用scp命令将虚拟机Hadoop1的Hadoop安装目录分发至虚拟机Hadoop2和Hadoop3中存放安装程序的目录。
scp -r /opt/hadoop-3.3.6 root@hadoop2:/opt
scp -r /opt/hadoop-3.3.6 root@hadoop3:/opt
scp /etc/profile root@hadoop2:/etc
scp /etc/profile root@hadoop3:/etc
4. 格式化
- 在基于伪分布式模式部署的Hadoop安装目录
/opt/pdch/hadoop-3.3.6
中,关闭基于伪分布式模式部署的Hadoop - 在虚拟机Hadoop1执行
hdfs namenode -format
命令,对基于完全分布式模式部署的Hadoop进行格式化HDFS文件系统的操作。
注意:格式化HDFS文件系统的操作只在初次启动Hadoop集群之前进行。
5. 启动
在虚拟机Hadoop1中执行命令启动Hadoop
start-dfs.sh
start-yarn.sh
6. 检测
1)jps查看进程
HDFS和YARN的相关服务运行在JVM进程中,可以执行jps
命令查看当前虚拟机中运行的JVM进程。
2)Web UI
① 在本地计算机的浏览器输入http://192.168.121.160:9870查看HDFS的运行状态。
② 在本地计算机的浏览器输入http://192.168.121.160:8088查看YARN的运行状态。
如果希望在本地计算机上使用 http://hadoop1:9870和http://hadoop1:8088查看Hadoop运行状态, 需要配置本机的hosts文件
C:\Windows\System32\drivers\etc\hosts
, 添加如下内容即可192.168.121.160 hadoop1 192.168.121.161 hadoop2 192.168.121.162 hadoop3
7. Hadoop启动服务总结
下面就Hadoop的服务启动进行简单的总结:
1)整体启动和关闭
start-all.sh
stop-all.sh
2)各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start namenode
hdfs --daemon start datanode
hdfs --daemon start secondarynamenode
hdfs --daemon stop namenode
hdfs --daemon stop datanode
hdfs --daemon stop secondarynamenode
(2)分别启动/停止YARN组件
yarn --daemon start resourcemanager
yarn --daemon start nodemanager
yarn --daemon stop resourcemanager
yarn --daemon stop nodemanager
3) 各个模块分开启动/停止
(1)整体启动/停止HDFS
start-dfs.sh
stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh
stop-yarn.sh
8. 常见错误及解决办法
1)出现command not found
错误
- 检查
/etc/profile
文件中是否配置了正确的PATH - 如果
/etc/profile
设置正确,是否没有执行source /etc/profile
使环境变量生效
2)所有命令都不能运行
如果你发现不止安装的程序命令,就连原系统的内置命令都使用不了(比如ls
、vi
、cat
等),很明显,你在修改/etc/profile
时,将PATH路径设置错了。最常见的是错误就是在设置PATH时,PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
,把$PATH:
漏掉了,这就相当于现在的PATH路径只有两个值$HADOOP_HOME/bin
和$HADOOP_HOME/sbin
。
解决办法:
1)恢复默认的PATH路径:
export PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
2)使用vi
命令修改/etc/profile
文件,检查设置PATH的地方是否漏掉了$PATH:
3)不小心多次格式化
多次格式化导致DataNode 与 NameNode namespaceID不一致,导致启动HDFS失败,这里告诉最直接暴力的解决办法:
首先清空$hadoop.tmp.dir这个目录,以本文为例:
stop-all.sh
#本教程配置的hadoop.tmp.dir目录为/home/xiaobai/opt/hadoop/tmp
rm -fr /opt/data/hadoop-3.3.6
然后重新格式化HDFS即可
4)NameNode启动不成功
- NameNode没有格式化
- 环境变量配置错误
- Ip和hostname绑定失败,需要通过
ip a
查看ip地址,重新配置/etc/hosts文件,设置正确的ip和hostname - hostname含有特殊符号如
.
(符号点),会被误解析
5)万能大法
一切的错误,最好的解决办法是查看日志
Hadoop的默认日志文件目录在$HADOOP_HOME/logs
三、案例——词频统计
WordCount示例是大数据计算里的”Hello World”, 它的功能是对输入文件的单词进行统计,输出每个单词的出现次数。
1. 准备数据
1)创建文本数据
在hadoop1上使用 vi /opt/data/word.txt命令编辑如下内容:
hello world
hello hadoop
hello hdfs
hello yarn
2)创建目录
在HDFS创建/wordcount/input目录,用于存放文件word.txt。
hdfs dfs -mkdir -p /wordcount/input
3)在虚拟机Hadoop1执行如下命令将文件word.txt上传到HDFS的/wordcount/input目录。
hdfs dfs -put /opt/data/word.txt /wordcount/input
4)查看文件是否上传成功
通过HDFS的Web UI查看文件word.txt是否上传成功。
2. 运行MapReduce程序
1)查看示例程序
进入虚拟机Hadoop1的/opt/hadoop-3.3.6/share/hadoop/mapreduce 目录,在该目录下执行“ll”命令,查看Hadoop提供的MapReduce程序。
2)执行程序
在MapReduce程序所在的目录执行下列命令,统计word.txt中每个单词出现的次数。
hadoop jar hadoop-mapreduce-examples-3.3.6.jar wordcount /wordcount/input /wordcount/output
- hadoop jar:用于指定运行的MapReduce程序;也可以使用yarn jar运行
- wordcount:表示程序名称;
- wordcount/input:表示文件word.txt所在目录;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
apreduce 目录,在该目录下执行“ll”命令,查看Hadoop提供的MapReduce程序。
2)执行程序
在MapReduce程序所在的目录执行下列命令,统计word.txt中每个单词出现的次数。
hadoop jar hadoop-mapreduce-examples-3.3.6.jar wordcount /wordcount/input /wordcount/output
- hadoop jar:用于指定运行的MapReduce程序;也可以使用yarn jar运行
- wordcount:表示程序名称;
- wordcount/input:表示文件word.txt所在目录;
[外链图片转存中…(img-gnllwa4W-1714328026615)]
[外链图片转存中…(img-wm1iLZmI-1714328026616)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!