• 1 集群规划
  • 1.1 虚拟机规划
  • 1.2 扩展
  • 2 Hadoop配置文件说明
  • 3 集群配置
  • 3.1 hadoop_env.sh配置
  • 3.2 核心文件配置
  • 3.2.1 core-site.xml配置
  • 3.2.1.1 一般配置项
  • 3.2.1.2 兼容配置项
  • 3.2.2 hdfs-site.xml配置
  • 3.2.2.1 一般配置
  • 3.2.2.2 兼容配置
  • 3.2.3 yarn-site.xml配置
  • 3.2.4 mapred-site.xml
  • 3.3 yarn历史服务器配置
  • 3.4 日志聚集配置
  • 3.4.1 概念
  • 3.4.2 配置
  • 3.4.3 测试
  • 3.5 时间同步配置
  • 3.5.1 时间服务器配置(在选定的时间服务器上配置,本文选择为hadoop102)
  • 3.5.2 其他服务器配置(不是选定的时间服务器的其他服务器)
  • 4 集群测试
  • 4.1 集群单点启动
  • 4.2 群启集群
  • 4.3集群管理脚本
  • 4.3.1 集群的启动与停止管理脚本:`mycluster.sh`
  • 4.3.2 查看各个机器的进程脚本:`myjps.sh`
  • 4.4 Hdfs测试
  • 4.5 yarn测试
  • 5 重复格式化的问题


1 集群规划

1.1 虚拟机规划

hadoop的集群配置 hadoop集群配置和测试_hadoop的集群配置

1.2 扩展

2 Hadoop配置文件说明

详解Hadoop六个配置文件的作用

3 集群配置

3.1 hadoop_env.sh配置

  • JAVA_HOME配置,对于hadoop2.x是需要配置,但是对于hadoop3.x可以不配置,但是保险起见也可配置

    路径hadoop安装目录/etc/hadoop
  • hadoop的集群配置 hadoop集群配置和测试_linux_02

  • 可以使用/JAVA_HOME进行查找,如上,然后解开注释,放入路径
  • hadoop的集群配置 hadoop集群配置和测试_大数据_03


3.2 核心文件配置

3.2.1 core-site.xml配置

配置项必须在configuration标签中

hadoop的集群配置 hadoop集群配置和测试_大数据_04

3.2.1.1 一般配置项
<!-- 指定Hadoop所使用的文件系统schema(URI),
     也就是NameNode的地址 -->
<!-- 此处hadoop102是根据上述结构配置,具体改成个人的,但是必须
做主机名映射 -->
<property>
 <name>fs.defaultFS</name>
 <value>hdfs://hadoop102:8020</value>
</property>

<!-- 指定Hadoop运行是产生文件的存储目录 -->
<!-- 官方配置文件中的配置项是hadoop.tmp.dir,用来指定hadoop数据的存储
     目录 -->
<!--  此次配置用的hadoop.data.dir是自己定义的变量,因为在 hdfs-site.xml中会
使用此配置的值来具体指定namenode和 datanode.存储
数据的目录-->
<property>
 <name>hadoop.data.dir</name>
 <value>/opt/module/hadoop-3.1.3/data</value>
</property>

注意:这里自定义的/opt/module/hadoop-3.1.3/data目录是不需要手动创建的,还有以下配置中跟这个路径相关的一些新的目录也是不需要手动创建的,因为最后的格式化过程会自动创建

3.2.1.2 兼容配置项
<!--下面是兼容性配置-->
<!--配置该cxj(superUser)允许通过代理访问的主机节点-->
<property>
  <name>hadoop.proxyuser.cxj.hosts</name>
  <value>*</value>
</property>
<!--配置该cxj( superuser)允许代理的用户所属组-->
<property>
  <name>hadoop.proxyuser.cxj.groups</name>
  <value>*</value>
</property>
<!--配置该atguigu ( superuser)允许代理的用户-->
<property>
  <name>hadoop.proxyuser.cxj.users</name>
  <value>*</value>
</property>

以上全放到confiuration即可

hadoop的集群配置 hadoop集群配置和测试_linux_05

3.2.2 hdfs-site.xml配置
3.2.2.1 一般配置
<!--指定HDFS副本的数量,不修改默认为3个-->
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>

<!--指定NameNode数据的存储目录,hadoop.data.dir为core-site.xml配置
    的项,这里自行定制修改-->
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file://${hadoop.data.dir}/name</value>
</property>

