[Hadoop] Linux(CentOS6.4)下Hadoop单机/集群的安装和配置

准备工作

系统安装环境:Linux CentOS 32bit系统。

两台相同环境的Liunx虚拟机,Master  IP:192.168.15.129,Slave IP:192.168.15.131。在进行单机上的Hadoop安装配置时,使用Master主机。

两台主机中都配置完成了SSH无密码登录,以满足配置Hadoop集群时的要求。Linux系统环境下配置SSH无密码登录,详见:[Linux] CentOS6.4配置SSH无密码登录

Linux单机环境中Hadoop的安装与配置

1. 下载Hadoop安装文件

在之前的一片文章中提到过Hadoop各个版本的下载路径:Hadoop Releases,详见:[Spark] Windows环境下搭建Spark环境。这里仍使用hadoop-2.6.4的版本,并将下载好的安装文件拷贝到linux Master虚拟机中,存放目录为:/home/hadoop/Desktop/hadoop-2.6.4.tar.gz

使用root用户登录Master主机,创建hadoop安装目录/usr/hadoop/:

sudo mkdir /usr/hadoop

解压hadoop安装文件到安装目录:

sudo tar -zxvf /home/hadoop/Desktop/hadoop-2.6.4.tar.gz -C /usr/hadoop

2. 单机hadoop配置

Hadoop默认配置是以非分布式模式运行,即单Java进程,方便进行调试。可以执行附带的例子WordCount来感受下Hadoop的运行。例子将Hadoop的配置文件作为输入文件,统计符合正则表达式dfs[a-z.]+的单词的出现次数

使用用户:root

工作目录:/usr/hadoop/hadoop-2.6.4/

