基于Apache Hadoop2.9.2使用云服务器搭建hadoop集群

前言

本文基于Hadoop2.9.2,使用3台云服务器,搭建分布式文件系统HDFS。

在开始之前,你需要3台云服务器,可以在同一家购买也可以在不同家购买,比如,分别从BAT购买3台学生机,会很便宜,前提是要有学生身份。

服务器配置

来源 主机名 CPU 磁盘容量
阿里云 al-s2 1核2G 39.25G
腾讯云 tx-s2 1核2G 39.25
百度云 bd-s2 1核2G 49.09

下载安装Java

Java下载

Hadoop运行依赖于Java环境,因此需要先配置好Java环境。我们还是采用Java8,即jdk1.8。

下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

我们选择linux64位的压缩包进行下载

Java环境变量配置

配置环境变量即修改/etc/profile

vim /etc/profile

然后shift+G跳转到文件尾,添加Java的环境变量:

export JAVA_HOME=/usr/files/java/jdk1.8
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

注意修改路径。

完成后保存退出,重新导入一下:

source /etc/profile

执行java -version命令能够输出版本则Java环境配置成功。

下载Hadoop

本次使用的Hadoop2.9.2,下载地址:https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz

我们选择的是已经编译好的。

复制以上地址,然后在Linux中进行下载并解压:

wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz

tar -xzf hadoop-2.9.2.tar.gz

Hadoop环境变量配置

如果经常需使用shell操作Hadoop,那么配置一个环境变量是很有必要的。和Java环境变量配置类似,也是在/etc/profile中添加环境变量:

vim /etc/profile

输入以下内容:

export HADOOP_HOME=/usr/files/hadoop/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/sbin/:$HADOOP_HOME/bin/

注意修改路径。

完成后保存退出,重新导入一下环境变量:

source /etc/profile

输入命令hadoop version,出现版本号则Hadoop环境变量配置成功:

Hadoop-HDFS部署架构

HDFS部署图

hadoop.master:用于名称节点namdenode、secondarilyNamdeNode和数据节点datanode

hadoop.slave1:用于数据节点datanode

hadoop.slave2:用户数据节点datanode

修改IP-主机名映射

Hadoop使用主机名进行相互通信,因此需要添加ip-主机名映射。

对于集群中的每一台机器,修改/etc/hosts文件,添加ip-主机名映射:

主机名 ip-主机名配置
al-s2 云服务器内网ip hadoop.master
云服务器外网ip hadoop.slave1
云服务器外网ip hadoop.slave2
bd-s2 云服务器内网ip hadoop.slave1
云服务器外网ip hadoop.matser
云服务器外网ip hadoop.slave2
tx-s2 云服务器内网ip hadoop.slave2
云服务器外网ip hadoop.master
云服务器外网ip hadoop.slave1

**注意:**由于Hadoop启动是识别的内网ip,因此,在当前服务器上必须设置为"云服务器内网ip 主机名"的形式,才能够以我们想要的主机名启动Hadoop(虽能够正常启动,但是显示的确是服务器默认的主机名),而其他服务器的ip-主机名则需要为外网形式,才能够正常通信。若都设置为外网ip,则启动时不会使用hosts文件中的配置,而是直接使用云服务器默认的主机名。

另:主机名和hosts文件中的主机名是不一样的,主机名是指我们用hostname命令看到的值,例如下图所示,我的阿里云服务器主机名为al-s2(这是修改后的,默认的是一长串字符):

而hosts文件中的ip-主机名只是一个映射关系,是属于dns解析里的,若没有使用dns,则不需要配置hosts。

修改配置文件

Hadoop的配置文件都在hadoop的安装目录下的/etc/hadoop中,如下图所示;

我所关心的配置文件主要有:core-site.xml、hdfs-site.xml、mapred-site.xml以及hadoop-env.sh

首先配置core.xml文件:

<!--指定hdfs的访问地址-->
 <property>
 	<name>fs.defaultFS</name>
 <value>hdfs://hadoop.master:9000</value>
 </property>
<!--指定零时文件地址-->
 <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/usr/files/hadoop/temp</value>
 </property>

hdfs-site.xml配置:

<!--指定namenode存储路径-->
<property>
   <name>dfs.namenode.name.dir</name>
   <value>file:/usr/files/hadoop/namenode</value>
 </property>
<!--指定datanode存储路径-->
<property>
   <name>dfs.datanode.data.dir</name>
   <value>file:/usr/files/hadoop/datanode</value>
 </property>
<!--指定块大小(256M)-->
 <property>
   <name>dfs.blocksize</name>
   <value>268435456</value>
 </property>
