本文为小白搭建Hadoop集群历程的记录,相信比网上绝大多数教程都更为详细具体,能学到较多知识,希望对广大的hadoop学习道友有所帮助!

软件准备:Vmware workstation pro(自己下载), jdk-7u80-linux-x64.tar.gz,hadoop-2.7.0.tar.gz,centos6.5

上述软件下载链接: https://pan.baidu.com/s/1Cj8MdmPOTdwU1rb93h9n3A   提取码:1hvy

部署:

主机名所含账户IP对应角色所需功能
masterroot, CAI192.168.137.130nameNodessh, perl编译环境
slave1(克隆机)root, CAI192.168.137.131dataNode1ssh, perl编译环境
slave2(克隆机)root, CAI192.168.137.132dataNode2ssh, perl编译环境

安装步骤概览:

首先安装Vmware,然后新建一台虚拟机,将集群所有节点的所需的相同软件和配置都在此台虚拟机上做好,下文第二到第七大步骤都是为此操作,从第八大步骤开始由此虚拟机克隆出另外两台虚拟机,最后3台虚拟机进行各自所需的配置。

 

一、Vmware14.1的安装:

参考博客:https://blog.csdn.net/qq_32786873/article/details/78725247

二、CentOS6.5的安装(安装后不要急着克隆,先把一些共同配置和软件装好):

配置:内存1.2G,硬盘40G,注意不要选择中文简体的语言(不利于开发和使用),选择Minimal Desktop模式安装:

主机名为:master ,    创建使用账户:CAI

安装成功后,进入终端,赋予CAI用户所有权限,切换进入root,命令:

chmod u+w  /etc/sudoers , 此命令修改文件的读写权限

vim /etc/sudoers

三、安装VMtools(实现随意在主机和客户虚拟机或虚拟机之间复制黏贴文件或文字):

1、首先将VMware安装目录下的linux.iso(vmtool镜像文件),通过CD-ROM装载上来;

2、sudo mkdir /mnt/cdrom, 创建挂载的目录

3、挂载:sudo mount -o remount,rw /dev/cdrom /mnt/cdrom (这步不行就打开桌面的光盘直接右键copy吧)

4、cp /mnt/cdrom/VMwareTools-x.x.0-xxxxxx.tar.gz /root/vm.tar.gz, 重命名

5、到/root目录下,执行 tar -xzf vm.tar.gz, 输入“ls”查看文件,可发现新增目录“vmware-tools-distrib”。

6、输入“cd vmware-tools-distrib/”进入名为“vmware-tools-distrib”的目录,输入“./vmware-install.pl”尝试安装,出现错误“-bash:                ./vmware-install.pl: /usr/bin/per: bad interpreter: No such file or directory”,表明未安装编译环境。(错误自行解决)

7、在“vmware-tools-distrib”目录下输入“./vmware-install.pl”开始安装,基本上按回车键即可,直到安装完毕。

8、第一次运行时需运行“/usr/bin/vmware-config-tools.pl”命令配置VMware Tools,按回车键直接运行。

9、输入"/usr/bin/vmware-user"启动vmware用户进程,并输入”startx“启动图形界面,不要管出现的错误,重启虚拟机即可。

10、选择主机文件并摁住鼠标左键不放,尝试拖动文件到虚拟机。

四、初步配置master的IP

       因为后面要用到yum命令,所以得先配一下网络,使得master能上外网,NAT上网模式。

      1、本人用的是WiFi,在主机网络适配器的无线网卡上设置网络共享:

             

2、在VMare菜单栏的‘编辑’菜单下,可以打开虚拟网络编辑器,配置如下:

              

              

3、在master虚拟机的网络连接设置静态IP,网卡为eth0

              

        完后便可以上网了。

五、安装JDK

1、有了vmtools,可以愉快的将安装包jdk-7u80-linux-x64.tar.gz拖动到虚拟机任意文件夹

2、卸载自带的openjdk,切换到root账户

     [root@master /]# rpm -qa|grep jdk
     java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
     java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

     [root@master /]# yum -y remove java java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64 

