- 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 虚拟机规划
1.2 扩展
2 Hadoop配置文件说明
3 集群配置
3.1 hadoop_env.sh配置
JAVA_HOME
配置,对于hadoop2.x
是需要配置,但是对于hadoop3.x
可以不配置,但是保险起见也可配置
路径:hadoop安装目录/etc/hadoop
- 可以使用
/JAVA_HOME
进行查找,如上,然后解开注释,放入路径
3.2 核心文件配置
3.2.1 core-site.xml配置
配置项必须在configuration
标签中
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
即可
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
脚本在次:简化同步脚本
3.3 yarn历史服务器配置
历史服务器的作用是可以查看服务器的历史的状态,例如每一次进行mapreduce
的都会在hadoop
的管理界面看到每一次的运行信息,但是重启后这些信息就会消失,配置历史服务器就能找回这些信息,如下信息可以在上文中配置的hadoop103:8088
的地址可以查看到如下的页面
在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
可以查看
可以通过配置的web
访问地址hadoop102:19888
进行访问
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
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网段上的所有机器可以从这台机器上查询和同步时间)
修改2:配置集群在局域网内,不使用互联网时间
修改3:添加一下内容,当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10
/etc/sysconfig/ntpd
文件修改:增加以下内容,让硬件时间和系统时间同步
SYNC_HWCLOCK=yes
重启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
都执行以下命令,我这里是hadoop102
、hadoop103
、hadoop104
hdfs --daemon start datanode
5) 在hadoop104
启动secondarynamenode
(这里在哪个开启就要看自己预先的规划)
hdfs --daemon start secondarynamenode
6) 在hadoop103
启动``(这里在哪个开启就要看自己预先的规划)
yarn --daemon start resourcemanager
7) 在hadoop102
、hadoop103
、hadoop104
都启动nodemanager
yarn --daemon start nodemanager
- 以上都可以通过
jps
进行查看- 单点启动就是一个个启动,比较麻烦且低效
8) 浏览器访问就可以用到上边配置的端口,例如访问namenode
,就用到配置的9870
端口,配置参照上边,上述配置的是:hadoop102:9870
,那就是hadoop102
的地址加9870
端口即可
通过该页面可以查看相应的
datanode
的配置等信息
9) 其他使用的是默认端口resourcemanager
:8088
(本次部署在hadoop103
上)
4.2 群启集群
问题:上述是单点启动,一个个启动比较麻烦
解决:群启集群主要是使用的是hadoop
安装目录下的sbin
目录下的start-dfs.sh
和start-yarn.sh
两个脚本
基于两个脚本,是启动我们配置的项,在上文中,配置了namenode
和secondarynamenode
,对于datanode
和nodemanager
是没有配置的,所以如果需要让脚本识别并启动二者还需要自行配置
注意:
workers
文件其实是hadoop2.x
的slaves
文件,二者配置是一样的
过程:
在hadoop
安装目录下>etc/hadoop
>workers
文件,初始如下
将localhost
删除,然后将需要配置启动namenode
和secondarynamenode
的服务器的ip地址
或主机名
放在这里,每个独占一行,如下,保存退出
在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 #递归创建
- 这里创建的是在
hdfs
自主管理的文件目录下的,创建的文件/input
表示是在根目录瞎创建的文件夹,这里必须加上具体的路径,例如/input
的/
/input
是 相对于hdfs
上配置的路径,实际路径是结合上文配置的参数,完整为:hdfs://hadoop102:8020/input
hdfs`文件上传
hadoop fs -put 要上传的文件地址 hdfs目录的地址
#hadoop fs -put test.txt /input
1.要上传的文件地址,是在本地服务器文件的地址
2.hdfs
目录的地址是相对于hdfs
的目录地址,例如上述的hdfs
。hdfs
的文件目录是自主管理的,并没有在本地服务器创建实际的目录,而是以另外一种结构形式存储,记录着目录的结构以及文件之间的关系
通过上文配置的web
端配置的端口以及地址:hadoop102ip地址:9870
,具体看个人配置,可以查看到具体创建的目录和文件
点击进具体的目录可以看到上传的文件
可以看到其中一个字段Block Size
,表示块的大小,默认的块大小如下为128M
,例如对于一个129M
的文件,那么就会被分成128M
和1M
两个数据块,具体的数据块存储在个人配置的一个datanode
的存储目录下
点击上述文件的文件名,可以看到以下信息,他可以看到拆分的文件块Block0
,并且以下显示了三个服务器的主机名,这里就是我个人配置的三个datanode
,对于这个文件就会存在三个副本
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
上的路径并且输出的目录不能存在
通过配置的yarn
的web
观察页面:hadoop103ip地址:8088
,可以看到分发的任务
然后在hdfs
的管理页面上也可以看到对应的生成目录和文件
5 重复格式化的问题
问题:hdfs
格式化命令第一次启动的时候进行格式化即可,后续如果重复格式化会出现datanode
启动失败的问题
原因:上边的配置中指定了hdfs
运行时产生的存储目录
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data<value>
</property>
对于配置了namenode
的节点上,会在该目录产生上述配置的节点目录,本次配置的是name
目录进行,并且对于其他节点上配置datanode
就会产生本次配置的data
目录(具体参照上述),如下:
其下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
字段就是集群的id
,namenode
管理的dataname
对应的data
目录下也是存在clusterID
字段,跟管理他的namenode
是一致的,重复格式化就是会datanode
找不到管理他的namenode
从而导致启动失败
解决:只要删除配置的hdfs
对应的存储目录就可以了,上述就是删除/opt/module/hadoop-3.1.3/data