(准备三台服务器hadoop128、hadoop129、hadoop130)
使用xsync将hadoop和环境变量文件分发到其他服务器上
xsync的使用:
https://blog.csdn.net/qq_43066945/article/details/119458718
但是我们每次使用都需要输入密码,可以使用ssh免密,也可以使用sshpass规避输入密码
ssh免密:
进入家目录,可能是/home/用户名/中,也可能在/root中
ls -al
cd .ssh
1.执行如下命令:
ssh-keygen -t rsa
一直回车即可
2.
ssh-copy-id hadoop128
(这里是你另外服务器的域名,我这里是在hosts文件中做了映射)
输入一次密码即可实现免密通信
如果服务器重置过,需要使用ssh-keygen -R 你要访问的IP地址
然后再进行1、2步骤就可以了
为了方便可以每台都进行如此操作
注:这个配置只适用于一个用户,切换用户就需要再次配置,切换回来就可以继续使用
安装
首先在128上的HDFS安装NameNode、DataNode,129上安装DataNode,130上安装SecondaryNameNode、DataNode;128的YARN上安装NodeManager,129上安装ResourceManager、NodeManager,130上安装NodeManager。
因为耗内存的原因,NameNode和SecondaryNameNode不要安装在同一台服务器上,ResourceManager也很耗内存,不要和NameNode、SecondaryNameNode配置在同一台服务器下。
Hadoop配置我们就需要用到默认的配置文件,初始化默认的配置文件是空的,文件我已经上传了,下载记得关注我,如果需要积分了可以私聊我,我发你:
https://download.csdn.net/download/qq_43066945/21042985
Hadoop默认配置文件在hadoop目录下的/etc/hadoop/中,核心的配置文件(经常使用)是
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
按照集群规划修改配置文件
core-site.xml:
<configuration>
<!--指定NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<!--主机域名+端口,我做了映射所以叫hadoop128-->
<value>hdfs://hadoop128:8020</value>
</property>
<!--指定hadoop数据的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<!--这个目录如果不存在,会自动创建-->
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!--配置HDFS网页登录使用的静态用户为root-->
<property>
<name>hadoop.http.staticuser.user</name>
<!--这里的用户是你要打开hadoop的用户,我用的是root-->
<value>root</value>
</property>
</configuration>
hdfs-site.xml:
<configuration>
<!--nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop128:9870</value>
</property>
<!--2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop130:9868</value>
</property>
</configuration>
yarn.site.xml
<configuration>
<!--指定MR走shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop129</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>
</configuration>
mapreduce-site.xml
<configuration>
<!--指定MapReduce程序运行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
将配置文件分发到其他服务器上,进入hadoop目录下的/etc,执行
xsync hadoop/
Hadoop集群的文件配置以及完成,接下来配置群起:
配置workers:
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
修改内容为:(三台服务器的主机名称,不允许前后有空格)
hadoop128
hadoop129
hadoop130
保存退出
分发
[root@hadoop128 etc]# xsync hadoop/workers
启动
第一次启动的时候需要在hadoop128节点格式化NameNode
(注:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据,如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所以机器的data和logs目录,然后再进行格式化)
执行:
[root@hadoop128 hadoop-3.1.3]# hdfs namenode -format
如果没有报错表示格式化完成,完成后会在hadoop的目录下多出一个data文件夹,一个logs文件夹
接下来启动hdfs:
[root@hadoop128 hadoop-3.1.3]# sbin/start-dfs.sh
如果是root用户会出现如下错误:
别慌,这是权限的问题,修改启动文件start-dfs.sh、stop-dfs.sh:
[root@hadoop128 sbin]# vim start-dfs.sh
[root@hadoop128 sbin]# vim stop-dfs.sh
添加如下内容:
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
然后还要修改start-yarn.sh、stop-yarn.sh:
[root@hadoop128 sbin]# vim start-yarn.sh
[root@hadoop128 sbin]# vim stop-yarn.sh
添加如下内容:
#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
添加完毕,分发
[root@hadoop128 hadoop-3.1.3]# xsync sbin/
再启动
[root@hadoop128 hadoop-3.1.3]# sbin/start-dfs.sh
成功:
使用jps查看启动的项
发现128上启动了DataNode和NameNode,和我们的集群规划一样,在看129和130:
满足我们的集群规划要求
然后可以访问hdfs的可视化界面:
主机名+端口(pc上的hosts需要做映射才可以这样写,不然就老老实实的用ip+端口访问)
Hadoop128:9870
进入该界面,可以看到hdfs中的数据,当前并没有存数据,所以里面显示数据0。
Hdfs启动成功后启动ResourceManager:
按照集群规划,ResourceManager是在hadoop129上的,所以需要到129上启动:
Jps查看三台服务器情况:
(我们只关注我们集群配置规划的东西是否按规格启动,其余的项是其他在运行的服务,请自行忽略)
由此可以看出,三台服务器已经按照我们的集群规划启动了
Yarn也有可视化界面,可以查看运行情况:
Hadoop129:8088
测试
执行创建文件夹:
[root@hadoop128 hadoop-3.1.3]# hadoop fs -mkdir /wcinput
可以在hdfs可视化界面查看到信息:
接下来准备一个txt文件上传,我这里是上传了hadoop目录下我的一个文件:
[root@hadoop128 hadoop-3.1.3]# hadoop fs -put wcinput/word.txt /wcinput
这时候再去页面上点击wcinput进入目录,可以看到
点击word,再点击图中位置可以查看到文件内容:
也可以下载,如果你是用ip+端口访问的可能会看不到数据,最好去hosts文件中做一个你服务器的映射便可以查看到,比如我这里是映射成hadoop128便可以查看到文件内容了。
接下来测试上传大文件,我这里就上传hadoop的安装压缩包:
[root@hadoop129 hadoop-3.1.3]# hadoop fs -put /opt/software/hadoop-3.1.3.tar.gz /wcinput
再次查看页面:
成功。
可视化查看结束,那么数据真正是存在什么地方的呢?
在hadoop目录下有个data文件夹内
[root@hadoop128 hadoop-3.1.3]# cd data/dfs/data/current/BP-740077404-192.168.59.128-1628733360270/current/finalized/subdir0/subdir0/
可以看到我们上传的文件:
我们查看一下第一个:
发现他就是我们之前上传的word.txt
那我们上传的压缩包呢?
这时候就要用到拼接了。
可以理解我将拆解开的文件重新拼接成一个压缩包,然后解压,完成后我们查看,发现他解压出来的结果就是hadoop的目录文件,与预期的一样:
测试yarn:
执行官方wordcount程序:
[root@hadoop128 hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput/word.txt /wcoutput
可以在yarn可视化页面看到有程序正在计算运行:
运行结束后我们可以在hdfs页面看到有目录生成:
点进去,点开文件查看计算结果:
到这里集群的安装配置测试已经完成