完全分布式模式
集群配置
在配置Hadoop集群之前,需要准备若干台装有Linux系统的机器
所有节点机器需要完成
配置hosts文件
、SSH免密登录
,才可进行如下配置。
也就是说所有的机器对于所有机器都能免密登录(包括自己本身!!!)
需要对自己执行ssh-copy-id 自己的hosts别名
注意
注意命名规范,不要给机器起名为 hadoop
或 hadoop000
等特殊名称
集群部署规划
NameNode
和SecondaryNameNode
不要安装在同一台服务器ResourceManager
很耗内存,尽量不要和上面俩个服务器在同一台
testHadoop1 | testHadoop2 | testHadoop3 | |
---|---|---|---|
HDFS角色 | NameNode 和 DataNode | DataNode | SecondaryNameNode 和 DataNode |
YARN角色 | NodeManager | ResourceManager 和 NodeManager | NodeManager |
配置文件
Hadoop配置文件分为两类:默认配置文件和自定义配置文件,默认配置文件指的Hadoop自带的,且文件名带有 default
字样的配置文件。
例如:core-default.xml
、hdfs-default.xml
、yarn-default.xml
、mapred-default.xml
如果hadoop的版本是3.3.6,存放位置如下:
core-default.xml
:hadoop-common-3.3.6.jar/core-default.xmlhdfs-default.xml
:hadoop-hdfs-3.3.6.jar/hdfs-default.xmlyarn-default.xml
:hadoop-yarn-common-3.3.6.jar/yarn-default.xmlmapred-default.xml
:hadoop-mapreduce-client-core-3.3.6.jar/mapred-default.xml
只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值
例如:core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-site.xml
提示
Hadoop的生产环境包解压后的所有的配置文件都在 hadoop文件夹下的 etc/hadoop
目录下
下文的中文注释有可能会导致后续的报错,建议复制粘贴时删掉注释
记得将修改后的配置文件,分发给所有机器
修改core-site.xml
文件
将configuration
标签里的内容替换为如下内容,部分变量自行替换
<configuration>
<!-- 指定NameNode地址,端口除了8020之外还有9000和9820-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://主节点ip别名:8020</value>
</property>
<!-- 配置Hadoop 运行产生的临时数据存储目录,默认路径下的临时数据会在1个月后删除 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-版本号/data</value>
</property>
<!-- 配置操作HDFS 的缓存大小 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为root,不配置这个,后续无法在网页中删除数据 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
</configuration>
配置hdfs-site.xml
文件
将configuration
标签里的内容替换为如下内容,部分变量自行替换
<configuration>
<!-- 配置HDFS 块的副本数(全分布模式默认副本数是3,最大副本数是512) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 配置 NameNode 所在主机的 ip 和端口 -->
<property>
<name>dfs.namenode.http-address</name>
<value>主要节点ip别名:9870</value>
</property>
<!-- 配置 SecondaryNamenode 所在主机的 ip 和端口-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>次要节点ip别名:9868</value>
</property>
</configuration>
配置yarn-site.xml
文件
将configuration
标签里的内容替换为如下内容,部分变量自行替换
<configuration>
<!-- 指定启动YARN的 ResourceManager 服务的主机 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>主节点名</value>
</property>
<!-- 配置NodeManager 启动时加载Shuffle 服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 环境变量的继承,这里比他默认的多了一个 HADOOP_MAPRED_HOME,某些版本的Hadoop可能存在bug -->
<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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
配置mapred-site.xml
文件
目录下只存在该文件的模板文件,所以需要将模板复制一份并重命名,才能使配置生效
cp mapred-site.xml.template mapred-site.xml
修改mapred-site.xml
文件
将configuration
标签里的内容替换为如下内容,部分变量自行替换
<configuration>
<!-- 指定 MapReduce 程序的运行框架是Yarn -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改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
群起集群
配置workers
在 $HADOOP_HOME/etc/hadoop/workers
文件中增加所有服务器的别名
例如新增如下内容
testHadoop1
testHadoop2
testHadoop3
注意
该文件中添加的内容结尾不允许有空格,文件中不允许有空行
这个配置需要给集群中的所有节点机器都配置上
Hadoop 2.x版本中,该配置文件的名字为 slaves
启动
如果集群是第一次启动,需要在 testHadoop1
节点格式化 NameNode
注意
格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。
格式化文件系统
初次启动HDFS集群时,必须对主节点进行格式化处理
hdfs namenode -format
或
hadoop namenode -format
两条命令选择一条执行一次即可,后续使用不需要执行
执行后若看到 has been successfully formatted
信息,则代表格式化成功,若没看到,则需要检查自己的配置
初始化成功后,可以查看生成的 $HADOOP_HOME/data/dfs/name/current/VERSION
文件,里面有相关信息
启动和关闭
在HDFS NameNode 主节点上,启动hdfs
start-dfs.sh
在YARN ResourceManager 主节点上,启动yarn
start-yarn.sh
如果想关闭,则分别在启动时的机器输入以下命令
stop-dfs.sh
stop-yarn.sh
查看进程
集群启动后,分别在主从节点上输入如下命令,如果Hadoop进程都启动了,则代表集群搭建成功
jps
解决节点无法启动
去查看 $HADOOP_HOME/logs
里面对应节点的启动日志,查看其中报错信息,然后解决即可
查看web页面
为了方便访问,建议在宿主机上的hosts文件添加主从节点的IP映射
Windows的hosts文件参考路径:
C:\Windows\System32\drivers\etc\hosts
分别访问主节点的9870
和8088
端口,查看 HDFS集群 和 YARN集群 状态
使用集群
在hdfs主节点机器上的 hdfs文件系统的根目录 创建文件夹 wcinput
hadoop fs -mkdir /wcinput
在主节点系统上新建一个word.txt
文件,在文件内随意写上一些内容,然后上传到hdfs文件系统的根目录/
下
hdfs dfs -put word.txt /wcinput
或
hadoop fs -put word.txt /wcinput
查看上传的word.txt
文件内容,因为是在hdfs文件系统的根目录下,所以文件名前面需要加上/
hdfs dfs -cat /wcinput/word.txt
下载远程文件到当前目录
hadoop -get /wcinput/word.txt ./
也可以通过web页面下载文件
操作hdfs存储系统内的文件
我现在想用刚才上传上去的 word.txt
文件,进行 wordcount
操作,并把结果值直接输出在hdfs存储系统中
假设当前所在系统路径是 $HADOOP_HOME
,执行如下命令
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /wcinput /wcoutput
注意
运行时,查看 YARN的网页,可以发现正在运行一个任务
运行后查看hdfs存储系统中的根目录,可以发现出现了 wcoutput
文件夹,点进去,可以看到相关信息
运行后,YARN的网页,可以发现任务执行完毕了,但是该条目的 History
是不可用的,因为我们还没配置 历史服务器
重启电脑,可以发现,这个任务的执行情况消失了,而我们想要的效果是,可以查看到对应的历史执行情况
注意这个问题,后续会配置
文件存储原理
文件上传到 HDFS存储系统 之后,网页只是用来展示的,实际上文件的存储位置是 DataNode节点
而DataNode节点里的数据又保存在 $HADOOP_HOME/data
中
因为最开始在配置 core-site.xml
时,我们配置了一个 name
值为 hadoop.tmp.dir
的 property
通过手动更改配置,覆盖了默认值
实际的内容是保存在 $HADOOP_HOME/data/dfs/data/current/BP文件夹/current/finalized/subdir0/subdir0
下
大文件的话,是进行了拆分之后,分片保存的,这里在HDFS的详解中会提到
hdfs有着高可用的特性,例如三台机器挂了一个,另外的两台机器也能正常工作。
从网页上也能看出来,刚才的上传的文件的Replication(备份)值有3个。进行测试,发现其他两台机器上的该目录下也有同样的内容
集群崩溃处理
例如,某员工失误,杀死了主节点机器的 DataNode
进程,而且误删了hadoop根路径下的data文件夹
如果这个时候想要通过重新启动来恢复DataNode,可以通过 jps
命令发现,NameNode
并没有启动,因为 $HADOOP_HOME/data
文件夹中的 name
文件夹被删掉了
这个时候最好的处理办法就是删除掉 $HADOOP_HOME/data
和 $HADOOP_HOME/logs
文件夹,然后重新使用 hdfs namenode -format
命令格式化
但是!新格式化出来的版本号和其他机器的版本号不一致!
所以,这里只能删除所有机器的 data文件夹
和 logs文件夹
,统一执行格式化命令
服务器组件单独启动或停止
hdfs --daemon start/stop namenode/secondarynamenode/datanode
yarn --ademon start/stop resourcemanager/nodemanager
配置 历史服务器
这里需要配置 $HADOOP_HOME/etc/hadoop/mapred-site.xml
文件
在配置文件中新增如下内容,别忘了中文注释可能会导致报错
下面的服务器ip指的是 哪个服务器将被当作历史服务器,注意写的是别名
<!-- 历史服务器 地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>服务器ip别名:10020</value>
</property>
<!-- 历史服务器 web页面,地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>服务器ip别名:19888</value>
</property>
配置完毕后记得分发到其他机器上
我这里的例子使用的是 testHadoop1
服务器作为历史服务器
需要在这台服务器上,使用如下命令手动启动历史服务器
mapred --daemon start historyserver
注意
- 启动历史服务器之前,需要先启动YARN
mapred
命令在$HADOOP_HOME/bin
目录下
启动后,可以通过 jps
命令查看进程
成功之后,访问 http://历史服务器ip:19888/jobhistory
我这里应该访问:http://testhadoop1:19888/jobhistory
再次使用wordcount示例远程解析文件,完成后,在 YARN的8088页面,点击条目的 History
,发现可以成功的跳转页面了
关闭命令如下所示
mapred --daemon stop historyserver
配置 日志聚集
配置完历史服务器,点击条目的 History
可以成功的跳转页面了
但是跳转后,点击页面中的 logs
,可以发现这个是失效的,提示该功能未被开启
日志聚集概念:应用运行完成后,将程序运行日志信息上传到HDFS系统上
也就是说,每台机器的 log 都会被聚集到 HDFS 中,然后用户通过 HDFS 查看 log
需要对 yarn-site.xml
文件新增内容
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://历史服务器ip:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间 7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
配置完毕后记得分发到其他机器上
分发后,先关闭历史服务器,再关闭YARN。然后先启动YARN,再启动历史服务器
再次执行任务。执行后,可以发现点击logs后,里面的内容出现了
集群时间同步
如果服务器在公网环境下,可以不采取集群时间同步,因为服务器会定期向公网的时间进行校准
如果服务器在内网环境下,必须要配置集群时间同步,否则时间久了会产生时间偏差,导致集群执行任务时间不同步
这里讨论一下内网环境如何做
如果内网中的机器时间不同步,最简单的方法是,所有的机器都以一个 时间服务器
为基准,进行同步
这里的 时间服务器
不需要单独启动一个服务器,直接选一个服务器的时间作为基准就好
配置 时间服务器(必须是root用户)
注意
这里没写全
有的人喜欢用 ntp
,但是CentOS7中,自带的是 chrony
通过如下命令即可看出来
# 查看ntp
systemctl status ntpd
# 查看chrony
systemctl status chronyd
相关博客:
- https://blog.csdn.net/cyt0906/article/details/107310159
- https://blog.csdn.net/xinle0320/article/details/124232910
- https://zhuanlan.zhihu.com/p/156757418
- https://blog.csdn.net/allway2/article/details/103855380
- https://zhuanlan.zhihu.com/p/497656133
常用脚本
这里可以配置两个shell脚本
- 集群启动和关闭
一个脚本内,按照顺序,启动hdfs、yarn和historymanager
原理:通过ssh免密登录,进入之后启动,再退出 - 全部jps
将其他机器的jps结果全部展示出来
原理:遍历hosts,通过免密登录输入jps,展示结果
常用端口(面试可能问)
端口名称 | Hadoop 2.x版本 | Hadoop 3.x版本 |
---|---|---|
NameNode 内部通信端口 | 8020/9000 | 8020/9000/9820 |
NameNode Http UI端口 | 50070 | 9870 |
YARN 查看执行任务端口 | 8088 | 8088 |
历史服务器 通信端口 | 19888 | 19888 |
常见问题及解决方案
无法连接ResourceManager
查看防火墙是否关闭,是否启动了YARN集群
无法连接本机(Permission Denied)
查看是否可以免密登录自己,是否在 /etc/hosts
文件中配置了自己
DataNode 和 NameNode 不能同时在一台机器上工作
- NameNode 在使用
hdfs namenode -format
格式化之后,会在$HADOOP_HOME/data/dfs
里面的name/current
文件夹中生成一个 VERSION,里面有一个clusterID
- DataNode 在启动后会在
$HADOOP_HOME/data/dfs
里面的data/current
文件夹中生成一个 VERSION,里面也有一个clusterID
,正常情况下,这个clusterID
应该和 NameNode 的clusterID
是一样的 - 原因可能是:不经意间再次格式化了 NameNode,生成的新
clusterID
与 DataNode 中的clusterID
不一样 - 解决办法:删除所有机器的
$HADOOP_HOME/data
(没有这个文件夹的话,查看默认位置是否存在,默认在系统根路径/tmp
里面) 与$HADOOP_HOME/logs
文件夹,重新格式化生成
jps发现没有进程,但是重新启动集群时提示进程已经开启
Linux 根路径下 /tmp
中存在启动的进程临时文件,将相关进程文件删除掉,重新启动集群即可
8088端口连接不上(部分人存在该问题)
编辑 /etc/hosts
文件,注释掉下面两句话,如下所示
# 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
# ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
注意事项
- 集群的启动,需要统一用户,例如A服务器启动HDFS的用户是root,B服务器就不要再用其他用户启动YARN了
- 复制粘贴配置文件后,检查一遍是否符合自己的需求