最近因为要使用Apache下的开源项目mahout做一些文本数据挖掘研究,要研究Hadoop分布式平台。
本文主要介绍hadoop基本入门概念,各实体含义及其作用。
并参考使用Hadoop 的版本r0.20.203.0,介绍简单集群部署入门,以及结合IDE开发入门实践。
Hadoop简介
Hadoop官网介绍,主要三个子项目:
- Hadoop Common: Hadoop核心,The common utilities that support the other Hadoop subprojects. 原来为Hadoop Core
- Hadoop Distributed File System (HDFS™): Hadoop分布式文件系统,A distributed file system that provides high-throughput access to application data.
- Hadoop MapReduce:Hadoop MapReduce 框架, A software framework for distributed processing of large data sets on compute clusters.
以及其他有Apache掌管的Hadoop相关开源项目:
- Avro™: 新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。A data serialization system.
- Cassandra™: A scalable multi-master database with no single points of failure.
- Chukwa™: A data collection system for managing large distributed systems.
- HBase™: 类似Google BigTable的分布式NoSQL列数据库。A scalable, distributed database that supports structured data storage for large tables.
- Hive™: 数据仓库工具,由Facebook贡献。A data warehouse infrastructure that provides data summarization and ad hoc querying.
- Mahout™: A Scalable machine learning and data mining library.
- Pig™: A high-level data-flow language and execution framework for parallel computation.
- ZooKeeper™: 分布式锁设施,提供类似Google Chubby的功能,由Facebook贡献。A high-performance coordination service for distributed applications.
Hadoop部署
hadoop集群主要为三种模式:
- Standalone Mode(无集群模式)
- Pseudo-Distributed Mode(单机集群模式,又为伪分布式)
- Fully-Distributed Mode(多机集群模式)
前两种可用来做快速学习研究,参考官方部署文档可很轻松上手。仅需要下载release包:http://labs.renren.com/apache-mirror/hadoop/common/,要注意,hadoop的conf/hadoop-env.sh文件中需要配置JAVA_HOME的路径,要求为1.6+版本,JVM根目录就行。另外需要手动格式化分布式文件系统:$ bin/hadoop namenode –format
之后,启动Hadoop后,就可以通过Web界面追踪观察了:
- NameNode – http://localhost:50070/
- JobTracker – http://localhost:50030/
Hadoop实体&框架
部署完全分布式需要明确一些概念,参考:http://darxin.info/archive/2010/02/e046f531/
更详细的参考:Hadoop in Action 的2.1章节
Hadoop的核心功能有两个:HDFS与MapReduce
- 与HDFS相关的服务有NameNode、SecondaryNameNode 及DataNode;
- 与MapReduce 相关的服务有JobTracker 和TaskTracker 两种。
Hadoop集群中有两种角色:master与slave,master又分为主master与次master。其中:
- 主 master同时提供NameNode 、SecondaryNameNode 及JobTracker 三种服务;
- 次master只提供SecondaryNameNode 服务;
- 所有slave可以提供DateNode 或TaskTracker 两种服务。
一个Hadoop集群由多台电脑组成,每台电脑可作为一种或多种角色存在。
- 当使用Pseudo-Distributed Mode创建Hadoop集群时,一台电脑同时完成主master和slave两种角色的任务。
- 在Fully-Distributed Mode下,如果只有一台电脑作为master,则此电脑完成主master的任务;如果有多台电脑作为master存在,则第一台电脑完成主master的任务,其它电脑完成次master的任务。
Hadoop中的5个守护进程
hadoop启动后会有5个守护进程:namenode、secondarynamenode、datanode、jobtracker、tasktracker,参考对Hadoop in Action的第二章翻译
NameNode
NameNode就是HDFS主服务器(master), 它控制着从服务器(slave)的后台程序处理低级别的I/O任务,这些从服务器就是后面要提到的DataNode.每个集群对应一个NameNode。
NameNode是HDFS的守护者;负责跟踪文件是如何分割成小数据块的,这些小块分别都存储到了那个数据节点上,以及整个分布式文件系统的健康环境。
NameNode的功能就是内存以及I/O的集中管理。
DataNode
集群中的每一个从服务器(slave)都会运行一个DataNode后台程序。此后台程序负责读写HDFS数据块到本地的文件系统。当你想通过客户端在HDFS控制下的文件块中进行某个数据的读写操作的时候,NameNode将会告诉客户端到哪个DataNode进行此操作。客户端将直接与此DataNode服务器上的deamons程序进行通信,并操作相关的数据块。而且,DataNode之间可以相互复制数据块,作为冗余备份。
DataNode会不断的向NameNode汇报运行状态。从DataNode初始化开始,每一个DataNode要向NameNode汇报每个数据存储的数据内容。数据mapping完成后,DataNode会继续通知NameNode本地的数据变化,同时也会接收NameNode法国来的创建,移动,删除本地数据块等指令。
Secondary NameNode(在0.21.0中已经被其他节点所取代)
Secondary NameNode (SNN) 是一个用来监控HDFS状态的辅助deamon。就像NameNode一样,每一个集群都有一个SNN,并且它实际上是属于一台单独的服务器。没有一个DataNode和TaskTracker运行在统一台服务器上。SNN不同于NameNode之处在于这个进程并不接收或者记录任何实时的数据变化。但是,它会与NameNode进行通信,以便间歇的保存HDSF元数据的快照。由于NameNode是单点的,所以通过SNN的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,SNN可以及时的作为备用NameNode使用。
JobTracker
JobTracker deamon用来链接你的应用程序与Hadoop。一旦你提交代码到集群之中,JobTracker 决定哪个文件去被处理,并且为不同的task分配节点,并且监控所有运行的task。一旦某个task失败了,JobTracker就会自动重新开启这个task,也许这个task会在不同的节点上,具体运行情况取决于重启的预设值。每一个Hadoop集群只有一个JobTracker。它一般会作为集群的一个master节点。
TaskTracker
与存储进程相结合的,运算进程也遵循主从架构:TaskTrackers在各自的从节点上管理每个独立的task。
每个TaskTracker负责独立执行具体的task,而JobTracker负责分配task。虽然每个从节点上都有一个且唯一的一个TaskTracker,但是每个TaskTracker可以部署在多个JVMs之上,用于并行处理多个map以及reduce任务(task)。
TaskTracker的一个重要职责就是与JobTracker交互。如果JobTracker无法准时的获取到TaskTracker提交的信息,JobTracker就会假定TaskTracker已经崩溃了,JobTracker就会将任务分配给其他节点处理。
Hadoop集群实践
Task:对局域网中5台互连机器构建集群。
STEP1:HOST ALAIS&&SSH
HOST配置
方便管理,编辑5台机器的hosts文件:添加
12345#ip1# t1
#ip2# t2
#ip1# t3
#ip2# t4
#ip1# t5
这样,我们很容易轻松来通过别名管理节点。假定让t1作为master负责namenode 以及jobtracker
t2,t3,t4,t5作为slave作为datanode和tasktracker
制作发布ssh密钥
Hadoop启动以后,Namenode是通过SSH(SecureShell)来启动和停止各个节点上的各种守护进程的,这就需要在节点之间执行指令的时候是不需要输入密码的方式,若我们没有设置master与slave之间的信任关系,我们每次用master访问slave是要输入密码的。
么配置信任关系的具体过程如下:具体原理见:http://hi.baidu.com/shirdrn/blog/item/523aec06fb28ae7d02088193.html
假设五台机器一致使用vanjor为hadoop使用用户,
在master机器上执行命令:$ssh-keygen -t rsa,后会在/home/vanjor/.ssh目录下生成:私钥(id_rsa),公钥(id_rsa.pub)
在/home/vanjor/.ssh目录下通过命令:$cp id_rsa.pub authorized_keys将id_rsa.pub内容复制到authorized_keys,没有则相当于新建后复制了。
在master上将文件authorized_keys拷贝到4台slave的.ssh目录里,命令为:$scp authorized_keys t2:/home/username/.ssh/ .文件权限问题,自行解决.authorized_keys的文件权限都注意通过chmod修改为644,以便远程访问。这样master在ssh到slave中就不需要通过slave口认证了。
STEP2 解压配置:
Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐户,在5台机器对应相同的目录下解压hadoop源文件。
配置namenode
在t1到t5均配置上相同的namenode主服务器地址:
- 位置:conf/core-site.xml
- 必须项:是
- 常用值:hdfs://t1:9000
- 说明:NameNode 主服务器的地址
<configuration> <property> <name>fs.default.name</name> <value>hdfs://t1:9000</value> </property> </configuration>
配置jobtracker
在t1到t5均配置上相同的jobtracker服务器地址:
- 位置:conf/mapred-site.xml
- 必须项:是
- 常用值:http://t1:9001
- 说明:JobTracker 主服务器地址及端口
<configuration> <property> <name>mapred.job.tracker</name> <value>t1:9001</value> </property> </configuration>
配置datanode
在四个slave中配置如下
- 位置:conf/hdfs-site.xml
- 必须项:否
- 默认值:0.0.0.0:50010
- 说明:DataNode 服务的地址
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
此处1为hdfs冗余备份数目,value为1表示hdfs中每个文件只有单独一份,没有拷贝冗余
其他的一些默认配置参考:http://darxin.info/archive/2010/02/e046f531/
配置conf下的master与slave文件,五台机器中master均为 添加一行t1, slave中均为添加四行,t2到t5
最后,手工对master节点进行namenode格式化:$bin/hadoop namenode –format
这样master中启动bin/start-all.sh就可以通过web接口看是否运行正常了,更多的可以通过追踪log文件下的日志文件信息。
开发&IDE环境
hadoop eclipse 插件
Hadoop程序运行可以简单的通过如样列中的:$ bin/hadoop jar hadoop-examples-*.jar grep input output ‘dfs[a-z.]+’ ,命令行方式运行,但是实际在开发过程中,每次运行前都要打包发布,过于麻烦。
实际上hadoop已经内置了hadoop eclipse的插件,可在hadoop安装目录\ contrib\eclipse-plugin下找到该插件,复制到eclipse\dropins\hadoop\plugins,中即可,之后运行hadoop程序,在Run as下一级都会有一个Run on Hadoop的按钮了,详细参考:http://qa.taobao.com/?p=10659。
Hadoop eclipse项目创建
可以将Hadoop目录下的lib文件夹中所有jar添加到eclipse的project path中,或可以直接配置
Hadoop maven项目创建
在mvnrepository中查到:http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/0.20.203.0 在pom.xml中添加如下即可:
<dependency> <groupId>org.apache.mahout.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>0.20.203</version> </dependency>
Hadoop MapReduce Framework入门,推荐程序WordCount:
http://wiki.apache.org/hadoop/WordCount
参考&资料推荐&下载:
- Hadoop in Action: http://ishare.iask.sina.com.cn/f/13834023.html
- Hadoop-The Definitive Guide: http://ishare.iask.sina.com.cn/f/13834271.html
- Hadoop 开发者入门专刊: http://ishare.iask.sina.com.cn/f/13617850.html