基于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目录下就生成了一个输出文件,打开这个文件可以看到内容如下:
说明这个例子运行成功了。