如今的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
创建用户:
解压缩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同意,后面再访问就不会再提示了。
至此,咱们这个无密码访问就算配置好了。 |