3、解压安装包,并修改配置系统变量:

     [root@master opt]# tar -zxvf /home/CAI/Down*/jdk-7u80-linux-x64.tar.gz -C /opt

     [root@master opt]# vim /etc/profile

     在最顶部添加内容:

     #set jdk
     export JAVA_HOME=/opt/jdk1.7.0_80
     export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib
     export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

    保存退出,运行:

    [root@master opt]# source /etc/profile

    [root@master opt]# update-alternatives --install /usr/bin/java java /opt/jdk1.7.0_80/bin/java 60
    [root@master opt]# update-alternatives --config java

    输入新配置的jdk序号:1

 至此,JDK安装完成。

六、关闭防火墙

     永久关闭防火墙:chkconfig --level 35 iptables off

     永久关闭selinux:

               vim /etc/selinux/config

               找到SELINUX 行修改成为:SELINUX=disabled

七、安装ssh

     CentOS6.5安装SSH和配置,参考博客:https://blog.csdn.net/xushouwei/article/details/51705699

     主要进行以下命令:

     [root@master opt]# rpm -qa | grep ssh

     [root@master opt]# yum install openssh-server

     [root@master opt]# /etc/init.d/sshd status

     [root@master opt]# netstat -antp | grep sshd

     [root@master opt]# chkconfig sshd on 

八、克隆两台虚拟机,调整克隆机器的内存

     创建完整克隆的虚拟机,启动克隆机,检验是否含原虚拟机的配置:VMtools具备的主客机copy、防火墙配置 

     vim  /etc/selinux/config、查看ssh运行状态/etc/init.d/sshd status。

     根据需要自行调整内存。

九、配置每台机器的主机名和IP

     这一步要先说明的是,克隆的虚拟机在Network Connections中可看到两张网卡,其中System eth0为原虚拟机的网卡copy,没有实际意义(MAC地址跟原虚拟机一样),可以删除掉。而Auto eth1才是克隆机的真正网卡,可以在终端输入ifconfig来查看MAC地址和此处Auto eth1的MAC地址对比来验证。

   

原虚拟机master的配置:

1、在菜单Network Connections中看到只有一张网卡System eth0,配置此网卡就行

2、配置网卡信息:

      [root@master /]# vim /etc/sysconfig/network-scripts/ifcfg-eth0

       

      修改hosts:

      [CAI@master network-scripts]$ sudo vim /etc/hosts

克隆机上的配置:

1、在菜单Network Connections中删除System eth0,此时 /etc/sysconfig/network-scripts/不再有ifcfg-eth0的配置文件了

2、把Auto eth1改成自己的System eth0网卡,并且让ifconfig也显示eth0而不是eth1 :

[CAI@master network-scripts]$ sudo vim /etc/udev/rules.d/70-persistent-net.rules

重新创建ifcfg-eth0文件,并写入如下图的配置:

[CAI@master network-scripts]$ sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0

[CAI@master network-scripts]$ sudo service network restart

[CAI@master network-scripts]$ sudo service NetworkManager restart

此步过后,菜单Network Connections中的Auto eth1变为了System eth0,但如果ifconfig命令下,eth1没有改变为eth0,可以等后面的主机名改为slave1(克隆机的名称由master变为slave1)后重启系统,重启后则生效了,亲测有效。

修改主机名

sudo vim /etc/sysconfig/network

修改hosts:

[CAI@master network-scripts]$ sudo vim /etc/hosts

重启系统,至此克隆机的网络配置好了。其他克隆机照此方法一一更改即可。