<!--指定数据库的副本数量-->
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
<!--指定web访问hdfs的端口-->
<property>
  <name>dfs.http.address</name>
  <value>0.0.0.0:50070</value>
</property>

配置mapred-site.xml:

<!--指定MR框架名称-->
<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
 </property>
<property>
	<name>mapreduce.jobhistory.webapp.address</name>
 	<value>hadoop.master:19888</value>
 </property>

修改集群配置文件slaves,添加如下内容:

hadoop.master
hadoop.slave1
hadoop.slave2

以上都是最小化配置,具体更多的配置请参照官方文档:

core-site.xml:core-site.xml配置

hdfs-site.xml:hdfs-site.xml配置

mapred-site.xml:mapred-site.xml配置

yarn-site.xml:yarn-site.xml配置

对于hadoop-env.sh主要是修改一下Java的路径,因为hadoop-env.sh默认直接使Java的环境变量,但是某些情况却无法正确识别,因此需要直接指定Java安装路径:

(注意修改为实际Java安装路径)

在配置完一台机器后,使用scp命令进行远程复制到集群中的其他机器:

scp -r /hadoop安装路径/etc/hadoop/ 用户名:主机名(或ip) /hadoop安装路径/etc/hadoop/

shh免密码登录

为什么Hadoop一定要配置免密码登录,因为Hadoop进行节点间的控制是使用ssh实现的,若不配置免密码登录,则每一次启动、停止都会需要输入密码,很不方便。下面是ssh免密码登录的配置方法:

1、生成公钥和私钥

在主节点中,执行:

ssh-keygen -trsa

然后,不断的按回车键。

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

chmod 600 ~/.ssh/authorized_keys

2、将公钥复制到其他从机

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

scp ~/.ssh/authorized_keys root@slave2:~/.ssh/

上面两个步骤,首次需要输入root用户登录slave1的密码,以及root用户登录slave2的密码。

注意:上述的操作过程只是单向的,即此时,ssh root@slave1和ssh root@slave2是不需要密码的。而ssh root@master等反向仍然是需要密码的。

以上ssh免密登录的配置方法来源于:https://blog.csdn.net/timchen525/article/details/75579611

**注意:**若复制的目标文件夹里已经存在该文件,则不会覆盖该文件,那么可以将目标文件夹写道上一层级,例如:

scp -r /hadoop安装路径/etc/hadoop/ 用户名:主机名(或ip) /hadoop安装路径/etc/

这样就会覆盖已存在的文件。

启动Hadoop

格式化dfs

在启动前需要格式化dfs,命令如下:

hadoop namenode -formate

当出现提升"success"时表示格式化成功。

需要注意的是出现如下内容并不表示格式化失败,因为这不是一个错误:

启动hadoop

执行以下命令

start-all

可以看到hadoop的启动过程,并且启动完成后,我们可以用jps命令来查看有哪些服务正在运行:

同时,我们也可以在集群中的其他服务器中使用jps命令来查看datanode的启动情况。

查看web界面

Hadoop的web界面的端口为50070,在浏览器输入:

http://hadoop.master:50070即可看到如下界面:

然后进入Datanode菜单下,可以看到集群中的三个数据节点的情况,包括状态,可用容量等等:

然后我们可以在“Browse the file system”中查看dfs中的内容:

(若没有文件或文件夹的话,则显示是空的)

同时我们也可以在这个界面中上传和删除文件,以及查看文件部分内容和下载文件。

**注意:**若上传文件或者创建文件夹出现如下错误:

Permission denied: user=dr.who, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

则需要修改权限,命令如下:

./hadoop fs -chmod 777 /

运行Hadoop自带的word count例子

以上Hadoop的配置就算基本完成了,然后来运行以下Hadoop自带的一个单词个数统计的一个例子。

首先我们创建一个文件text.txt,写入一些单词,内容如下:

hello word
hello hadoop
hello hbase
hadoop

然后把这个文件上传到dfs上的一个目录下面(可以使用web界面上传或者登陆到服务器上用hadoop fs -put命令上传),例如我上传到/test/input目录下:

然后我们用Hadoop自带的一个jar包来运行一下单词统计程序:

cd到/Hadoop安装目录/share/hadoop/mapreduce下,执行命令:

hadoop jar hadoop-mapreduce-examples-2.9.2.ja wordcount /test/input /test/output

因为文件和小,所以很快就运行完成,然后在/output目录下就生成了一个输出文件,打开这个文件可以看到内容如下:

说明这个例子运行成功了。

posted @ 2019-03-28 21:26  SEC.VIP_网络安全服务  阅读(136)  评论(0编辑  收藏  举报