Hadoop搭建部署

本文为Hadoop搭建部署的学习笔记

Hadoop的三种模式

Hadoop运行模式包括:单机模式、伪分布式模式以及完全分布式模式。

Hadoop官方网站:hadoop.apache.org/

单机模式

  • 默认模式。
  • 不对配置文件进行修改。
  • 使用本地文件系统,而不是分布式文件系统。
  • Hadoop不会启动NameNode、DataNode、JobTracker、TaskTracker等守护进程,Map()和Reduce()任务作为同一个进程的不同部分来执行的。
  • 用于对MapReduce程序的逻辑进行调试,确保程序的正确。

伪分布式模式

  • 在一台物理主机上模拟多台主机。
  • Hadoop启动NameNode、DataNode、JobTracker、TaskTracker这些守护进程都在同一台机器上运行,是相互独立的Java进程。
  • 在这种模式下,Hadoop使用的是分布式文件系统,各个作业也是由JobTraker服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试Hadoop程序的执行是否正确。
  • 修改3个配置文件:core-site.xml(Hadoop集群的特性,作用于全部进程及客户端)、hdfs-site.xml(配置HDFS集群的工作属性)、mapred-site.xml(配置MapReduce集群的属性)
  • 格式化文件系统

完全分布式模式

  • Hadoop的守护进程运行在由多台主机搭建的集群上,是真正的生产环境。
  • 在所有的主机上安装JDK和Hadoop,组成相互连通的网络。
  • 在主机间设置SSH免密码登录,把各从节点生成的公钥添加到主节点的信任列表。
  • 修改3个配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml,指定NameNode和JobTraker的位置和端口,设置文件的副本等参数
  • 格式化文件系统

参考CSDN文章链接📁

综上所述单机版适合开发调试;伪分布式版,适合模拟集群学习;完全分布式,生产使用的模式。


基础环境准备

环境准备

系统版本 jdk版本 Hadoop版本 服务器IP 服务器台数
centos 6.5 jdk 1.8 hadoop-2.10.0 192.168.1.0 4台

配置host和主机名

🖥查看默认主机名:使用hostname命令来查看

🖥查看和修改主机名:使用hostname + *命令来修改主机名,*代表主机名

不过上述修改主机名只是暂时的,重启后会失效。如果永久修改主机名,要修改配置文件执行命令: vim /etc/sysconfig/network

编辑文件中的HOSTNAME例如

1
HOSTNAME=master

绑定hostname与IP,修改四台服务器的hosts文件

1
2
3
4
5
vim /etc/hosts
192.168.1.2 master
192.168.1.3 slave1
192.168.1.4 slave2
192.168.1.5 slave3

分别修改服务器的主机名:HOSTNAME,master为例说明

1
2
vim /etc/sysconfig/network
HOSTNAME=master

执行reboot重启后生效,完成之后依次修改其它salve服务器为: slave1~3。

配置防火墙

查看防火墙状态

1
service iptables status

关闭防火墙

1
2
service iptables stop 
chkconfig iptables off

关闭SELINUX

1
setenforce 0

配置免密登录

一、配置免密访问本机

1.生成密钥

1
ssh-keygen -t rsa

2.将公钥追加到”authorized_keys”文件

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

3.赋予权限

1
chmod 600  ~/.ssh/authorized_keys

4.验证本机能无密码访问

1
ssh master

通过测试发现是可以不用输入密码就能访问的,然后下面依次配置salve1~3无密访问。

二、配置master本机无密码登录slave1、slave2、slave3,以master无密码登录slave1为例进行讲解:

1.登录slave1,复制master服务器的公钥”id_rsa.pub”到slave1服务器的”root”目录下。

1
scp root@master:/root/.ssh/id_rsa.pub /root/

2.将master的公钥(id_rsa.pub)追加到slave1的authorized_keys中

1
2
cat id_rsa.pub >> .ssh/authorized_keys
rm -rf id_rsa.pub

3.master上面测试

1
ssh  slave1

三、配置slave1~slave3本机无密码登录master

下面以slave1无密码登录master为例进行讲解,需参照下面步骤完成slave2~slave3无密码登录master。

1.登录master,复制slave1服务器的公钥”id_rsa.pub”到master服务器的”/root/”目录下。

1
scp root@slave1:/root/.ssh/id_rsa.pub /root/

2.将slave1的公钥(id_rsa.pub)追加到master的authorized_keys中。

1
2
cat id_rsa.pub >> .ssh/authorized_keys
rm -rf id_rsa.pub //删除id_rsa.pub

3.在 slave1上面测试

1
ssh  master

并且依次配置 slave2、slave3

到此主从的无密登录已经完成了。各台服务器之间无需密码就可以远程登录了!

环境搭建

安装并配置Java

JAVA环境JDK推荐使用Oracle的JDK,自行到网站下载即可。这里我使用的版本是1.8.

解压文件

1
tar -zxvf jdk-8u241-linux-x64.tar.gz -C /usr/local

重命名文件夹

1
mv jdk-8u241-linux-x64.tar.gz java

配置环境变量vim /etc/profile

1
2
3
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

保存退出最后,需要让该环境变量生效,执行如下代码:

1
source /etc/profile

检验是否配置成功

1
2
3
java
javac
java -version

如果三个命令执行均为报错,并且有结果输出,则说明配置正确。