<!--指定Datanode数据的存储目录-->
<property>
  <name>dfs.datanode.data.dir</name>
  <value>file://${hadoop.data.dir}/data</value>
</property>

<!--指定SecondaryNameNode数据的存储目录-->
<property>
  <name>dfs.namenode.checkpoint.dir</name>
  <value>file://${hadoop.data.dir}/namesecondary</value>
</property>
3.2.2.2 兼容配置
<!--兼容配置-->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30s</value>'
</property>

<!-- 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>
3.2.3 yarn-site.xml配置
<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>
<!-- 取消虚拟内存的限制-->
<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
</property>
3.2.4 mapred-site.xml
<!-- 指定MapReduce运行是框架,这里指定在yarn上,默认是local -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>

上述配置完毕以后,一台服务器的配置就已经完毕了,接下来可以使用自定义的脚本xsync进行集群资源的同步,进入到hadoop安装目录下的etc文件使用命令:

xsync hadoop

xsync脚本在次:简化同步脚本

hadoop的集群配置 hadoop集群配置和测试_服务器_06

3.3 yarn历史服务器配置

历史服务器的作用是可以查看服务器的历史的状态,例如每一次进行mapreduce的都会在hadoop的管理界面看到每一次的运行信息,但是重启后这些信息就会消失,配置历史服务器就能找回这些信息,如下信息可以在上文中配置的hadoop103:8088的地址可以查看到如下的页面

hadoop的集群配置 hadoop集群配置和测试_hadoop_07


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>

每个服务器都需要配置,这里可使用自定一个的分发脚本xsync

xsync mapred-site.xml

历史服务器启动

mapred --daemon start historyserver

通过jps可以查看

hadoop的集群配置 hadoop集群配置和测试_hadoop的集群配置_08


可以通过配置的web访问地址hadoop102:19888进行访问

hadoop的集群配置 hadoop集群配置和测试_hadoop_09

3.4 日志聚集配置

3.4.1 概念

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上
日志聚集好处:可以方便的查看到程序运行详情,方便开发调试

3.4.2 配置

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>
<!--日志保留时间-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
3.4.3 测试

打开历史服务器的管理页面,本次配置的是hadoop102:19888,再点击具体的任务ID

hadoop的集群配置 hadoop集群配置和测试_大数据_10


hadoop的集群配置 hadoop集群配置和测试_hadoop的集群配置_11


hadoop的集群配置 hadoop集群配置和测试_大数据_12

3.5 时间同步配置

3.5.1 时间服务器配置(在选定的时间服务器上配置,本文选择为hadoop102)

注意要使用root用户权限

在所有的节点关闭ntp服务和自启动

#服务关闭
sudo systemctl stop ntpd

#服务状态查看
sudo systemctl status  ntpd

#关闭自启动
sudo systemctl disable ntpd

#自启动状态查看
sudo systemctl is-enabled  ntpd

在自定义时间服务器上修改ntp文件,时间服务器自主选择,被选择的服务器,对于其他服务器都以它为基准进行时间同步

vim /etc/ntp.conf

修改1:解开一下注释,并修改为自己的网段(例如以下截图表示授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)

hadoop的集群配置 hadoop集群配置和测试_hadoop_13


hadoop的集群配置 hadoop集群配置和测试_hadoop_14


修改2:配置集群在局域网内,不使用互联网时间

hadoop的集群配置 hadoop集群配置和测试_linux_15


hadoop的集群配置 hadoop集群配置和测试_大数据_16


修改3:添加一下内容,当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步

server 127.127.1.0
fudge 127.127.1.0 stratum 10

/etc/sysconfig/ntpd文件修改:增加以下内容,让硬件时间和系统时间同步

SYNC_HWCLOCK=yes

hadoop的集群配置 hadoop集群配置和测试_hadoop_17


重启ntp服务和设置自启动

#服务关闭
sudo systemctl start ntpd

#服务状态查看
sudo systemctl status  ntpd

#关闭自启动
sudo systemctl enable ntpd

#自启动状态查看
sudo systemctl is-enabled  ntpd
3.5.2 其他服务器配置(不是选定的时间服务器的其他服务器)

在其他机器配置1分钟与时间服务器同步一次(这里时间看具体情况配置)

#创建定时任务
sudo crontab -e