十、配置ssh,实现集群节点之间两两都可无密码登陆

    无密码登陆在master上,通过 ssh slave1就可以登陆到对方计算机上, 而且不用输入密码;最终要实现两两节点无秘登录

    1、三台虚拟机上,都在CAI账户下,使用 ssh-keygen -t rsa,一路按回车就行了。

          刚才都作了什么?主要是设置ssh的密钥和密钥的存放路径。 路径为~/.ssh(/home/CAI/.ssh)下。

          打开~/.ssh 下面有两个文件

          id_rsa,私钥

          id_rsa.pub,公钥  

    2、下面就是关键的地方了(原理参考https://blog.csdn.net/csm201314/article/details/78453579公钥登录部分)

    ①在master上将公钥id_rsa.pub写入authorized_keys,执行后就多出一个authorized_keys文件。命令:

         [CAI@master ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

         注:cat将公钥id_rsa.pub追加到authorized_keys文件中,如果authorized_keys不存在,则先创建再追加

        修改authorized_keys文件的权限,命令:chmod 644 authorized_keys   

         此步后,可以无密码登录master自己了。公钥就像自创的木马,谁拿着我的木马,我就可以无秘登录谁(自己拿着自己的木          马,那就可以无秘登录自己,当然,第一次登录还是要密码的)。

    ②将master上的authorized_keys放到虚拟机slave1的/home/CAI/.ssh目录下。

        命令格式为:scp authorized_keys 远程主机用户名@远程主机名或ip:存放路径。

        [CAI@master ~]$ scp ~/.ssh/authorized_keys CAI@slave1:~/.ssh
        The authenticity of host 'slave1 (192.168.137.131)' can't be established.
        RSA key fingerprint is 0c:ba:f1:3a:2a:95:00:79:98:f4:a1:97:d1:c7:96:15.
        Are you sure you want to continue connecting (yes/no)? yes
        Warning: Permanently added 'slave1,192.168.137.131' (RSA) to the list of known hosts.
        CAI@slave1's password: 
        authorized_keys                                                            100%  392     0.4KB/s   00:00 

       上面嫩绿色部分不用管,后面输入yes,输入CAI@slave2的密码即可传输成功。

    ③修改slave1上authorized_keys文件的权限,命令:chmod 644 ~/.ssh/authorized_keys

    ④把slave1上的公钥id_rsa.pub也追加到刚才传过来的authorized_keys文件中:

        [CAI@slave1 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

        然后,将此包含了两个公钥的authorized_keys传给slave2:

        [CAI@slave1 .ssh]$ scp ~/.ssh/authorized_keys CAI@slave2:~/.ssh

        修改slave2上authorized_keys文件的权限,命令:chmod 644 authorized_keys

        把slave2上的公钥id_rsa.pub同样追加到刚才传过来的authorized_keys文件中:

        [CAI@slave2 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

        此时slave2上的authorized_keys就包含集群三个节点的公钥了,谁都可以无秘登录slave2了!

     ⑤删除master和slave1节点上的authorized_keys,然后将slave2上的authorized_keys分别传到master和slave1,并修改                        authorized_keys文件的权限,命令:chmod 644 authorized_keys

      ⑥两两登录一下,消除第一次登录密码

这样集群三个节点都有含所有公钥的authorized_keys,两两之间可以无秘登录了!

十一、在master上安装配置Hadoop-2.7.0

以下步骤尽量在账户CAI下操作,因为以后操作Hadoop以及节点间传输文件的账户都是CAI,用root操作步骤可能导致某些文件只有root才能访问,导致master节点CAI账户启动Hadoop会遇上权限问题。修改linux系统配置文件可以用root账户。

首先在master上进行以下配置步骤,然后将配置好的hadoop文件传到各个集群的其他节点即可,不需要一个个配置。

第1步:将hadoop-2.7.0.tar.gz文件拷贝到/home/CAI/Downloads/目录下
第2步:解压Hadoop,注意,解压要在root账户下或者加sudo。
[CAI@master ~]# sudo tar -zxvf /home/CAI/Downloads/hadoop-2.7.0.tar.gz -C /opt
重命名文件:[CAI@master ~]# sudo mv /opt/hadoop-2.7.0 /opt/hadoop

第3步:配置系统变量
[CAI@master ~]#sudo vim /etc/profile

#set hadoop path
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

[CAI@master ~]#source /etc/profile
第4步:更改/opt/hadoop/etc/hadoop/目录下的core-site.xml, hdfs-site.xml, mapred-site.xml,hadoop-env.sh,slaves 文件。

[CAI@master hadoop]# sudo vim /opt/hadoop/etc/hadoop/hadoop-env.sh

添加内容:
# set JAVA_HOME in this file, so that it is correctly defined on
# remote nodes.

# The java implementation to use.
export JAVA_HOME=/opt/
jdk1.7.0_80
前面三行注释部分是文件本身就有的,贴出来是为了告知读者在哪个地方添加,给出上下文
第5步:编辑masters文件,本人的版本没有这个文件,网友说这个文件不重要,没有则不用配置。
第6步:编辑slaves文件:
[CAI@master ~]#sudo vim /opt/hadoop/etc/hadoop/slaves
清空加入从节点的名字
slave1
slave2
第7步:[CAI@master ~]$ sudo vim /opt/hadoop/etc/hadoop/core-site.xml
<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://master:9000</value>
   </property>
   <property>
      <name>hadoop.tmp.dir</name>
      <value>/opt/hadoop/tmp</value>
   </property>
</configuration>

第8步:[CAI@master ~]$ sudo vim /opt/hadoop/etc/hadoop/hdfs-site.xml

添加内容(replication默认是3,如果不修改,datanode少于三台就会报错):

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/opt/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/opt/hadoop/dfs/data</value>
    </property>
</configuration>

第9步:mapred-site.xml ,本人的版本没有这个文件,于是将模板文件重命名为mapred-site.xml,注意是重命名而不是复制,复制的话,复制出来的文件所属用户是root,那CAI账户就无法读取该文件:

[CAI@master hadoop]# sudo mv /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapred-site.xml

[CAI@master hadoop]#sudo vim /opt/hadoop/etc/hadoop/mapred-site.xml

添加内容:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19888</value>
    </property>
</configuration>

第10步:[CAI@master ~]$ sudo vim /opt/hadoop/etc/hadoop/yarn-site.xml

[CAI@master ~]# sudo vim /opt/hadoop/etc/hadoop/yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>

    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
    </property>
</configuration>

 

十二:将hadoop分发到各个slave节点(因为权限问题,先将该文件夹分发到各个节点的/home/CAI目录下,再进入各个节点用ROOT将文件夹移到/opt下)

[CAI@master ~]$ scp -r /opt/hadoop CAI@slave1:/home/CAI/hadoop,

进入该节点执行:[root@slave1 ~]# mv /home/CAI/hadoop /opt/

[CAI@master ~]$ scp -r /opt/hadoop CAI@slave2:/home/CAI/hadoop ,

进入该节点执行:[root@slave2 ~]# mv /home/CAI/hadoop /opt/

同时将上面第十一大节中的第三步操作(添加hadoop相关环境变量),在slave1和slave2上也操作一遍。

十三:在master节点格式化hdfs,启动hadoop

格式化之前,先要给/opt/hadoop/(hadoop安装目录)赋予新建文件夹的权利,不然CAI用户无法格式化hdfs, 因为格式化hdfs或启动hadoop涉及到创建文件夹或文件的操作,本人没操作这一步就格式化hdfs,遇到了如下错误:

java.io.IOException: Cannot create directory /opt/hadoop/tmp/dfs/name/current 

在各个节点的CAI账户下,进行如下赋权:

[CAI@master .ssh]$ sudo chmod -R a+w /opt/hadoop/

master节点中,格式化hdfs:

[CAI@master .ssh]$ /opt/hadoop/bin/hdfs namenode -format

master节点中,启动hadoop的所有守护进程:

[CAI@master .ssh]$ /opt/hadoop/sbin/start-all.sh

十四、hadoop集群查看

1、在master节点,打开火狐浏览器,登录http://192.168.137.130:8088/

2、登录http://192.168.137.130:50070/

 

躺坑2天多时间,终于将hadoop集群搭建完成!!

 


 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