Hadoop环境搭建

配置master的hadoop环境

1、master上 解压缩安装包及创建基本目录

1
2
3
4
5
6
#下载hadoop  
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
#解压
tar -xzvf hadoop-2.10.0.tar.gz -C /usr/local
#重命名
mv hadoop-2.10.0 hadoop

2、 配置master的hadoop环境变量

配置环境变量,修改配置文件vim /etc/profile

1
2
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

使得hadoop命令在当前终端立即生效

1
source /etc/profile

单机模式

官方案grep例

1
2
3
4
5
6
7
8
##hadoop目录下创建一个input文件夹
mkdir input
##将Hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input
##执行share目录下的MapReduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar grep input output 'dfs[a-z.]+'
##查看输出结果
cat output/*

官方WordCount案例

1
2
3
4
5
##创建wcinput文件夹
mkdir wcinput
cd wcinput
touch wc.input
vim wc.input

虽然输入一些自己想要的内容比如

1
2
3
4
hello hello
world world world
hadoop hadoop BigData
hive hbase spark java rust python Go

然后回到Hadoop目录

1
2
3
4
##返回Hadoop目录
cd ..
##执行程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar wordcount wcinput wcoutput

查看结果cat wcoutput/part-r-00000输出结果如下

1
2
3
4
5
6
7
8
9
10
11
BigData	1
Go 1
hadoop 2
hbase 1
hello 2
hive 1
java 1
python 1
rust 1
spark 1
world 3

单机伪分布式模式

Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。

配置hadoop-env.sh修改其中的JAVA_HOME

1
export JAVA_HOME=/usr/local/java/

配置core-site.xml,将其中的改为如下所示

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>

配置hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>

配置mapred-site.xml

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

配置yarn-site.xml

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),伪分布式只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过我还是配置了yarn跟marped。若没有配置 hadoop.tmp.dir 参数的话,则默认使用的临时目录为 /tmp/hadoo-hadoop,然而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

配置完成后,执行 NameNode 的格式化:

1
bin/hdfs namenode -format

启动hadoop

1
sbin/start-all.sh

成功启动后,运行jps命令

1
2
source /etc/profile
jps

如果安装成功,则会出现如下如下进程

1
2
3
4
5
6
14577 Jps
13284 ResourceManager
14006 DataNode
14201 SecondaryNameNode
13853 NameNode
14447 NodeManager

此时可以通过http://master:50070 访问HDFS的web界面,通过http://master:8088/来访问YARN的web界面

完全分布式运行模式

配置master的hadoop环境

配置core-site.xml

修改Hadoop核心配置文件/usr/local/hadoop/etc/hadoop/core-site.xml,通过fs.default.name指定NameNode的IP地址和端口号,通过hadoop.tmp.dir指定hadoop数据存储的临时文件夹。

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>

特别注意:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删除,必须重新执行format才行,否则会出错。

配置hdfs-site.xml

修改HDFS核心配置文件/usr/local/hadoop/etc/hadoop/hdfs-site.xml,通过dfs.replication指定HDFS的备份因子为3,通过dfs.name.dir指定namenode节点的文件存储目录,通过dfs.data.dir指定datanode节点的文件存储目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>

</configuration>

配置mapred-site.xml

拷贝mapred-site.xml.template为mapred-site.xml,然后再进行修改

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>

配置yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>

6、配置masters文件

修改/usr/local/hadoop/etc/hadoop/masters文件,该文件指定namenode节点所在的服务器机器。删除localhost,添加namenode节点的主机名master;不建议使用IP地址,因为IP地址可能会变化,但是主机名一般不会变化。

1
2
3
vi /usr/local/hadoop/etc/hadoop/masters
## 内容
master

配置slaves文件(Master主机特有)

修改/usr/local/hadoop/etc/hadoop/slaves文件,该文件指定哪些服务器节点是datanode节点。删除locahost,添加所有datanode节点的主机名,如下所示。

1
2
3
4
5
vim /usr/local/hadoop/etc/hadoop/slaves
## 内容
slave1
slave2
slave3

配置slave的hadoop环境

下面以配置slave1的hadoop为例进行演示,用户需参照以下步骤完成其他slave2~3服务器的配置。

复制hadoop到slave1节点

1
scp -r /usr/local/hadoop slave1:/usr/local/

登录slave1服务器,删除slaves内容

1
rm -rf /usr/local/hadoop/etc/hadoop/slaves

2)配置环境变量

1
2
3
4
vim /etc/profile
## 内容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

使得hadoop命令在当前终端立即生效;

1
source /etc/profile

并且依次配置其它slave服务

启动集群

格式化HDFS文件系统进入master的~/hadoop目录,执行以下操作

1
bin/hadoop namenode -format

格式化namenode,第一次启动服务前执行的操作,以后不需要执行。

然后启动hadoop:

1
sbin/start-all.sh

命令查看Hadoop集群的状态

通过简单的jps命令虽然可以查看HDFS文件管理系统、MapReduce服务是否启动成功,但是无法查看到Hadoop整个集群的运行状态。我们可以通过hadoop dfsadmin -report进行查看。用该命令可以快速定位出哪些节点挂掉了,HDFS的容量以及使用了多少,以及每个节点的硬盘使用情况。

1
hadoop dfsadmin -report

参考文章: