Hadoop系列(一)Hadoop全分布式集群环境搭建

0.准备工作

0.0 准备三台虚拟主机

可以不用直接准备三台,可以先配置一台,然后使用vmware再克隆两台出来,克隆之后要修改他们的“ifcfg-ens-xxx”的网卡配置文件,确保三台主机ip不同。

0.1固定ip地址,卸载或禁用防火墙。

修改ifcfg-ens-xxx的网卡配置文件,根据实际情况自行修改
在这里插入图片描述

0.2配置主机与宿主机时间同步

如果是三台物理机,可以跳过这个步骤

0.2.1方式一:安装ntp服务(推荐)

yum install -y ntpdate
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate -u ntp.api.bz

0.2.2方式二:通过设置vmware设置虚拟机时间同步

在这里插入图片描述

0.3 安装java环境

直接通过yum安装,可以不用配置环境变量,因为hadoop中需要配置JAVA_HOME的绝对路径,因为使用全局环境变量hadoop可能依然找不到JAVA_HOME

命令:

yum search java | grep -i --color jdk //查看jdk列表
yum install -y java-1.8.0-openjdk* //安装jdk1.8的所有文件

jdk默认安装路径在/usr/lib/jvm目录中。这个路径后边要用到,需要将绝对路径配置在hadoop以及其生态系统中的其他组件的环境变量配置文件中

在这里插入图片描述

0.4 配置三台主机的hosts文件

命令:

vim /etc/hosts

添加如下配置

# master为主机,其他两个为从机,注意替换成自己的ip地址。
192.168.235.145 master
192.168.235.146 slave1
192.168.235.147 slave2

0.5设置三台主机的ssh互信

0.5.1配置master主机免秘钥登录

命令:

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

0.5.2 将公钥发送给其他两台从机

## ssh-copy-id 用户名@机器名
ssh-copy-id root@slave1
ssh-copy-id root@slave2

其他两台从机做同样的操作,将公钥发送给另外两台机器。我这里统一使用root用户操作。

1.Apache官网,下载hadoop镜像资源

hadoop官网地址,建议下载hadop-2.x版本,因为hadoop-2.x对hbase的支持更好,我这里下载hadoop-2.8.5

在这里插入图片描述

2.上传服务器指定目录,(如:/usr/local/hadoop)解压下载的镜像压缩包

命令:

tar -xzvf hadoop-2.8.5.tar.gz

解压后的目录名称为hadoop-3.3.0,重命名

mv hadoop-2.8.5 hadoop285

3.修改hadoop330/etc/hadoop下的环境配置文件

包含以下三种:

hadoop-env.sh

yarn-env.sh

mapred-env.sh(可选)

在配置文件中设置本机的JAVA_HOME路径为绝对路径,有则修改替换,没有则添加,如下:

# 添加set to the root of your Java installation
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64

对应配置文件在/hadoop/hadoop安装/txt/hadoop-env.sh,可修改路径之后,直接覆盖服务器上的其他类似

4.修改四个必要的配置文件

根据官网的描述,hadoop的Java配置有两种重要的配置文件,分别是:

只读配置

core-default.xml

hdfs-default.xml

yarn-default.xml

mapred-default.xml

特定站点的配置

etc/hadoop/core-site.xml

etc/hadoop/hdfs-site.xml

etc/hadoop/yarn-site.xml

etc/hadoop/mapred-site.xml

只读配置不用管,修改后面这四个配置文件

4.1core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
	<!-- 主机的hdfs运行端口	-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
	<!-- 修改hadoop.tmp.dir的路径,防止意外断电,重启hadoop读取不到基本配置	-->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/usr/local/hadoop/tmp</value>
	</property>
</configuration>

4.2hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->

<configuration>

	<!-- namenode 上存储 hdfs 名字空间元数据-->
	<property>  
		<name>dfs.name.dir</name>
        <value>/usr/local/hadoop/hadoop285/tmp/dfs/name</value>
    </property>
 
	<!-- datanode 上数据块的物理存储位置--> 
     <property>
        <name>dfs.data.dir</name>
        <value>/usr/local/hadoop/hadoop330/tmp/dfs/data</value>
     </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
	</property>
	<property>
		<name>dfs.datanode.max.xcievers</name>
		<value>4096</value>
		<dedication> Datanode 有一个同时处理文件的上限,至少要有4096</dedication>
	</property>
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>master:9001</value>
	</property>
	<property>  
		<!--设置为true,可以在浏览器中IP+port查看-->
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
</configuration>

4.3yarn-site.xml

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
	<!-- Site specific YARN configuration properties -->
	 <property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!--日志保存时间 默认保存3-7-->	
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>86400</value>
	</property>
	<!--ResourceManager 对客户端暴露的地址--> 
	<property> 
		<name>yarn.resourcemanager.address</name> 
		<value>master:8032</value> 
	</property> 
	<!--ResourceManager 对ApplicationMaster暴露的地址-->  
	<property> 
		<name>yarn.resourcemanager.scheduler.address</name> 
		<value>master:8030</value> 
	</property> 
	<!--ResourceManager 对NodeManager暴露的地址--> 
	<property> 
		<name>yarn.resourcemanager.resource-tracker.address</name>  
		<value>master:8031</value> 
	</property> 	
	<!--ResourceManager 对管理员暴露的地址--> 
	<property> 
		<name>yarn.resourcemanager.admin.address</name>   
		<value>master:8033</value> 
	</property> 
	<!--ResourceManager 对外web暴露的地址,可在浏览器查看-->   
	<property> 
		<name>yarn.resourcemanager.webapp.address</name> 
		<value>master:8088</value> 
	</property>
</configuration>

