如今的Hadoop不仅声名远扬,影响力在apache的开源项目中也占据着头把交椅,国内外已有非常的成功应用。就目前来说,我对Hadoop整个体系连个大概的了解都说不上,个人倒是老早就想深入学习这套体系,本地磁盘上的安装包更是早就下载好了,不过文件保存日期久远的我自己都不好意思看。

  值此新年伊始,欣喜地看到tigerfish老师第四期hadoop课程开班,我也赶紧报名参与,希望能在tigerfish老师的指导下,专心听课认真做题,争取在课程结业的时候,使自己对hadoop的了解能达到入门的水平。

  Hadoop如今已经成长为一套体系,包含的组件众多,要学习的知识很多,目前互联网上的各类参考资料更是浩瀚,遇到这种情况很多朋友可能都在苦恼不知道该从何开始。就我来说倒没有这方面的烦恼,从来这么多年,接触的东西也很多,但不管要学习什么,我的学习路径很像那些爱玩游戏的孩子,接触到一个感兴趣的新东西,第一件事并不翻开它的说明书,而是先拿在手里把玩一番,遇着不懂的就去找专门应对方案。等有大致了解之后,再会系统的阅读官方提供的文档。

  就Hadoop来说,在使用之前我们得首先有一套环境,因此这篇文章就算是我初次接触Hadoop的一个记录吧,先跟三思一起来了解到底什么是hadoop,而后我们再亲自动手,部署一套Hadoop集群出来。

0、基础部分扫盲

0.0 关于Hadoop

  听说过Doug Cutting没,听说过Lucene没,听说过Nutch没,什么,都没听过?哎,我真不知道该如何向你解释。GOOGLE听说过没,这个总归有印象了吧。为什么要提GOOGLE呢,按照tigerfish老师所说,Hadoop就是山寨版的GOOGLE搜索。

  很多朋友都好奇GOOGLE/BAIDU这类搜索引擎,是怎么实现这么高效的查询速度,用的什么数据库等等,GOOGLE当然不会把自己的核心技术全面公开,即使对它最了解的非GOOGLE人士,也只能用连蒙带猜的方式推测,因此能回答这个问题的人怕是不多的。不过我想说的是,HADOOP实现了一套类似GOOGLE的解决方案,如果你了解了它,那么对于前面的问题想必也就有答案了。

  前面提示的Nutch/Lucene又是怎么回事儿呢,这部分内容暂不多扯,待后面我八卦些小道消息再论。如有素材欢迎提供。

0.1 关于Hadoop家族

  Hadoop的核心模块有两个:HDFS(Hadoop Distributed Filesystem)和MapReduce,前者提供存储,后者负责计算,可谓珠联璧合,除此之后还有:

  • Hbase:类似Google BigTable的分布式列式数据库;
  • Hive:基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成数据库表,并且提供SQL查询功能,能够将SQL语句转换成MapReduce任务运行;
  • Pig:与Hive类似也是基于hadoop的扩展项目,据说本意是为了简化hadoop编程,提供一个高度抽象的数据处理方式,具体能够多么简化我也不知道,有机会接触了再说;
  • ZooKeeper:分布式系统中的资源管理系统,可用于维护集群中的资源调度;

  其它也许还有,以后必将更多,Hadoop做为Apache基金会的顶级项目,自身也是高速发展。

0.2 hadoop的体系结构

  Hadoop集群中从大的粒度来看可以分为两种角色:Master和Slave,其中master又可以分为主master和辅助master,一个节点属于什么角色,是由其提供的服务决定的:

  • 主Master:主要提供下列服务:
    • NameNode:管理HDFS命名空间;
    • SecondaryNameNode:辅助NameNode,可视为NameNode备份,保存检查点信息,用于快速恢复NameNode;
    • JobTracker:任务分配器;
  • 辅助Master:
  • SecondaryNameNode:
  • Slave:
  • DataNode:HDFS数据存储节点;
  • TaskTracker:任务处理器;

1、准备工作

  正常情况下Hadoop集群是由多个节点组成,每个节点做为其中的一个角色承担不同的任务,比如说某个节点运行namenode,某些节点运行datanode等等,不过,用户也可以将所有的应用都放在一个节点上,这种情况尽管也可以运行,其实就称不上分布式了。可是,这种模式还不算极端,Hadoop还支持一种本地模式。

  因此归纳一下,Hadoop集群可以分三种部署方式:

  • Local Mode:这种模式不需要守护进程,主要用于开发阶段,本地调试MapReduce程序比较方便,可以采用这种模式,环境部署和维护各方面都简单;
  • Pseudo-distributed Mode:看名字就知道了,伪分布式嘛,这种就是前面说的,所有任务都运行在同一个节点上,但是部署的时候还是按照分布式的方式部署,这种模式比较适用个人测试,它对环境的要求会低一些;
  • Fully-Distributed Mode:标准模式,本文中的hadoop环境就是基于这种模式部署(一主两从的最小规模);

1.1 初始化第一个节点

  Hadoop运行需要JAVA环境,因此首先需要检查系统中是否安装的Java JDK:

    [root@hdnode3 ~]# /usr/local/jdk1.7.0_09/bin/java -version

    java version "1.7.0_09"

    Java(TM) SE Runtime Environment (build 1.7.0_09-b05)

    Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

  如果没有找到java的话,需要先安装jdk。安装包可以到SUN官网进行下载,或者直接通过yum进行安装,我这里是。