#添加以下脚本
*/1 * * * * /usr/sbin/ntpdate hadoop102

#任务查看
sudo crontab -l

#测试:修改当前时间并等待
sudo date -s "2011-1-1 01:01:01"

#查看时间
date

注意:除了时间服务器以外,都不要开启ntp服务器

4 集群测试

4.1 集群单点启动

1) 如果集群是第一次启动, 需要格式化NameNode,生成一些目录结构以及一下元数据文件。命令启动在NameNode配置的机器上,本次就是在hadoop102主机

hdfs namenode -format

2)hadoop102(配置NameNode的主机)上启动NameNode

hdfs --daemon start namenode

3) 完成后执行jps命令,看到如下结果(进程号可能不同)

2880 NameNode
2951 Jps

4) 在其他的DataNode都执行以下命令,我这里是hadoop102hadoop103hadoop104

hdfs --daemon start datanode

5)hadoop104启动secondarynamenode(这里在哪个开启就要看自己预先的规划)

hdfs --daemon start secondarynamenode

6)hadoop103启动``(这里在哪个开启就要看自己预先的规划)

yarn --daemon start resourcemanager

7)hadoop102hadoop103hadoop104都启动nodemanager

yarn --daemon start nodemanager
  1. 以上都可以通过jps进行查看
  2. 单点启动就是一个个启动,比较麻烦且低效

8) 浏览器访问就可以用到上边配置的端口,例如访问namenode,就用到配置的9870端口,配置参照上边,上述配置的是:hadoop102:9870,那就是hadoop102的地址加9870端口即可

hadoop的集群配置 hadoop集群配置和测试_大数据_18

通过该页面可以查看相应的datanode的配置等信息

9) 其他使用的是默认端口
resourcemanager8088(本次部署在hadoop103上)

4.2 群启集群

问题:上述是单点启动,一个个启动比较麻烦

解决:群启集群主要是使用的是hadoop安装目录下的sbin目录下的start-dfs.shstart-yarn.sh两个脚本

基于两个脚本,是启动我们配置的项,在上文中,配置了namenodesecondarynamenode,对于datanodenodemanager是没有配置的,所以如果需要让脚本识别并启动二者还需要自行配置

注意workers文件其实是hadoop2.xslaves文件,二者配置是一样的

过程

hadoop安装目录下>etc/hadoop>workers文件,初始如下

hadoop的集群配置 hadoop集群配置和测试_hadoop的集群配置_19


localhost删除,然后将需要配置启动namenodesecondarynamenode的服务器的ip地址主机名放在这里,每个独占一行,如下,保存退出

hadoop的集群配置 hadoop集群配置和测试_hadoop的集群配置_20


workers文件所在的目录,通过自定义的xsync脚本进行集群分发

xsync workers

xsync脚本如下链接的简化脚本测试部分
Hadoop学习3:Hadoop3.1.3本地模式测试以及完全分布模式测试
命令使用

# 在配置namenode的服务器上使用start-dfs.sh,这里是hadoop102,随意位置输入,已经配置了环境变量
start-dfs.sh

# 在配置resourcemanager的服务器上使用start-dfs.sh
start-yarn.sh

# 相应内容的关闭
stop-dfs.sh
stop-yarn.sh

4.3集群管理脚本

4.3.1 集群的启动与停止管理脚本:mycluster.sh
#!/bin/bash
if [ $# -lt 1 ]
        then echo "无可用参数,请输入start或stop"
        exit
fi

BASE="/opt/module/hadoop-3.1.3"

case $1 in

start)
        echo "==========hadoop102正在启动dfs========="
        ssh hadoop102 "$BASE/sbin/start-dfs.sh"

        echo "==========hadoop102正在启动历史服务器========="
        ssh hadoop102 "$BASE/bin/mapred --daemon start historyserver"

        echo "==========hadoop103正在启动yarn========="
        ssh hadoop103 "$BASE/sbin/start-yarn.sh"
;;
stop)
        echo "==========hadoop102正在关闭dfs========="
        ssh hadoop102 "$BASE/sbin/stop-dfs.sh"

        echo "==========hadoop102正在关闭历史服务器========="
        ssh hadoop102 "$BASE/bin/mapred --daemon stop historyserver"

        echo "==========hadoop103正在关闭yarn========="
        ssh hadoop103 "$BASE/sbin/stop-yarn.sh"
