Linux环境下Hadoop集群搭建

时间:2022-09-23 06:53:37

Linux环境下Hadoop集群搭建

前言:

最近来到了武汉大学,在这里开始了我的研究生生涯。昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识。虽然只是简单的介绍了相关的概念,但对于我来说像是打开了一个新的大门。当然,巧妇难为无米之炊,要想能够使用这些技术,首先要能够把相应的环境搭建起来。因此,在这里我将自己搭建Hadoop集群环境的步骤记录下来,以防止自己以后会忘记。

搭建前所需要的准备:

1.JDK(在这里我使用的是jdk1.8.0_171) 【因为Hadoop是由Apache基金会所开发的分布式系统基础架构,Hadoop的编译以及MapReduce的运行都需要JDK】

2.Xshell【通过Xshell来远程登陆服务器,其中服务器这里有3台,一台作为Master,另外两台作为Slave】

3.Xftp【通过Xftp上传文件到Linux服务器中,也可以对服务器中的文件进行查看和管理】

4.Hadoop(下载链接:http://hadoop.apache.org/releases.html)【注意:下载binary文件,source是未编译的,需要重新编译才能使用】

一.安装JDK

1.将下载好的JDK压缩包通过Xftp上传到服务器中:

Linux环境下Hadoop集群搭建

在这里,我现在每台服务器上的/usr里新建了一个文件夹java,然后将jdk压缩包上传到该java文件夹里。

然后在java文件夹路径下对压缩包进行解压缩,Linux环境下Hadoop集群搭建

2.修改环境变量:

不论在Windows环境还是Linux环境下,在安装好JDK后都需要对环境变量进行更改。环境变量的设置主要是为了要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。

环境变量文件profile位于/etc/文件夹中,通过Linux环境下Hadoop集群搭建  命令对其进行修改。

修改如下:(每台机器JDK安装的路径不同,所以环境变量路径也要做相应的变动)

Linux环境下Hadoop集群搭建

然后通过Linux环境下Hadoop集群搭建命令重新加载profile文件,使得修改的环境变量配置生效。

3.查看配置是否生效:

通过 java -version 命令进行测试,若配置成功将会显示类似如下的信息:

Linux环境下Hadoop集群搭建

出现如上信息,表示jdk已经配置好了。

二.配置Host文件及修改主机名

配置Host文件主要是实现路由映射,使得各虚拟机节点之间能够通过主机名(例如master、slave1、slave2、slave3)直接进行互相访问。

Host文件位于/etc文件夹之下,所以通过

vi /etc/hosts

对其进行编辑,编辑后的结果如下:

Linux环境下Hadoop集群搭建

如果没有权限,则切换成root用户 : su root

修改主机名:

在上面的过程中,我们配置了路由,通过master、slave1、slave2等名称可以访问到指定的主机,但是我们还没有将每台主机赋上其应属的名称,因此我们需要给这些主机指定主机名:

临时指定:

hostname master  #这里只是演示指定的是master,其余主机也都要指定一下

这里的指定可能在系统重启后会失效,造成主机之间无法正常通信。下面介绍永久更改主机名的方法:

修改 /etc/sysconfig/network文件:

vi /etc/sysconfig/network

然后在这个文件中写上主机名,如下所示:

# Created by anaconda
NETWORKING=yes
HOSTNAME=master

然后保存文件,此时主机名就永久修改了。

三.关闭防火墙:

需要在每台机器上执行关闭防火墙的命令:

systemctl stop firewalld 注释:centos7后使用该命令,之前的版本使用 service iptables stop

四.安装Hadoop以及修改配置文件:

1.新建存放Hadoop程序的文件夹:

在这里我在/usr/local文件夹下又新建了hdfs文件夹,并将之前下载好的hadoop-2.6.0.tar 压缩包存放在这个文件夹下,然后对其解压:

tar -zxvf hadoop-2.6.0.tar

解压后,会发现文件夹下多了hadoop-2.6.0这个文件夹,这就是我们所需要的Hadoop文件。

2.创建文件目录:

为了便于管理,所以分别为Master的NameNode、DataNode、以及临时文件 创建文件夹,将这些数据存于新建文件夹下:

mkdir /usr/local/data/data
mkdir /usr/local/data/name
mkdir /usr/local/data/tmp

3.修改Hadoop的初始配置文件:

Hadoop文件夹中存有很多配置文件,这些配置文件在刚解压出来时都是默认初始值,所以需要修改其中一些内容,使其符合集群环境,这样Hadoop集群才能正常地运行起来。

首先进入Hadoop的配置文件夹:

cd /usr/local/hdfs/hadoop-2.6.0/etc/hadoop

这里我们需要修改如下6个文件:

Linux环境下Hadoop集群搭建

分别是core-site.xml、hadoop-env.xml、hdfs-site.xml、mapred-site.xml、slaves、yarn-site.xml

3.1 修改core-site.xml:

vi core-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>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/data/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>

注意:

<name>hadoop.tmp.dir</name>
<value>/usr/local/data/tmp</value>
<description>A base for other temporary directories.</description>

这里面的<value>值为之前创建的tmp文件夹的绝对路径,在这里是: /usr/local/data/tmp

3.2 修改hdfs-site.xml文件:

vi hdfs-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>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/data/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/data/data</value>
<final>true</final>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

注意:

<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/data/name</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/data/data</value>
<final>true</final>
</property>

这两段代码中的value值分别填之前为NameNode、DataNode创建的文件夹路径,这里为:

/usr/local/data/name

/usr/local/data/data

3.3 修改mapred-site.xml:

首先复制mapred-site.xml.template 成mapred-site.xml文件:

cp mapred-site.xml.template mapred-site.xml

然后编辑mapred-site.xml:

vi mapred-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> </configuration>

3.4 修改yarn-site.xml:

vi yarn-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.resourcemanager.address</name>
<value>master:18040</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:18030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:18088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:18025</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:18141</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

3.5 修改hadoop-env.sh:

需要在hadoop-env.sh文件中添加上JAVA_HOME的路径:

export JAVA_HOME=/usr/local/java/jdk1.8.0_171

并将之前的JAVA_HOME语句注释掉:

#export JAVA_HOME=${JAVA_HOME}

3.6 修改slave文件:

将之前的localhost删掉,改成如下内容:

Linux环境下Hadoop集群搭建

3.7 修改/etc/profile文件,添加上Hadoop的工作路径:

Linux环境下Hadoop集群搭建

然后通过 source /etc/profile 使配置文件生效。

source /etc/profile

五.配置虚拟机实现SSH免密登陆:

1.首先需要在Master节点上生成私钥:id_rsa 文件以及公钥: id_rsa.pub 文件:

Linux环境下Hadoop集群搭建

注意:~/.ssh目录的绝对路径是:/root/.ssh , 如果提示没有该文件夹,则通过

mkdir /root/.ssh

进行创建,然后再执行上面的命令。

2.通过将master生成的公钥文件内容加到认证文件 ./authorized_keys 中,就可以实现本机(master) ssh 本机(master)免密操作:

Linux环境下Hadoop集群搭建

测试:

Linux环境下Hadoop集群搭建

测试结果显示成功免密登陆

3.实现master节点与其他slave节点之间的免密登陆:

刚才我们通过将master生成的公钥文件内容加入到认证文件authorized_keys中,实现了自己ssh登陆自己免密,如果我们将 ./authorized_keys 文件复制到各个slave节点的/root/.ssh文件夹下,这样我们就能实现各个节点之间的免密登陆了,操作以及验证如下:

首先是将authorized_keys 文件拷贝到slave节点的.ssh文件夹下(如果slave节点上没有.ssh文件夹,则需要新建一下):

scp ./authorized_keys root@slave1:/root/.ssh

Linux环境下Hadoop集群搭建

然后验证此时是否能够免密远程登录到slave1主机上:

Linux环境下Hadoop集群搭建

如图所示,此时能够远程登陆到slave1节点上了。

重复上面的scp 操作,将认证文件拷贝到其他的slave节点的.ssh文件夹里,完成所有节点之间的免密ssh操作。

六.将master节点上的文件拷贝到slave节点上:

为了避免重复配置的麻烦,我们直接将之前在master节点上配置的 /etc/profile 文件 以及 /usr/local/hdfs/hadoop 文件夹 全部拷贝到 各个slave节点相对应的文件夹下:

scp /etc/profile root@slave1:/etc/profile

scp /etc/hosts root@slave1:/etc/hosts

scp -r /usr/local/hdfs/hadoop-2.6.0 root@slave1:/usr/local/hdfs/hadoop-2.6.0

scp -r /usr/local/java/jdk1.8.0_171/ root@slave1:/usr/local/java/jdk1.8.0_171/

(注意,使用scp 进行文件夹复制时,确保 slave 上有

/usr/local/hdfs 、/usr/local/java 这个路径,没有需要提前建好文件夹。

这里只是将文件拷到了slave1节点上,其他slave节点的操作类似,需要重复一下scp操作。最后确保每个slave节点的  /etc/hosts、/etc/profile 、 /usr/jave/jdk1.8.0_171、/usr/local/hdfs/hadoop-2.6.0 文件都存在且和master是一样的。)

最后为了使得配置文件生效,需要在每个slave节点上做:

source /etc/profile 

七.启动Hadoop集群:

1.在master节点上格式化NameNode:

执行的命令:

hadoop namenode -format

执行结果如下:

Linux环境下Hadoop集群搭建

其中 host字段后面的值为 主机名/本机IP地址

Linux环境下Hadoop集群搭建

2.切换到master节点的 /usr/local/hdfs/hadoop-2.6.0/sbin 目录下:

Linux环境下Hadoop集群搭建

启动Hadoop集群,主要是在master节点上启动NameNode、SecondaryNameNode 、RecourceManager服务;在slave节点上启动DataNode、NodeManager服务。

这些服务可以通过单独的命令进行启动,比如在master节点的sbin目录下:

./hadoop-daemon.sh start namenode  #启动master的NameNode
./hadoop-daemons.sh start datanode #启动slave节点的DataNode
./start-yarn.sh
#master:启动resourcemanager 以及 slave:启动 NodeManager
./start-dfs.sh #启动master节点的SecondaryNameNode

结果如下:

启动master的NameNode:

Linux环境下Hadoop集群搭建

启动slave节点的DataNode:

Linux环境下Hadoop集群搭建

slave上:

Linux环境下Hadoop集群搭建

启动master的resourcemanager 以及 SecondNameNode 、slave节点的NodeManager:

Linux环境下Hadoop集群搭建

Linux环境下Hadoop集群搭建

Linux环境下Hadoop集群搭建 (从这里看出,./start-dfs.sh 也可以启动namenode 和 datanode)

jps -显示当前所有java进程pid的命令,简单实用,适合在linux/unix平台上简单察看当前java进程的一些简单情况

ps -用来显示当前系统的进程情况,有哪些进程,及其 id 】

-------------------------------除了上面的启动方法,也可以通过start-all.sh启动(推荐使用)------------------------------

Linux环境下Hadoop集群搭建

在启动的过程中,会打印出很多启动信息,比如在XX节点上启动XX服务,如果启动过程中遇到问题,一般这里会有所显示。

3.成功启动集群后各节点上运行着的Java进程:

Master:

Linux环境下Hadoop集群搭建

Slave:

Linux环境下Hadoop集群搭建

八.测试Hadoop集群:

1.查看hdfs集群状态:

hdfs dfsadmin -report 

hadoop dfsadmin -report

Linux环境下Hadoop集群搭建

在这里可以查看到启动的datanode节点相关信息。

通过网页查看HDFS信息:

Linux环境下Hadoop集群搭建

通过网页也可以看到master节点以及slave节点的启动情况

【注意:进入hdfs网页的网址是:  masterIP:50070 例如:10.1.2.47:50070】

2.测试Yarn:

通过网址:masterIP:18088 (端口号在yarn-site.xml中定义)查看Yarn:

Linux环境下Hadoop集群搭建

Linux环境下Hadoop集群搭建

3.测试MapReduce:

Hadoop中提供了测试用例:在/usr/local/hdfs/hadoop-2.6.0目录下:

./hadoop jar /usr/local/hdfs/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar pi 5 10

运行MapReduce示例:

Linux环境下Hadoop集群搭建

在Yarn网页中可以查看到Job信息:

Linux环境下Hadoop集群搭建

至此,Hadoop集群已经搭建好了。


 关于Hadoop的介绍,以及本文中用到的所有软件资源:

https://pan.baidu.com/s/1Jx_P8TIlbv78XHfSmKAiuw