Hadoop集群搭建,基于3.3.4hadoop
Hadoop集群搭建,我这里采用的是Hadoop3.3.4,Jdk1.8,centos8,vmware16版本的。
1.虚拟机的创建
首先我们需要创建三台虚拟机,先创建第一台虚拟机,然后对第一台虚拟机进行配置(网络配置,免密配置,jdk,hadoop环境的安装),然后进行克隆,将第一台虚拟机克隆两个虚拟机出来,最后开始搭建集群。
一些目录说明 :
/export/data/ :存放数据类的文件 /export/servers/ :存放服务类软件 /export/software/ :存放安装包文件
AI 代码解读
1.1 第一台虚拟机的创建
打开VMware进行第一台虚拟机的创建,点击新建虚拟机
选择典型,下一步
我这里因为提前已经准备好了centos8的镜像资源,所以直接将光盘驱动文件选择了,然后点击下一步
然后自定义虚拟机名称,已经安装的位置,我这里使用node-01(主虚拟机)作为第一台虚拟机的名称,然后点击下一步
磁盘空间默认20GB即可,下一步
点击自定义硬件,对虚拟机的内存和cpu进行一定的配置
这里我只将虚拟机的内存进行了更改,由默认的1GB改到了2GB,然后点击关闭
点击完成
1.2 第一台虚拟机的安装
然后进入到虚拟机安装的环节,通过上下键切换,选择Install Centos stream 8-stream
选择语言,中文,然后点击继续
选择root密码,对root账户的密码进行初始化设定
点击完成
接着我们再对网络进行配置,选择网络和主机名
将网络开启,然后设定主机名,并且应用,然后点击完成
然后选择时区,将时区设为ASia/Shanghai
点击完成
然后选择分区,默认分区也可以
然后进行软件的选择
因为我是小白,所以还是选择了带GUI图形界面的,然后选择网络服务器,传统的UNIX兼容性和基本的开发工具即可
然后开始安装即可,大概几分钟左右
点击重启系统即可
重新启动后,它会让你确认是否接受服务,选择接受即可,然后创建用户这项根据个人需求我就暂时不创建了。
初始界面,如下,第一台虚拟机搭建完毕
1.3 第一台虚拟机的网络配置
我们可以使用XShell来进行远程登录,使用Xftp来进行文件的传输和下载,我这里就不过多赘述,在我的另外一篇文章中都有详细的介绍。
(1条消息) Xshell和Xftp的下载和在linux虚拟机中的使用_xshell和xftp下载_杀死一只知更鸟debug的博客-CSDN博客
1.3.1 主机名和IP映射配置
配置主机名
vi /etc/sysconfig/network
AI 代码解读
将虚拟机主机名称设为 node-01,node-02,node-03
配置IP映射
vi /etc/hosts
AI 代码解读
将IP地址与主机名,进行关联,对/etc/hosts文件进行下面的添加
192.168.197.133 node-01 192.168.197.134 node-02 192.168.197.135 node-03
AI 代码解读
1.3.2 网络参数配置
修改IP地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
AI 代码解读
默认配置如下图
将BOOTPROTO的值改为static,静态路由协议,保持IP的固定
BOOTPROTO=static IPADDR=192.168.197.133 GATEWAY=192.168.197.2 NETMASK=255.255.255.0 DNS1=8.8.8.8
AI 代码解读
重启网络配置使其生效
service network restart
AI 代码解读
然后可以使用 ifconfig指令查看网络是否配置成功。
1.4 第一台虚拟机的Java,Hadoop环境搭建
1.4.1 Java环境搭建
去到Java的官网,然后下载对应的Linux版本的Jdk
创建一个目录,用于存放java的环境,上面已经说过了,要将软件包存放到/export/software文件夹中
mkdir -p /export/data/ # 存放数据类的文件 mkdir -p /export/servers/ # 存放服务类软件 mkdir -p /export/software/ #存放安装包文件
AI 代码解读
将Jdk通过Xftp传入到Linux虚拟机上刚刚创建的目录下,然后进行解压安装及环境配置
接着切换到java目录下,对压缩包进行解压
cd /export/software # 切换目录 tar -zxvf jdk-8u141-linux-x64.tar.gz -C/export/servers # 解压
AI 代码解读
配置Java的环境变量,用vi 打开/etc/profile 文件进行配置
vi /etc/profile
AI 代码解读
将下面的配置信息,写入到 /etc/profile目录中(注意你安装的Java版本及解压的名称)。
export JAVA_HOME=/export/servers/jdk1.8.0_141 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
AI 代码解读
然后保存退出 Esc : wq
接着重新加载配置文件:
source /etc/profile
AI 代码解读
然后输入
java -version
AI 代码解读
此时就可以看到Java环境安装好啦
1.4.2 Hadoop环境搭建
同样,安装Linux中的Hadoop环境,先需要去其官网下载对应的Hadoop版本 Apache Hadoop
找到压缩包后,将其传输到Linux虚拟机中的 /export/software 目录下,我这里使用的是最新的hadoop3.3.4
然后解压该压缩包到 /export/servers 目录下
cd /export/software
#如果不存在 modules目录则进行创建 mkdir modules
tar -zxvf hadoop-3.3.4.tar.gz -C /export/servers
AI 代码解读
接着开始对 /etc/profile 开始配置hadoop系统环境
vi /etc/profile
AI 代码解读
将下面的内容插入到 /etc/profile 的底部
export HADOOP_HOME=/export/servers/hadoop-3.3.4 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
AI 代码解读
然后保存退出 Esc : wq
同样需要重新加载一下配置文件使其生效
source /etc/profile
AI 代码解读
输入hadoop -version
,查看其输出,可见此时hadoop已经安装完毕
配置环境变量:
hadoop所有配置文件都存在安装目录下的/etc/hadoop目录中(我这里是**/export/servers/hadoop-3.3.4/etc/hadoop**),在该目录下的hadoop-env.sh、mapred-env.sh、yarn-env.sh中添加JAVA_HOME环境变量:
export JAVA_HOME=/export/servers/jdk1.8.0_141
AI 代码解读
如下图:
进入到其安装目录下的/etc/hadoop的目录中,然后对hadoop-env.sh、mapred-env.sh、yarn-env.sh中添加JAVA_HOME环境变量
1. 修改hadoop-env.sh
vi hadoop-env.sh
AI 代码解读
找到 export JAVA_HOME 然后添加/export/servers/javajdk1.8.0_141(jdk目录位置)
然后保存退出 Esc :wq
yarn-env.sh
vi yarn-env.sh
AI 代码解读
保存退出
1、修改core-site.xml
Hadoop的核心配置文件,其目的是配置HdFS地址,端口号,以及临时文件目录
vi core-site.xml # 使用vi对其xml进行配置
AI 代码解读
添加以下内容
<property>
<!-- 配置Hadoop 的临时目录 -->
<name>hadoop.tmp.dir</name>
<value>file:/export/servers/hadoop-3.3.4/tmp</value>
</property>
<property>
<!-- 配置Hadoop的文件系统,由URI指定 -->
<name>fs.defaultFS</name>
<!-- 这里我之前配置过主机名和IP映射所以写成主机名即可,
没配置过的话,写完整的IP地址即可 192.168.197.133
-->
<value>hdfs://node-01:9000</value>
</property>
AI 代码解读
参数说明:
- fs.defaultFS:默认文件系统,HDFS的客户端访问HDFS需要此参数
- hadoop.tmp.dir:指定Hadoop数据存储的临时目录,其它目录会基于此路径, 建议设置到一个足够空间的地方,而不是默认的/tmp下
2、修改hdfs-site.xml,添加以下内容
vi hdfs-site.xml
AI 代码解读
hdfs-site.xml 用于设置HDFS的NameNode和DataNode两大进程
<!-- 指定hdfs副本的数量 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- secondary 所在的主机IP和端口号 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node-02:50090</value>
</property>
AI 代码解读
参数说明:
- dfs.replication:数据块副本数 - dfs.name.dir:指定namenode节点的文件存储目录
- dfs.data.dir:指定datanode节点的文件存储目录
3、修改mapred-site.xml
mapred-site.xml是MapReduce的核心配置文件,用于指定MapReduce运行时框架。
vi marped-site.xml
AI 代码解读
添加以下内容
<property>
<!-- 指定MapReduce运行时框架,指定yarn,默认是local -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
AI 代码解读
4、修改yarn-site.xml,添加以下内容
yarn-site.xml是YARN框架的核心配置文件,需要指定YARN集群的管理者。
vi yarn-site.xml
AI 代码解读
添加如下配置:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN集群的管理者Resoucemanage的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-01</value>
</property>
AI 代码解读
参数说明:
- yarn.nodemanager.aux-services:NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可以运行Mapreduce程序。yarn提供了该配置用于在nodemanager上扩展自定已服务,MapReduce的Shuffle功能正式一种扩展服务。
5、修改 slaves文件
slaves文件用于记录Hadoop集群的所有从节点(HDFSde DataNode 和 YARN 的 NodeManager所在主机)的主机名,用来配合一键启动脚本集群从节点(保证配置了SSH免密登录)。打开该配置文件,先删除里面的默认内容(localhost),然后配置如下内容
vi slaves
# 添加如下内容
node-01
node-02
node-03
AI 代码解读
2、克隆另外两台虚拟机及网络配置
2.1 克隆虚拟机
右键,选择管理,然后点击克隆
流程如下:
选择完整克隆,点击下一步
虚拟机名称和位置,自定义
此时第二台虚拟机已经克隆完毕,接着我们再以相同的方式克隆第三台虚拟机node-03
2.2 克隆虚拟机网络配置
配置主机名
vi /etc/sysconfig/network
# 或者使用
hostnamectl set-hostname 主机名
AI 代码解读
主机名配置后,使用reboot指令进行重启才会生效
将新克隆的虚拟机主机名称分别设为 node-02,node-03
修改IP地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
AI 代码解读
修改IPADDR即可
node-02 对应 192.168.197.134
node-03 对应 192.168.197.135
3、设置node-01到其余两台虚拟机的SSH免密登录
1、在各个节点中生成密钥文件
$ cd ~/.ssh/ # 若没有该目录,执行ssh localhsot $ ssh-keygen -t rsa # 生成密钥文件,提示输出加密信息,一直回车即可
AI 代码解读
tip:如果提示说不存在ssh目录,直接执行 ssh-keygen -t rsa 即可
2、分别在三个节点中心以下命令,将公钥信息复制并追加到对方节点的授权文件authorized.key中
$ ssh-copy-id node-01 $ ssh-copy-id node-02 $ ssh-copy-id node-03
AI 代码解读
这里记得将每个虚拟机开启,然后在远程登录软件中进行免密配置
3、修改授权文件权限
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
AI 代码解读
4、测试无密钥登陆
ssh node-02 exit ssh node-03 exit
AI 代码解读
3、格式化NameNode
在主节点进行格式化即可(node-01),启动Hadoop之前需要格式化NameNode,格式化NameNode可以初始化HDFS文件系统的一些目录和文件,在node-01上执行:
# 必须在NameNode节点上进行format操作 $ hadoop namenode -format
AI 代码解读
5、启动hadoop
# 启动hadoop $ start-all.sh # 停止hadoop $ stop-all.sh # 查看节点角色 $ jps
AI 代码解读
启动 Hadoop 服务时权限异常,strat-all .sh
Starting namenodes on [node-01] ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [node-02] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation. Starting resourcemanager ERROR: Attempting to operate on yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation. Starting nodemanagers ERROR: Attempting to operate on yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
AI 代码解读
如果出现没有定义HDFS_NAMENODE_USER
则在环境变量中在添加:
1.进入环境变量
vi ~/.bash_profile
AI 代码解读
2.添加:
export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_JOURNALNODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
AI 代码解读
3.环境变量生效
source ~/.bash_profile
AI 代码解读
6、启动和关闭Hadoop集群
1.单节点逐个启动和关闭
主节点启动HDFS NameNode节点
hadoop-daemon.sh start namenode
AI 代码解读
从节点启动HDFS DataNode节点
hadoop-daemon.sh start datanode
AI 代码解读
主节点启动YARNResourceManager进程
yarn-daemon.sh start resourcemanager
AI 代码解读
从节点上启动YARN nodemanager进程
yarn-daemon.sh start nodemanager
AI 代码解读
规划节点node-02启动SecondaryNameNode进程
hadoop-daemon.sh start secondarynamenode
AI 代码解读
停止则使用stop替换掉start即可
2.脚本一键启动和关闭
start-dfs.sh start-yarn.sh
AI 代码解读
这个需要在配置了slaves文件和SSH免密登录(双向的免密登录,即从节点的虚拟机也需要进行SSH免密配置)
6、通过UI查看Hadoop运行状态
在windows下的C:\Windows\System32\drivers\etc
中的hosts文件添加集群服务的IP映射
192.168.197.133 node-01 192.168.197.134 node-02 192.168.197.135 node-03
AI 代码解读
注意先关闭防火墙,然后再进行测试查看运行状态
一下指令需要对主从节点都进行更改:
systemctl stop firewalld systemctl status firewalld systemctl disable firewalld systemctl enable firewalld
AI 代码解读
此时我们可以从windows的窗口进行查看了 http://node-01:50090(集群服务IP+端口号)
和htpp://node-01:8088
查看YARN和HFDS的集群状态。
遇到的问题
以下纯属个人问题,已在文章中改了正确的配置:
这里我报错了
log4j:WARN No appenders could be found for logger (org.apache.hadoop.conf.Configuration). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Exception in thread "Thread-2" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Unexpected close tag </property>; expected </configuration>. at [row,col,system-id]: [25,10,"file:/export/servers/hadoop-3.3.4/etc/hadoop/mapred-site.xml"] at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3092) at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:3036) at org.apache.hadoop.conf.Configuration.loadProps(Configuration.java:2914) at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:2896) at org.apache.hadoop.conf.Configuration.get(Configuration.java:1246) at org.apache.hadoop.conf.Configuration.getTimeDuration(Configuration.java:1863) at org.apache.hadoop.conf.Configuration.getTimeDuration(Configuration.java:1840) at org.apache.hadoop.util.ShutdownHookManager.getShutdownTimeout(ShutdownHookManager.java:183) at org.apache.hadoop.util.ShutdownHookManager.shutdownExecutor(ShutdownHookManager.java:145) at org.apache.hadoop.util.ShutdownHookManager.access$300(ShutdownHookManager.java:65) at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:102) Caused by: com.ctc.wstx.exc.WstxParsingException: Unexpected close tag </property>; expected </configuration>. at [row,col,system-id]: [25,10,"file:/export/servers/hadoop-3.3.4/etc/hadoop/mapred-site.xml"] at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:634) at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:504) at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:488) at com.ctc.wstx.sr.BasicStreamReader.reportWrongEndElem(BasicStreamReader.java:3352) at com.ctc.wstx.sr.BasicStreamReader.readEndElem(BasicStreamReader.java:3279) at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2900) at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1121) at org.apache.hadoop.conf.Configuration$Parser.parseNext(Configuration.java:3396) at org.apache.hadoop.conf.Configuration$Parser.parse(Configuration.java:3182) at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3075) ... 10 more
AI 代码解读
提示我说:
/export/servers/hadoop-3.3.4/etc/hadoop/mapred-site.xml 这里配置有问题去看看
AI 代码解读
多了一个poperty结束标记。。。
第二个问题 namenode格式化失败:java.lang.IllegalArgumentException: URI has an authority component:
java.lang.IllegalArgumentException: URI has an authority component at java.io.File.<init>(File.java:423) at org.apache.hadoop.hdfs.server.namenode.NNStorage.getStorageDirectory(NNStorage.java:353) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournals(FSEditLog.java:293) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.initJournalsForWrite(FSEditLog.java:264) at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:1257) at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1726) at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1834) 2023-03-06 20:47:32,697 INFO util.ExitUtil: Exiting with status 1: java.lang.IllegalArgumentException: URI has an authority component
AI 代码解读
解决方案,是core-site.xml中的一个配置好像不太一样,3.x和2.x不太一样
cd /export/servers/hadoop-3.3.4/etc/hadoop/ vi core-site.xml
AI 代码解读
我的配置是:
<configuration>
<property>
<!-- 配置Hadoop 的临时目录 -->
<name>hadoop.tmp.dir</name>
<value>file:/export/servers/hadoop-3.3.4/tmp</value>
</property>
<property>
<!-- 配置Hadoop的文件系统,由URI指定 -->
<name>fs.defaultFS</name>
<!-- 这里我之前配置过主机名和IP映射所以写成主机名即可,
没配置过的话,写完整的IP地址即可 192.168.197.133
-->
<value>hdfs://node-01:9000</value>
</property>
</configuration>
AI 代码解读
正确的配置应为:
<configuration>
<property>
<!-- 配置Hadoop 的临时目录 -->
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop-3.3.4/tmp</value>
</property>
<property>
<!-- 配置Hadoop的文件系统,由URI指定 -->
<name>fs.defaultFS</name>
<!-- 这里我之前配置过主机名和IP映射所以写成主机名即可,
没配置过的话,写完整的IP地址即可 192.168.197.133
-->
<value>hdfs://node-01:9000</value>
</property>
</configuration>
AI 代码解读