;;
*)
        echo "参数错误,应为start/stop"
esac

自带的start-all.sh也是可以启动,但是并不能启动resourcemanager,需要手动启动

4.3.2 查看各个机器的进程脚本:myjps.sh
for host in hadoop102 hadoop103 hadoop104
do
	echo "===============$host================="
	# 这里写的是完整的jps的路径,防止环境出现的问题
	# 一般也可以省略前边的路径
	# ssh $host "jps"
	ssh $host "/opt/module/java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64/bin/jps"
done

4.4 Hdfs测试

hdfs文件夹创建

hadoop fs -mkdir /input   #这种方式需要保证上级目录存在
hadoop fs -mkdir -p /input  #递归创建
  1. 这里创建的是在hdfs自主管理的文件目录下的,创建的文件/input表示是在根目录瞎创建的文件夹,这里必须加上具体的路径,例如/input/
  2. /input是 相对于hdfs上配置的路径,实际路径是结合上文配置的参数,完整为: hdfs://hadoop102:8020/input

hdfs`文件上传

hadoop fs -put 要上传的文件地址 hdfs目录的地址
#hadoop fs -put test.txt /input

1.要上传的文件地址,是在本地服务器文件的地址
2.hdfs目录的地址是相对于hdfs的目录地址,例如上述的hdfshdfs的文件目录是自主管理的,并没有在本地服务器创建实际的目录,而是以另外一种结构形式存储,记录着目录的结构以及文件之间的关系

通过上文配置的web端配置的端口以及地址:hadoop102ip地址:9870,具体看个人配置,可以查看到具体创建的目录和文件

hadoop的集群配置 hadoop集群配置和测试_大数据_21


点击进具体的目录可以看到上传的文件

hadoop的集群配置 hadoop集群配置和测试_服务器_22


可以看到其中一个字段Block Size,表示块的大小,默认的块大小如下为128M,例如对于一个129M的文件,那么就会被分成128M1M两个数据块,具体的数据块存储在个人配置的一个datanode的存储目录下

hadoop的集群配置 hadoop集群配置和测试_hadoop_23


点击上述文件的文件名,可以看到以下信息,他可以看到拆分的文件块Block0,并且以下显示了三个服务器的主机名,这里就是我个人配置的三个datanode,对于这个文件就会存在三个副本

hadoop的集群配置 hadoop集群配置和测试_大数据_24

4.5 yarn测试

这里主要是官方测试用例中的wordcount实例,与之前不同的是,输入和输出目录使用的是hdfs上的存储

#hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /aoutput 
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount 输入目录 输出目录

问题Hadoop学习问题1:Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

注意:输入目录和输出目录是hdfs上的路径并且输出的目录不能存在

通过配置的yarnweb观察页面:hadoop103ip地址:8088,可以看到分发的任务

hadoop的集群配置 hadoop集群配置和测试_hadoop_07


然后在hdfs的管理页面上也可以看到对应的生成目录和文件

hadoop的集群配置 hadoop集群配置和测试_linux_26

5 重复格式化的问题

问题hdfs格式化命令第一次启动的时候进行格式化即可,后续如果重复格式化会出现datanode启动失败的问题
原因:上边的配置中指定了hdfs运行时产生的存储目录

<property>
    <name>hadoop.data.dir</name>
    <value>/opt/module/hadoop-3.1.3/data<value>
  </property>

对于配置了namenode的节点上,会在该目录产生上述配置的节点目录,本次配置的是name目录进行,并且对于其他节点上配置datanode就会产生本次配置的data目录(具体参照上述),如下:

hadoop的集群配置 hadoop集群配置和测试_大数据_27


其下current目录下的文件VERSION,该文件存储相应的版本信息

storageID=DS-8a712acb-de88-4736-ad39-b5f9ac94bbfa
clusterID=CID-622407ad-be8b-47e6-b07d-853c89884476
cTime=0
datanodeUuid=6b59207c-1dcd-49f4-ba05-b4453e2293a5
storageType=DATA_NODE
layoutVersion=-57

其中clusterID字段就是集群的idnamenode管理的dataname对应的data目录下也是存在clusterID字段,跟管理他的namenode是一致的,重复格式化就是会datanode找不到管理他的namenode从而导致启动失败

解决:只要删除配置的hdfs对应的存储目录就可以了,上述就是删除/opt/module/hadoop-3.1.3/data