企业级hadoop-2.7.2集群的实施
环境介绍
操作系统:CentOS Linux release 7.1.1503 (Core),内核版本:3.10.0-229.el7.x86_64,共有10个节点,节点的ip地址分别如下:
192.168.101.66 #DNS服务器节点,同时也是hadoop的master节点
192.168.101.67
192.168.101.68
192.168.101.69
192.168.101.70
192.168.101.71
192.168.101.72
192.168.101.73
192.168.101.74
192.168.101.75
在10个节点中创建hadoop用户
在每个节点中增加一个hadoop用户,并设置其密码为:hadoop,这是一个比较好的安装习惯,没在安装一个软件时,增加一个新的相关用户去执行。
$ su # 进入root权限
$ useradd -m hadoop -G root -s /bin/bash #创建hadoop用户
$ passwd hadoop #创建hadoop用户的密码,密码是hadoop
$ visudo #在第97行之后将hadoop用户假如sudoers中,在这个文件中假如下面的内容
hadoop ALL=(ALL) NOPASSWD: ALL
安装完之后yum更新可能不能操作,使用下面的命令解除这种限制,下面是域名报错的提示:
这条指令会一直循环的输出,采用下面的方法解决
$ sudo rm -rf /var/run/yum.pid
架设DNS服务器
参见另一篇文章
架设NFS服务器
参见另一篇文章
安装JDK
首先将下面的脚本放在集群的NFS共享文件夹下,我的NFS挂载了/nfs_share,所以放在了/nfs_share下,脚本的内容如下:
#! /bin/bash
# 脚本命名为install_jdk.sh,并且赋予可可行权限
sudo tar -zxvf jdk-7u79-linux-x64.tar.gz
sudo cp -r ~/jdk1.7.0_79/ /usr/lib/jvm
sudo vim /etc/profile
source /etc/profile #导入JAVA_HOME:export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_79
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_79/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_79/bin/javac 300
sudo update-alternatives --config java
sudo update-alternatives --config javac
java
javac
java -version
sudo rm -rf jdk1.7.0_79/
sudo rm -rf jdk-7u79-linux-x64.tar.gz
#期间会让你输入数字去选择将要使用的JDK,输入jdk1.7.0_79前面的数字就行
$ sudo cp /nfs_share/install_jdk.sh /home/hadoop
$ chmod a+x install_jdk.sh
$ ./install_jdk.sh
配置集群/分布式环境
集群/分布式环境需要修改/usr/local/hadoop/etc/hadoop中的5个配置文件,更多设置项可查看官方说明,这里仅仅设置了正常启动所必须的设置项:hadoop-env.sh、yarn-env.sh、slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。
hadoop-env.sh,该文件是第一个需要修改的文件,这个文件修改的原因是指定hadoop去哪个地方找JDK,所以只需要将JDK的JAVA_HOME环境变量导入到其中便可以。
yarn-env.sh,该文件是第二个需要修改的文件,这个文件修改的原因也是指定mapreduce去哪里寻找JDK,因为毕竟整个hadoop生态系统都是用java开发的,也只是在其中添加jdk的路径就可以了。
文件slaves,将作为DataNode的主机名写入该文件,每行一个,默认为localhost,所谓在伪分布式节点配置时,节点即作为NameNode也可以作为DataNode。分布式配置可以保留localhost,也可以删掉,让Master节点近作为NameNode节点。本教程让Master节点仅仅作为NameNode节点使用,因此将文件中原来的localhost删除,在slaves中添加:
Slave1.hadoop.com #作为DataNode节点
Slave2.hadoop.com #作为DataNode节点
Slave3.hadoop.com #作为DataNode节点
SLave4.hadoop.com #作为DataNode节点
Slave5.hadoop.com #作为DataNode节点
Slave6.hadoop.com #作为DataNode节点
Slave7.hadoop.com #作为DataNode节点
Slave8.hadoop.com #作为DataNode节点
Slave9.hadoop.com #作为DataNode节点
- 将core-site.xml文件改为下面的配置:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master.hadoop.com: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,dfs.replication一般设置为3,但是我们现在有5个Slave节点,所以dfs.replication的值设置为5。
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master.hadoop.com:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>9</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(可能需要先重命名,默认文件名为madred-site.xml.template),然后配置修改如下:
首先重命名,在终端中输入:
mv mapred-site.xml.template mapred-site.xml #将前一个文件的名字修改为后者
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master.hadoop.com:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master.hadoop.com:19888</value>
</property>
</configuration>
- 修改文件yarn-site.xml如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master.hadoop.com</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 最基本的配置完成,我们需要将Master节点上的/usr/local/hadoop文件夹复制到各个节点上,因为之前在节点上跑过单节点的例子,所以在切换到集群模式之前应先删除之前临时的文件,在Master节点上执行:
$ cd /usr/local
$ sudo rm -r ./hadoop/tmp #删除hadoop临时文件
$ sudo rm -r ./hadoop/logs/* #删除日志文件
$ tar -zcf ~/hadoop.master.tar.gz ./hadoop #先压缩再执行复制
$ cd ~ #NFS文件系统实现了共享
$ sudo cp /nfs_share/hadoop.master.tar.gz /home/hadoop
- 在各个slave节点上执行下面的命令,我有5个slave节点,所有在5个节点下都应该执行下面的命令:
$ sudo rm -r /usr/local/hadoop #删掉旧的
$ sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local #解压缩到/usr/local文件夹中
$ sudo chown -R hadoop:hadoop /usr/local/hadoop #修改/usr/local/hadoop文件夹权限
首次启动hadoop
- 首次启动需要先在Master节点上执行NameNode的格式化,如果要重新格式化,要删除所有节点上tmp文件,否则是不能格式化成功的,即使成功也不会刷新状态。
$ hdfs namenode -format #首次运行需要执行格式化操作,之后不需要
-
关闭防火墙,Centos中默认开启了防火墙,在开启hadoop集群之前,需要关闭集群中每个节点的防火墙,有防火墙会导致ping得通但是telnet端口不通,从而导致DataNode启动了,但是Live datanodes为0的情况。
-
在Centos 6.x中关闭防火墙命令
$ sudo service iptables stop #关闭防火墙服务
$ sudo chkconfig iptables off #禁止防火墙开机自启动,这样就不用手动去关闭了 -
在Centos 7中需要通过如下命令(防火墙改成了firewall)
$ systemctl stop firewalld.service #关闭firewall
$ systemctl disable firewalld.service #禁止firewall开机自启动
-
启动hadoop,需要在Master上进行:
$ start-all.sh
启动的过程如果报错,可能是环境变量设置有问题,将下面我已经设置好的环境变量放到指定的部分就可以。
正常启动界面
总结
对于大型环境下集群的安装,我想首先应该做一个规划,然后写一些脚本实现自动的安装,当然这个过程中可能需要管理人员进行干预,但是应该尽量减少管理人员的干预,本文基本实现了自动化脚本的安装。