集群节点布置方案
我会按照以上表格的表格进行集群节点的布置。
关于以上的节点是什么意义,请看第一篇所讲的基础内容,这里只做简单的说明:
HDFS层面
DataNode:具体的存储节点
NameNode:可理解为管理整个存储的目录,也就是哪个文件存到了具体的哪个DataNode上
SecondaryNameNode:对NameNode的备份,防止挂掉
Yarn层面
NodeManager:具体的资源管理节点
ResourceManager:总的资源管理节点
最后再强调一点内容,就是标红色的节点不能布置到同一台服务器上,因为红色的节点相对耗费资源,所以通常都会分开到不同的服务器进行布置。
有了以上的的说明,下面我们只需要按照表格进行集群的配置就行了。
配置文件
关于HDFS,Yarn以及其他任何的配置,都是在hadoop下的etc文件下进行管理,这里有所有的配置文件
HDFS的配置
按照最开始的表格,分配节点。
核心文件的配置:core-site.xml
打开core-site.xml,修改为:
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name> fs.defaultFS</name>
<value>hdfs://hadoop100:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name> hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.2.2/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为leon -->
<property>
<name> hadoop.http.staticuser.user</name>
<value>leon</value>
</property>
</configuration>
下面做个简单说明:
fs.defaultFS是作为hdfs内部的通讯地址为hadoop100:8020,而不是我们网页的通信地址
hadoop.tmp.dir:指定文件存储位置为/opt/module/hadoop-3.2.2/data, 这个data文件夹是我们具体存储数据的地方,目前这个data文件夹还没有建立,也不需要我们自己建立,等我们利用初始化命令时,就会自从创建。
**hadoop.http.staticuser.user:**当我们访问hdfs网页时,默认是用leon用户登录,当然你的是什么用户,你就设置什么用户。
hdfs-site.xml配置
打开hdfs-site.xml,修改为:
<configuration>
<!-- nn web 端访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
<!-- 2nn web端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop99:9868</value>
</property>
</configuration>
下面做个简单说明:
dfs.namenode.http-address:这里其实已经就是指定了namenode节点布置在hadoop100服务器上,并且设置了网页访问端口为9870
dfs.namenode.secondary.http-address:指定了SecondaryNameNode是在hadoop99服务器上,并提供了网页访问端口为9868.
到这里hdfs已经设置完毕了,可能有人会问为什么没有设置DataNode,你可以认为DataNode是默认所有服务器都要有的,所以并不需要指定。这里有一个问题埋下,那就是既让DataNode要在所有服务器上布置,那系统又是如何知道这所有的服务器到底有多少台?是哪几台呢?
Yarn的配置
同样也是按照最开始的表格,分配节点。
yarn-site.xml文件配置
打开yarn-site.xml,修改为:
<!-- Site specific YARN configuration properties -->
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop98</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>
下面做个简单说明:
**yarn.nodemanager.aux-services:**指定MR走shuffle
**yarn.resourcemanager.hostname:**指定ResourceManager节点布置在hadoop98,
**yarn.nodemanager.env-whitelist:**指定一系列环境变量
至于为什么没有配置NodeManager,其实和DataNode节点的问题是一样的,因为真个集群上的所有服务器都要配置,所以并不需要指定,只是有和DataNode同样的疑问?如何知道所有的服务器。
注:以上并没有设置yarn的网页访问地址,但是其实是有的,默认为8088
MapReduce的配置
mapred-site.xml文件配置
打开mapred-site.xml,修改为:
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
下面做个简单说明:
**mapreduce.framework.name:**这里其实及时指定mapreduce是建立在yarn之上,是通过yarn进行具体的计算分配和控制。
works配置
遗留问题的陈述和解决
在hdfs和 yarn的配置中,关于DataNode和NodeManager,虽然不用特意配置,因为它是默认要布置到所有服务器上的,但是一个集群到底有几台服务器呢?3台?五台?,如果是3台,是哪三台呢?
所以虽然不指定DataNode和NodeManager的布置位置,但是一定要指定这个集群包含那几台服务器。
workers文件配置
打开workers文件,修改为:
hadoop100
hadoop99
hadoop98
只要在这里指定集群包含那几台服务器,就解决以上遗留的问题了。
集群初始化
遗留问题陈述和解决
在之前配置hdfs时,指定了具体的文件存储在data文件夹中,但是这个文件夹之前是没有的,在之前我说,是不用我们自己创立的,所以这里的初始化就是解决创建data文件夹的问题。
在hadoop100上运行初始化
hdfs namenode format
初始化结束后,会自动创建data文件夹和logs文件夹,
历史服务器配置
首先说明一下,最开始我们表格中只有hdfs和yarn,我们在集群的配置中,其实配置那两个也就够了。
为什么还要配置历史服务器呢,其实就是为了问题出现时,能够从历史服务器中找到问题所在。
mapred-site.xml文件配置
打开mapred-site.xml,添加如下内容:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop100:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>
下面做个简单说明:
mapreduce.jobhistory.address:指定历史服务器的内部通信地址为hadoop100:10020
mapreduce.jobhistory.webapp.address:指定历史服务器的网页通信地址为hadoop100:19888,以后就可以登录这个地址,在网页上查看历史信息,
或者你也可以在yarn的网页上进行访问,当我们每提交一个任务时,运行完成后就会看到历史的按钮
**问题:**假如我们运行时出现错误,这时候我们已经配置了历史服务器,所以就可以打开历史服务器的地址,去查看问题所在,但是这时候,我们只是配置了历史服务器,但是这些错误是要在运行日志中的,这些日志是在每一台服务器中产生的,我们要能查看到这些日志,就需要对这些日志进行收集,然后才能进行查看。
日志的据集配置
yarn-site.xml文件配置
打开yarn-site.xml,添加如下内容:
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址-->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop100:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
下面做个简单说明:
yarn.log-aggregation-enable:开启日志聚集功能
yarn.log.server.url:设置日志聚集服务器地址为/hadoop100:19888/jobhistory/logs,以后就可以用在这地址,在网页上查看到日志
文件同步
以上几个小节,所有的配置都是在hadoop100上完成,我们需要同步到其他的两台服务器上,利用hadoop集群部署之ssh免密登录安装(二)中讲的同步分发文件进行同步到其他两台服务器
xsync /opt/module/hadoop-3.2.2
集群启动
以上已经对配置文件做了修改,也已经同步到集群内的所有服务器上,所以下面就是如何启动了。
所有关于集群的启停命令,都是在hadoop下的sbin文件夹下
1.启动hdfs(你NameNode布置在哪一台服务器上,就在哪个服务器上启动,我这里是hadoop100)
leon@hadoop100:/opt/module/hadoop-3.2.2/sbin$ start-dfs.sh
2.启动yarn(你ResourceManager布置在哪一台服务器上,就在哪个服务器上启动,我这里是hadoop98)
leon@hadoop98:/opt/module/hadoop-3.2.2/sbin$ start-yarn.sh
3.启动历史服务(通常在NameNode配置的服务器上进行启动)
leon@hadoop100:/opt/module/hadoop-3.2.2/sbin$ mapred --daemon start historyserver
这样真个集群就启动起来了,就已经可以使用啦。
问题补充
停止命令
1.hdfs的服务停止
dfs.sh/stop dfs.sh
2.yarn服务停止
yarn.sh/stop yarn.sh
3.历史服务器停止
mapred --daemon stop historyserver
又是并不需要整个集群进行启停,这个浪费时间,因为有时会出现某个服务器上的某个节点崩溃,那我们只需要跳转到具体服务器,启动具体的(hdfs或者yarn)节点。
4.分别启停HDFS组件
hdfs daemon start/stop namenode/datanode/secondarynamenode
4.分别启停Yarn组件
yarn daemon start/stop resourcemanager/nodemanager
编写启停脚本
前面讲的,需要每条指令输入进行启停控制,为了方便,这里写一个脚本,方便运行,以后就只需要运行一个脚本,就实现所有服务的启停。
将文件myhadoop放到之前xsync的同一个目录(/home/bin/)
echo " ========================================= 启动hadoop集群 ================================================"
echo "--------------------------------------------- 启动hdfs -------------------------------------------------"
ssh hadoop100 "/opt/module/hadoop-3.2.2/sbin/start-dfs.sh"
echo "------------------------------------------- 启动yarn ------------------------------------------------------"
ssh hadoop98 "/opt/module/hadoop-3.2.2/sbin/start-yarn.sh"
echo "------------------------------------- 启动historyserver ------------------------------------------------------"
ssh hadoop100 "/opt/module/hadoop-3.2.2/bin/mapred --daemon start historyserver"
;;
"stop")
echo " ========================================= 关闭hadoop集群 ================================================"
echo "----------------------------------------- 关闭historyserver ---------------------------------------------"
ssh hadoop100 "/opt/module/hadoop-3.2.2/bin/mapred --daemon stop historyserver"
echo "------------------------------------------- 关闭yarn ------------------------------------------------------"
ssh hadoop98 "/opt/module/hadoop-3.2.2/sbin/stop-yarn.sh"
echo "------------------------------------- 关闭hdfs ------------------------------------------------------"
ssh hadoop100 "/opt/module/hadoop-3.2.2/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
以上脚本不做过多的陈述,就是将所有的指令放到一个文件中,以后:
启动真个集群服务myhadoop start
停止真个集群服务myhadoop stop
JAVA_HOME未找到
这个问题有的人会出现,有的人不会出现,如果出现了,那就修改etc文件夹下的hadoop-env.sh文件,添加一行
export JAVA_HOME=/opt/module/jdk1.8.0_301
这样问题就解决了。
关于hadoop的集群配置就到这里了,当然对于hadoop生态来说,这只是基础,后续的hive,spark都是在这个基础上建立的,后面再慢慢记录。