4.4mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
 <property>
    <name>mapreduce.jobhistory.address</name>
    <!--配置实际的主机名和端口-->
    <value>master:10020</value>
  </property>
 
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
  </property>
</configuration>

5.列出主机所有的从机

hadoop中,除了主机以外的其他服务器被称作员工,这里主要在etc/hadoop下的slaves文件中列出所有的工人,也就是之前在服务器hosts文件中设置的三台主机的ip地址+名称。这里只需列出从机名称即可。

在这里插入图片描述

在slaves文件中进行如下配置:
在这里插入图片描述
默认会有一行localhost的配置,建议删除。

6.添加hadoop到全局环境变量

添加环境变量的目的是为了上系统识别hadoop命令

编辑 ~/.bashrc配置文件

vim ~/.bashrc

添加环境变量HADOOP_HOME指定hadoop的安装目录

export HADOOP_HOME=/usr/local/hadoop/hadoop277
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

追加PATH变量

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:

使环境生效

source ~/.bashrc

测试hadoop命令,查看版本

hadoop version

在这里插入图片描述

7.分发配置

完成所有必要配置之后,将文件分发给其他服务器

可以利用scp命令进行文件分发。

命令:

# scp -r 本地目录 用户名@从机名称:远程目录
scp -r /usr/local/hadoop/hadoop285 root@slave1:/usr/local/hadoop
scp -r /usr/local/hadoop/hadoop285 root@slave2:/usr/local/hadoop

7.1 同步Haddop全局环境变量

这里需要三台机器都具有Hadoop的环境变量,建议每个都配置一遍,因为通过

scp命令分发的话可能会覆盖从机原来的环境变量

添加环境变量同第5步一致。

8.启动集群

启动集群之前首先要在主节点对HDFS进行格式化,这里是在配置了三台机器

ssh可信访问的情况下可以使用如下命令进行格式化,如果没有配置ssh可信访问,使用官网提供的方式进行格式化

在这里插入图片描述

命令:

hadoop namenode -format

启动,也可以分开依次启动start-dfs.sh和start-yarn.sh

./start-all.sh

可能会出现以下错误,没有错误就跳过此步骤

因为我安装了三个版本的hadoop,分别是hadoop-3.3.0、hadoop-2.7.7和

hadoop-2.8.5,这个错误是3.x版本才有的。最终整理出来的文档是2.8.5版本的。
在这里插入图片描述

翻译过来是,“尝试以root用户操作hdfs namenode结点,但是

HDFS_NAMENODE_USER并未定义为root”,之前并没遇到过这种错误。网上

查找的解决办法,修改一下配置文件。

需要修改四个启动/停止文件

start-dfs.sh和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添加如下配置

#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

重新启动

./start-all.sh

在这里插入图片描述

启动成功

访问hdfs文件系统默认端口是50070,hdoop-3.x之后,默认端口为9870

主机ip+50700即可访问

9.测试hadoop自带mapreduce实例

9.1 在本地创建三个文件,写入内容

f1.txt 内容:hello world

f2.txt 内容:hello brother

f3.txt 内容:hello world,mybrother

这个文件目录自定义,我的目录地址在/usr/local/hadoop/test

9.2 将三个文件上传进hdfs文件系统

命令:

#hdfs dfs -put 文件的目录 输出值hdfs文件系统的目录,我这里已经进入/usr/local/hadoop,否则需要写绝对路径
hdfs dfs -put test/ /test

执行mapreduce,这里要注意jar包的名称要保持一致

#其中末尾的/test hdfs文件系统中的三个文件的路径 /output是结果输出的路径
hadoop jar /usr/local/hadoop/hadoop285/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.5.jar wordcount /test /output

执行结果

在这里插入图片描述
出现

 INFO mapreduce.Job:  map 100% reduce 100%

说明执行成功,去文件系统查看日志,需要下载查看词频统计结果

文件系统访问路径在第8步末尾
在这里插入图片描述

在这里插入图片描述

10.常见问题汇总

10.1:Container exited with a non-zero exit code 1. Error file: prelaunch.err. Last 4096 bytes of prelaunch.err : Last 4096 bytes of stderr : 错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

这个错误是在yarn-site.xml配置文件中没有指定classpath导致程序找不到主类,无法加载。

解决办法:执行

hadoop classpath

yarn-site.xml文件中添加配置

<property>
   <name>yarn.application.classpath</name>
   <value>【hadoop classpath命令输出的结果粘贴至此处】</value>
</property>

然后重启hadoop,建议修改配置之前就把hadoop停止。

10.2:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://master:9000/output already exists

这个错误是在hdfs文件系统中,该目录(Output)已经存在,所以在执行命令时,必须选择一个没有创建过的目录

解决办法:
1.更换一个新的目录

​2.通过浏览器把hdfs中的该目录删除,hdfs文件浏览器地址:

在这里插入图片描述

10.3:org.apache.hadoop.hdfs.server.common.IncorrectVersionException: Unexpected version of storage directory /usr/local/hadoop/tmp/dfs/namesecondary. Reported: -65. Expecting = -63.

这个错误,不太常见,涉及到两个配置dfs.name.dir和hadoop.tmp.dir,分别在hdfs-site.xml和core-site.xml文件中这个错误导致SecondaryNameNode一致无法启动成功,所以在查看jps是看不到SecondaryNameNode。因为我重复安装了不同版本导致的,如果第一次安装应该不会有这种错误。

hdfs-site.xml

在这里插入图片描述

core-site.xml

在这里插入图片描述

他们俩最里边都有一个VERSION文件,里边声明了版本,如果两个版本不一致,就会这种错误。

解决办法,把这俩文件全删了,两个从机也要删。重新格式化hdfs,格式化命令参考第8步启动集群。然后就可以了。

jps查看,SecondaryNameNode启动成功

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值