上篇博客介绍了HDFS的相关框架与理念,这篇博客介绍如何搭建Hadoop集群
我因为没有实体的多台主机,只有自己一台主机,所以决定借助VirtualBox虚拟机来搭建集群环境,我们的搭建的框架是这样的:
node1:NameNode node2:DataNode node3:DataNode node4:Secondary NameNode
(1)虚拟机搭建
我使用的OS是32位centos6.5(2.6内核),实际搭建了4个虚拟主机,参见下图红圈标识的node1-4:
至于如何创建虚拟机,请大家自行百度,下面默认大家已经装好。
(2)JDK的安装
由于hadoop是运行在java环境之上,所以我们需要为每个主机配置java环境,大家可以参照这篇博客来配置java环境
我个人在实际的过程中出现了很多问题,这里一并写出,省却大家再去找教程之苦
<1>安装的虚拟机无法上网
首先,虚拟机的Net设置需要制定为Bridge(桥接)模式,这意味这其会使用你的物理网卡;其次,需要指明eth0(物理网卡)使用dhcp协议获取ip地址,如下操作:
[root@node1]#dhclient eth0 ## 指明使用dhcp方式获取ip地址
[root@node1]#vi /etc/sysconfig/network-scripts/ifcfg-eth0
##################将其中的ONBOOT="yes"#####################
##################表示开机自动按照dhcp方式获取################
<2>如何实现虚拟机与实体主机的文件共享
可以通过安装共享文件夹(shared folder)来实现文件的互传,但是virtualBox需要安装增强功能才能使用共享文件夹,按照下面的方式可以实现:
[root@node1]#yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel-devel
[root@node1]#ln -s /usr/src/kernels/2.6.32* /usr/src/linux
###################其中的2.6.32****是你的内核版本号,这里可以使用Tab键进行补全##########
点击【设备】–>【安装增强功能】,接下来:
[root@node1]#mount /dev/cdrom /mnt
[root@node1]#sh ./VBoxLinuxAdditions.run --noexec --nox11
之后就可以设置共享文件夹了,选择自动挂载,之后重启,会在/media/下看到sf_name(name是你设置的共享文件夹的名字)这个文件夹,就可以实现主机和虚拟主机之间的文件共享
<3>如何不使用共享文件夹来进行文件间的传输
我们通过一个命令就可以实现,scp,但是scp是通过ssh服务来进行文件的传输的,所以使用前需要安装ssh
[root@node1]#yum install openssh-clients
[root@node1]#scp hadoop-1.2.1.tar.gz root@192.168.137.90:/home ##不同主机上拷贝文件
实际到这里,已经可以去安装JDK了,参考这篇博客将JDK安装好
(1)建立专属的组
[root@localhost]#groupadd hadoop
# 新建gavinzhou用户,属于hadoop用户组,附加组是root
[root@node1]#useradd –d /home/gavinzhou –m gavinzhou –g hadoop –G root
(2)修改hosts文件
[root@node1]#vi /etc/hosts
我的设置是这样的:
即各个主机对应的IP地址是(只是规划哈,到此其实node2-node4都还没有配置):
node1:192.168.137.90 node2:192.168.137.91 node3:192.168.137.92 node4:192.168.137.93
(3)配置Hadoop
<1>修改/etc/profile文件
我使用的是1.2.1的版本,首先将其解压到/home/gavinzhou/hadoop下,将其所有者改为:
[root@node1]#tar xzvf hadoop-1.2.1.bin.tar.gz
[root@node1]#chown gavinzhou:hadoop hadoop-1.2.1
[root@node1]#vi /etc/profile ##修改profile文件
<2>修改conf/core-site.xml
<3>修改conf/hdfs-site.xml
由于我们是node 2和node 3作为DataNode,所以修改副本数为2
<4>修改slaves
指明DataNode是哪些主机
<4>修改masters
指明Secondary NameNode是哪个主机,Secondary NameNode只要不和NameNode在同一台机器上即可,我们的配置是在node4上
到此,就可以进行虚拟机的复制了,复制三份,分别为node2,node3,node4
Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证,hadoop采用的是ssh的方法通过密钥验证及数据加解密的方式进行远程安全登录操作,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提高访问效率。 SH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数据的安全性和可靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。
(1)设置node1-node4的ip地址
下面示例修改node1的ip地址,其它的以此类推
[root@node1]#ifconfig eth0 192.168.137.90
(2)产生公钥和私钥
$ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa ###产生公钥和私钥在,~/.ssh下
对四个主机分别执行即可
$ cd ~/.ssh
$ cp id_rsa.pub authorized_keys ###authorized_keys名字不可更改
$ scp authorized_keys node2:/home/gavinzhou/.ssh ###将node1公钥拷贝到node2
$ scp authorized_keys node3:/home/gavinzhou/.ssh ###将node1公钥拷贝到node3
$ scp authorized_keys node4:/home/gavinzhou/.ssh ###将node1公钥拷贝到node4
至此,已经可以免密码登陆node2,node3,node4了
(1)拷贝所有hadoop配置文件到各个主机上
首先需要设置conf/hadoop-env.sh下的JAVA_HOME,大家自行修改
$cd ~/hadoop-1.2.1/conf
$scp ./* node2:/home/gavinzhou/hadoop-1.2.1/conf ##配置文件拷贝到node2
$scp ./* node3:/home/gavinzhou/hadoop-1.2.1/conf ##配置文件拷贝到node3
$scp ./* node4:/home/gavinzhou/hadoop-1.2.1/conf ##配置文件拷贝到node4
(2)格式化文件系统
$cd ~/hadoop-1.2.1/bin
$./hadoop namenode -format
(3)关闭防火墙
$service iptables stop
(4)启动hadoop集群
$cd ~/hadoop-1.2.1/bin
$./start-dfs.sh ##仅启动HDFS,暂时不启动MapReduce
结果大概是这样:
说的是启动了node2和node3作为DataNode,启动node4作为Secondary NameNode