cd /usr/hadoop/hadoop-2.6.4
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar grep input output 'dfs[a-z.]+'
cat ./output/*

执行成功后,在输出文件夹中查看相关信息,输出的结果是符合上述正则表达式的单词dfsadmin出现了一次。

image

在次运行会提示出错,需要删除:./output:

rm -R ./output

3. 单机hadoop伪分布式配置

这里将该部分内容单独的写成了一章,详情见:[Hadoop] Linux(CentOS6.4)单机Hadoop伪分布式配置

Hadoop集群的配置安装

Hadoop集群安装配置过程基本和单机版是一样的,主要是在配置文件方面有所区别,以及ssh无密登陆要求master和slave能够互相无密登陆(!!!重要说明:因为之前作为Slave的主机192.168.15.131的网络配置异常,因此,之后的操作将使用IP:192.168.15.139的主机作为Slave,继续后面的设置,除了IP改变外,其他的配置均不变!!

Liunx虚拟机环境:

  • master  IP:192.168.15.129
  • slave IP:192.168.15.139

准备工作:

分别修改master主机和slave主机中的hostname以方便区分集群的配置环境。在master主机中,修改/etc/hosts文件(需要root用户),添加集群中所有的主机信息(这里只有两台主机):

image

文件内容如下,高亮文本处为新增加的部分:

image

修改上述文件完成后,修改重新启动虚拟机才能生效。同时注意:同样的配置需要在集群中所有主机中进行!

提示:在有些修改主机hostname的方式中,需要修改/etc/hostname文件,将本机的ip和hostname添加到该文件中。但在我的实验环境下,该目录中不存在/hostname文件。但经过测试,只需要修改hosts文件即可满足要求,还有临时修改hostname的方式,详见页面最后的参考资料。

配置完成master主机和slave主机的hostname之后,对相互主机间的ssh无密码登录进行测试,保证相互的SSH无密码可以正常登录

# master主机中
ssh slave
# slave主机中
ssh master

hadoop集群设置需要修改的配置文件(所在目录etc/hadoop/)如下:

实现步骤:首先在Master主机上,配置好需要修改的配置文件,在将Master主机上配置好的hadoop文件夹打包,发送至各个Slave主机上,进行解压安装。

1. Master主机Hadoop集群配置

说明:因为在Master主机中已经进行了hadoop伪分布式的配置,因此,对hadoop-env.sh、core-site.xml、mapred-site.xml.template、hdfs-site.xml四个文件进行修改。

在将Master主机从伪分布式转换成真实的集群环境时,除了在hadoop-evn.sh配置文件中修改的JAVA_HOME变量不改变,其他三个文件均还原成默认内容之后,重新配置(之前有原始文件的备份),以避免不必要的冲突。

同时,在伪分布式环境中,core-site.xml配置文件中设置的“hadoop.tmp.dir”目录为:file:/home/hadoop/hadoop/tmp

测试:在真正集群环境中,“hadoop.tmp.dir”设置为:file:/usr/hadoop/hadoop-2.6.4/tmp,与伪静态分布环境中的配置不同(这里也是试着测试将两种环境的配置文件中的tmp目录设置成不同,是否会对集群的运行产生影响。

而且,在hdfs-site.xml文件中设置“dfs.namenode.name.dir”,“dfs.datanode.data.dir”变量一般为“hadoop.tmp.dir”的子目录,因此,两种环境的目录也不同。

补充结论:这里在配置过程中,由于出现一些状况,虽然删除了伪分布式中创建的临时文件,但不知对hadoop集群的正常运行有无影响。因此,该问题仍属于未测状态!)

master主机中修改hadoop配置文件如下:

工作目录:/usr/hadoop/hadoop-2.6.4/

登录用户:hadoop(保证/usr/hadoop目录下所有文件夹和文件的权限属于hadoop:hadoop)

(1) slave文件

image

代码如下:

slave

(2) core-site.xml

image

代码如下:

<configuration>
<property>
	<name>hadoop.tmp.dir</name>
	<value>file:/usr/hadoop/hadoop-2.6.4/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://master:9000</value>
</property>
</configuration>

(3) hdfs-site.xml

image

代码如下:

<configuration>
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:50090</value>
</property>
    <property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/hadoop/hadoop-2.6.4/tmp/dfs/name</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/hadoop/hadoop-2.6.4/tmp/dfs/data</value>
</property>
</configuration>

(4) mapre-site.xml

image

代码如下:

<configuration>
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
</configuration>

(5) yarn-site.xml

image

代码如下:

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
	<name>yarn.resourcemanager.hostname</name>
    	<value>master</value>
</property>
<property>
    	<name>yarn.nodemanager.aux-services</name>
    	<value>mapreduce_shuffle</value>
</property>
</configuration>

2. 打包Master主机上配置完成的hadoop文件夹,发送至各个Slave机器上

Master主机中的hadoop配置完成之后,将所在的目录文件(/usr/hadoop)打包,使用scp命令发送至slave主机中,进行解压:

image

命令:

cd /usr
sudo tar -zcf ./hadoop.tar.gz ./hadoop

发送至slave主机中/home/hadoop/tmp目录中:

image

在slave主机中,解压hadoop.tar.gz文件至/usr/目录下(与master主机中的hadoop解压目录相同):

sudo tar -zxf /home/hadoop/tmp/hadoop.tar.gz -C /usr
sudo chown -R hadoop:hadoop /usr/hadoop

3. 在Master主机上启动hadoop集群

工作目录:/usr/hadoop/hadoop-2.6.4

(1) 初始化NameNode

bin/hdfs namenode -format 

出现如下信息,说明初始化成功:

image

(2) 启动Hadoop守护进程

sbin/start-dfs.sh

(3) 启动集群管理器yarn

sbin/start-yarn.sh

4. 通过jps命令查看集群中各个节点所启动的进程:

在Master主机中:

image

在Slave主机中:启动了DataNode和NodeManager进程

image

5. 也可以使用bin/hdfs dfsadmin -report查看DataNode是否正常启动:

image

这里集群没有正常启动,同样,可以通过查看hadoop的日志记录,发现错误并解决:

image

也可以通过Web页面看到查看DataNode和NameNode的状态:http://master:50070/

发现问题:

通过查看slave主机(因为datanode的启动在slave节点上)中的/usr/hadoop/hadoop-2.6.4/logs/hadoop-hadoop-datanode-slave.log的日志文件,发现:

image

解决问题:

详细的解决方法见另一篇文章:

[Hadoop] 解决Hadoop集群启动时DataNode: Problem connecting to server的问题

解决问题后,Hadoop集群正常启动如下图:

image

6. 关闭hadoop集群也是在Master主机上运行:

sbin/stop-dfs.sh
sbin/stop-yarn.sh

至此,hadoop集群配置成功。之后,进行spark集群的配置详解。


参考资料