编译本地hosts文件:

    # more /etc/hosts

    127.0.0.1   localhost localhost.localdomain

    ::1         localhost localhost.localdomain 

    192.168.30.203 hdnode1

    192.168.30.204 hdnode2

    192.168.30.205 hdnode3

创建用户:

    # useradd grid

    # passwd grid

    Changing password for user grid.

    New password: 

    ....................

解压缩hadoop安装包到指定目录下:

    # tar xvfz /data/software/hadoop-0.20.2.tar.gz -C /usr/local/

不知道哪里下载安装包?http://www.apache.org/dyn/closer.cgi/hadoop/common/ 这里瞅一瞅。

修改文件夹的用户属主:

    # chown grid:grid /usr/local/hadoop-0.20.2/ -R

生成节点间密钥,切换到grid用户下操作:

    [root@hdnode1 ~]# su - grid

    [grid@hdnode1 ~]$ ssh-keygen -t rsa

    Generating public/private rsa key pair.

    Enter file in which to save the key (/home/grid/.ssh/id_rsa): 

    Created directory ¨/home/grid/.ssh¨.

    Enter passphrase (empty for no passphrase): 

    Enter same passphrase again: 

    Your identification has been saved in /home/grid/.ssh/id_rsa.

    Your public key has been saved in /home/grid/.ssh/id_rsa.pub.

    The key fingerprint is:

    b6:17:4b:7a:e1:7d:04:e6:01:49:bc:61:72:fb:b6:f3 grid@hdnode1

    The key¨s randomart image is:

    +--[ RSA 2048]----+

    |         oo.     |

    |        . *.     |

    |         + ++    |

    |          oo o   |

    |        S +.. .  |

    |       . = =o.   |

    |        o =....  |

    |         o  o.   |

    |             oE  |

    +-----------------+

而后将公钥信息保存到authorized_keys文件中:

    [grid@hdnode1 ~]$ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

注意修改authorized_keys文件权限为600,否则节点间无密码访问仍有可能失败。

配置grid用户环境变量:

    [grid@hdnode1 ~]$ vi ~/.bash_profile 

增加下列内容:

    export JAVA_HOME=/usr/local/jdk1.7.0_09

    export HADOOP_HOME=/usr/local/hadoop-0.20.2

    PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:$PATH:$HOME/bin

1.2 初始化第二和第三节点

在hdnode2和hdnode3节点上分别重复上面的步骤。

1.3 配置节点间无密码访问

现在咱们先将hdnode2和hdnode3两个节点的公钥信息全部输出到hdnode1的authorized_keys文件中:

    [grid@hdnode1 ~]$ ssh hdnode2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

    The authenticity of host ¨hdnode2 (192.168.30.204)¨ can¨t be established.

    RSA key fingerprint is 2d:e3:a1:b8:7e:5e:06:ae:04:55:73:73:13:24:94:c8.

    Are you sure you want to continue connecting (yes/no)? yes

    Warning: Permanently added ¨hdnode2,192.168.30.204¨ (RSA) to the list of known hosts.

    grid@hdnode2¨s password: 

    [grid@hdnode1 ~]$ ssh hdnode3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

    The authenticity of host ¨hdnode3 (192.168.30.205)¨ can¨t be established.

    RSA key fingerprint is 2d:e3:a1:b8:7e:5e:06:ae:04:55:73:73:13:24:94:c8.

    Are you sure you want to continue connecting (yes/no)? yes

    Warning: Permanently added ¨hdnode3,192.168.30.205¨ (RSA) to the list of known hosts.

    grid@hdnode3¨s password: 

修改认证密钥文件的权限为只有属主用户可读写:

    [grid@hdnode1 ~]$ chmod 600 .ssh/authorized_keys 

然后将authorized_keys文件复制到其它节点,直接执行scp命令就可以:

    [grid@hdnode1 ~]$ scp ~/.ssh/authorized_keys hdnode2:/home/grid/.ssh/authorized_keys 

    grid@hdnode2¨s password: 

    authorized_keys                                                                                                                       100% 1182     1.2KB/s   00:00    

    [grid@hdnode1 ~]$ scp ~/.ssh/authorized_keys hdnode3:/home/grid/.ssh/authorized_keys 

    grid@hdnode3¨s password: 

    authorized_keys                                                                                                                       100% 1182     1.2KB/s   00:00    

接下来,如果有兴趣的话可以在各节点试一下ssh连接其它节点,应该不需要输入密码了:

    [grid@hdnode1 ~]$ ssh hdnode1 date

    Tue Jan 29 16:09:49 CST 2013

    [grid@hdnode1 ~]$ ssh hdnode2 date

    Tue Jan 29 16:09:51 CST 2013

    [grid@hdnode1 ~]$ ssh hdnode3 date

    Tue Jan 29 16:09:53 CST 2013

注意喽,第一次访问时会提示,将要访问的节点加入到已知主机列表,这是正常的,输入yes同意,后面再访问就不会再提示了。

至此,咱们这个无密码访问就算配置好了。