本案例使用VMware Workstation Pro虚拟机创建服务器来搭建Hadoop集群,所用软件及版本及简要配置方法如下:
1.VMware Workstation Pro15.5.1(推荐使用15以上版本,感觉优化比14好了许多)
2.Ubuntu16.04 64bit(3台,用户名均为Hadoop,主机名分别为node-1,node-2,node-3)
注意:三台虚拟机用户名需要一致,也可以对三台虚拟机分别再创建一个用户。
163 ubuntu镜像下载地址:http://mirrors.163.com/ubuntu-releases/
Ubuntu设置主机名:
sudo vim /etc/hostname
sudo vim /etc/hosts
将原主机名修改为新的主机名,然后保存退出重启即可;
Centos设置主机名:
vim /etc/sysconfig/network
修改为:
NETWORKING=yes
HOSTNAME=node-1
然后保存退出重启即可。
注意:不推荐使用类似方式修改用户名,很大程度上会造成系统出错!
3.Hadoop-2.7.1(推荐使用Hadoop-2.7.4)
4.JDK:jdk-8u162-linux-x64
5.网络环境:均采用NAT方式联网。(可通过 ifconfig 网卡名 IP地址
进行ip地址配置 或者通过编辑ifcfg-eth*配置文件进行配置,配置后重启即可生效)
6.操作顺序:可以先在一台虚拟机上配置好源,安装好JDK,再利用该虚拟机进行克隆,生成另外两台虚拟机,然后分别修改其主机名,IP地址。再进行SSH server,hadoop安装
#上传jdk安装包
jdk-8u162-linux-x64.tar.gz
#解压安装包
cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
#配置环境变量/etc/profile
vim ~/.bashrc
上面命令使用vim编辑器打开了hadoop这个用户的环境变量配置文件,在这个文件的末尾位置,添加如下几行内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#刷新配置
source ~/.bashrc
可以使用如下命令查看是否安装成功:
java -version
如果能够在屏幕上返回如下信息,则说明安装成功:
hadoop@ubuntu:~$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
在克隆完成后,按照上述方法修改主机名,再修改好各自的IP地址。
这里我配置如下:
主机名 IP
node-1 192.168.255.134
node-2 192.168.255.135
node-3 192.168.255.136
在每个虚拟机上执行如下操作:
sudo vim /etc/hosts
写入:
192.168.255.134 node-1
192.168.255.135 node-2
192.168.255.136 node-3
注意:这里需要保留127.0.0.1 localhost (java环境的需要),注释掉127.0.0.1 node-1(防止后续Hadoop启动节点为127.0.0.1而不是node-1的192.168.255.134)
这里我们可以在完成配置使用ping命令进行测试
配置IP、主机名映射的目的是为了后续ssh访问时可以不使用ip进行访问,而使用主机名node-x进行访问
这个操作是要让 Master 节点可以无密码 SSH 登陆到各个节点上,进而后续hadoop集群可以无密码进行互相访问。
在每个虚拟机上安装ssh server,执行:
sudo apt-get install openssh-server
在node-1(主节点)上进行配置如下(只需要在主节点上配置即可):
#生成ssh免登陆密钥
ssh-keygen -t rsa #一直回车就行
执行完这个命令后,会生成该节点的id_ rsa (私钥)、id_ _rsa. pub (公钥)
将公钥拷贝到要免密登陆的目标机器上
ssh-copy-id node-1
ssh-copy-id node-2
ssh-copy-id node-3
这里密码也拷贝给了自己一份,这样也可对自己形成无密码登陆。
完成上述步骤,可在主节点上输入ssh node-1,ssh node-2,ssh node-3
进行测试(使用exit
退出登陆),如果登陆时不需要密码,则配置成功。
若ssh登陆,出现sign_and_send_pubkey: signing failed: agent refused operation
,并要求输入密码,则在node-1执行:
ssh-agent -s
ssh-add
然后再次尝试ssh登陆即可。
(这是因为本地的ssh-agent 是一种用来控制公要身份验证的所使用的程序,在使用ssh-keygen新添加了私钥公钥之后,需要使用ssh-add将当前新的秘钥交给agent管理。
详情:https://blog.csdn.net/diamondxiao/article/details/52488628
因为我们的hadoop是一个分布式的环境,那么我们这些组件就会运行在不同的机器上,如果说没有关闭防火墙,那么各台机器之间就需要配置相关的端口和能够访问的规则。一般在公司当中,我们所说的一个集群都是一个内外,内外之间呢防火墙都会关闭的。如果我们的集群需要布置在一个公网,那么我们的防火墙则需要打开(非常麻烦)。
Ubuntu默认是关闭防火墙(不用进行配置)
CentOS系统默认开启了防火墙
CentOS系统操作如下:
#查看防火墙状态
service iptables status
#关闭防火墙
service iptables stop
#查看防火墙开机启动状态
chkconfig iptables --list
#关闭防火墙开机启动
chkconfig iptables off
解压hadoop-2.7.1. tar. gz,目录结构如下:
bin: Hadoop 最基本的管理脚本和使用脚本的目录,这些脚本是sbin 目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop。
etc: Hadoop 配置文件所在的目录,包括core-site, xml、hdfs-site. xml、mapred-site. xml等从Hadoop1.0 继承而来的配置文件和yarn-site.xml 等Hadoop2. 0新增的配置文件。
include:对外提供的编程库头文件(具体动态库和静态库在lib 目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。
lib:该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用。
libexec:各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。
sbin: Hadoop 管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本。
share:Hadoop各个模块编译后的jar包所在的目录。
我们选择将 Hadoop 安装至 /usr/local/ 中:
sudo tar -zxf hadoop-2.7.1.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./hadoop-2.7.1/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
Hadoop安装主要就是配置文件的修改,一般在主节点进行修改,完毕后scp下发给其他各个瓜节点机器。.
文件中设置的是Hadoop运行时需要的环境变量.JAVA_HOME是必须设置的,即使我们当前的系统中设置了JAVA_ HOME,它也是不认识的,因为Hadoop即使是在本机上执行,它也是把当前的执行环境当成远程服务器。
执行:
cd etc/hadoop/
vim hadoop-env.sh
找到export JAVA_HOME=${JAVA_HOME}
这一行改为:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
文件 core-site.xml 改为下面的配置:
<!--指定HADOOP所使用的文件系统schema (URI) ,HDFS的老大(NameNode) 的地址-->
fs.defaultFS</name>
hdfs://node-1:9000</value>
</property>
<!--指定hadoop运行时产生文件的存储目录,默认/tmp/hadoop-${user.name} -->
hadoop.tmp.dir</name>
file:/usr/local/hadoop/tmp/value>
</property>
</configuration>
代码解释:
fs.defaultFS:fs文件系统默认的文件系统,其默认文件系统为linux文件系统
hdfs:// :表明使用的是hdfs的文件系统
如果是tfs://则是淘宝的文件系统,file://本地文件系统,gfs://谷歌的文件系统。
node-1:9000 :表明文件系统的老大(NameNode)在哪台机器上,端口是多少。
file:/usr/local/hadoop/data/hddata:表示hadoop文件存放位置,默认是tmp。
文件 hdfs-site.xml 改为下面的配置:
<!--指定HDFS副本的数量-->
dfs.replication</name>
2</value>
</property>
dfs.namenode.secondary.http-address</name>
node-2:50090</value>
</property>
</property>
dfs.namenode.name.dir</name>
file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
dfs.datanode.data.dir</name>
file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
代码解释:
< value> 2 value>:指定HDFS副本的数量(默认备份3,我们有3台机器,备份设置为2就行了)。
dfs.namenode.secondary.http-address:指定secondary(主节点的秘书)在哪台机器上,这里指定为node-2:50090。你也可以指定为其它机器。
file:/usr/local/hadoop/tmp/dfs/data:指定dfs文件位置。
通过文件名我们可以知道这应该是跟mapreduce相关的配置
在该目录下已经有了mapred-site.xml.template模板(但没有mapred-site.xml文件),我们可以直接改为mapred-site.xml
执行:
mv mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
修改为:
<!--指定mr运行时框架,这里指定在yarn上,默认是local -->
mapreduce.framework.name</name>
yarn</value>
</property>
mapreduce.jobhistory.address</name>
node-1:10020</value>
</property>
mapreduce.jobhistory.webapp.address</name>
node-1:19888</value>
</property>
</configuration>
通过文件名我们可以知道这应该是跟yarn相关的配置
文件 yarn-silte.xml 改为下面的配置:
<!-- 指定YARN的老大(ResourceManagep) 的地址-->
yarn.resourcemanager.hostname</name>
node-1</value>
</property>
<!--NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序默认值:-->
yarn.nodemanager.aux-services</name>
mapreduce_shuffle</value>
</property>
</configuration>
代码解释:
yarn.resourcemanager.hostname:指定YARN的老大(ResourceManagep) 的地址
< value>node-1 value>:指定为node-1,这样指定后,在hadoop启动后,那么在node-1这台机器上,就会有一个进程(角色)叫做resourcemanager,他用于yarn的控制。
slaves文件,里面写上了从节点所在的主机名字(表明在哪些机器上进行安装,默认是localhost(也就是默认只在本机上安装),我们将其删除,再写上各节点名字)
执行:
vim slaves
写入:
node-1
node-2
node-3
node-1 NameNode DataNode ResourceManager
node-2 DataNode NodeManager SecondaryNameNode
node-3 DataNode NodeManager
执行:
vim ~/.bashrc
末尾写入:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
执行 source ~/.bashrc
使变量设置生效
现在我们在一台机器上配置好了环境变量和hadoop,现在需要把这些文件下发到其它机器上。
执行:
cd /usr/local
sudo tar -zcf ~/hadoop.node-1.tar.gz ./hadoop # 先压缩再复制,如果直接传送hadoop文件夹,会提示权限不足
cd ~
scp ./hadoop.node-1.tar.gz node-2:/home/hadoop
在node-1节点上执行:(在从节点上也可以操作,但一般都是在主节点上操作)
ssh node-2
sudo tar -zxf ~/hadoop.node-1.tar.gz -C /usr/local #将文件解压到/usr/local目录下
sudo chown -R hadoop /usr/local/hadoop
vim ~/.bashrc
写入:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
source ~/.bashrc
exit
同理,对node-3进行:
scp ./hadoop.node-1.tar.gz node-3:/home/hadoop
ssh node-3
sudo tar -zxf ~/hadoop.node-1.tar.gz -C /usr/local #将文件解压到/usr/local目录下
sudo chown -R hadoop /usr/local/hadoop
vim ~/.bashrc
写入:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
source ~/.bashrc
exit
启动方式
要启动Hadoop集群,需要启动HDFS和YARN两个集群。
注意:首次启动HDFS时,必须对其进行格式化操作。(格式化只能进行一次!!!)本质上是一些清理和准备工作,因为此时的HDFS在物理.上还是不存在的。
hdfs namenode -format 或者 hadoop namenode - format
关于hdfs的格式化:
首次启动需要进行格式化。
格式化本质是进行文件系统的初始化操作创建一些自己所需要的文件。
格式化之后集群启动成功后续再也不要进行格式化。格式会对节点产生一些标识,再次格式会使标识发生改变。
格式化的操作在hdfs集群的主角色(namenode)上进行。
在node-1节点上执行:
格式化:
hdfs namenode -format
注意,在这个过程中,一定要注意是否是全程无报错IFNO。注意Error、Warning 或者 Java Exception等报错信息,一定要根据报错信息进行排查。若修复报错后,并不能直接再次执行hdfs格式,因为有可能上一次执行以及生成了hdfs的标识,一旦再次执行,必然不通过。可以通过清理hdfs缓存和logs文件,再进行格式化。
清理hdfs缓存和logs文件方式:
cd /usr/local/hadoop
./sbin/stop-dfs.sh # 关闭dfs文件系统,也可以执行./sbin/stop-all.sh关闭hadoop
rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
rm -r ./logs #删除logs文件,logs文件用于记录每次操作的数据信息
./bin/hdfs namenode -format # 重新格式化 NameNode
启动dfs集群:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
最后通过命令 jps 可以查看各个节点所启动的进程:
node-1:
node-2:
node-3:
一定要确保之前我们配置的每个节点的进程都完全启动,才算完成。
然后你也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://node-1:50070/。(这里就不作演示了)。如果不成功,可以通过logs日志排查原因。
关闭dfs集群:
stop-dfs.sh
关闭yarn集群:
stop-yarn.sh
关闭所有:
stop-all.sh
这些指令都存放在hadoop/sbin文件夹下:
可见这些都是集群式操作指令,但其实当我们运行start-dfs.sh,他会依次去调用单节点逐个启动的指令(单节点启动指令并不复杂,这里不做介绍了)。同理当我们使用其它集群操作也是如此。
====================================================================
结语:在安装hadoop时,相信大家总会遇到各种各样的问题,哪怕是不同的人使用相同的安装教程,可能出现的错误也各不相同。如果很长时间都解决不了,不妨休息一下,或者评论一下,大家一起想办法。
本次安装较多采用了该教程,如果有需要可以去看看:http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/