首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

hadoop集群【初始】

2012-06-27 
hadoop集群【初步】hadoop的基础知识我就不在这里介绍了,任何有关hadoop书籍中都有非常详细的原理以及其开源

hadoop集群【初步】

hadoop的基础知识我就不在这里介绍了,任何有关hadoop书籍中都有非常详细的原理以及其开源框架(HDFS、Mapreduce、combiner、Partitioner等)、子项目(Hive、Hbase等)的介绍以及讲解,而这些方面的知识也不是在短期内能够了解和深入的,有一个循序渐进的过程,我这里只是针对其集群结合介绍其原理介绍,让大家更快速的对hadoop有一个了解,但也请大家意识到,会搭建集群并不代表掌握了hadoop,集群的搭建之后,会涉及到集群的深度优化、多集群、性能调优等,除了hadoop集群之外还要深入的了解他的子项目以及框架才能更好的利用Hadoop来达到最佳效果

?

集群网络图

?文件写入:
1.?Client向NameNode发起文件写入的请求。
2.?NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
3.?Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
文件读取:
1.?Client向NameNode发起文件读取的请求。
2.?NameNode返回文件存储的DataNode的信息。
3.?Client读取文件信息。
文件Block复制:
1.?NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。
2.?通知DataNode相互复制Block。
3.?DataNode开始直接相互复制。
图:

?hadoop集群【初始】

?


Hadoop集群流程

流程如下:
1.? 分布式环境中客户端创建任务并提交。
2.? InputFormat做Map前的预处理,主要负责以下工作:
a)???验证输入的格式是否符合JobConfig的输入定义,这个在实现Map和构建Conf的时候就会知道,不定义可以是Writable的任意子类。
b)???将input的文件split为逻辑上的输入InputSplit,其实这就是在上面提到的在分布式文件系统中blocksize是有大小限制的,因此大文件会被划分为多个block。
c)???通过RecordReader来再次处理inputsplit为一组records,输出给Map。(inputsplit只是逻辑切分的第一步,但是如何根据文件中的信息来切分还需要?? RecordReader来实现,例如最简单的默认方式就是回车换行的切分)

?3.?RecordReader处理后的结果作为Map的输入,Map执行定义的Map逻辑,输出处理后的key,value对到临时中间文件。
?4.?Combiner可选择配置,主要作用是在每一个Map执行完分析以后,在本地优先作Reduce的工作,减少在Reduce过程中的数据传输量。
?5.?Partitioner可选择配置,主要作用是在多个Reduce的情况下,指定Map的结果由某一个Reduce处理,每一个Reduce都会有单独的输出文件。
?6.?Reduce执行具体的业务逻辑,并且将处理结果输出给OutputFormat。
?7.? OutputFormat的职责是,验证输出目录是否已经存在,同时验证输出结果类型是否如Config中配置,最后输出Reduce汇总后的结果。

?

集群安装
软件安装
Hadoop的安装可以是单机,可以是集群,linux操作系统是hadoop工人的开发与生产平台,虽然Windows也可以支持开发模式,但是需要在节点上安装cygwin来支持shell和unix脚本。
我们现在比如有3台机器(oraclerac1,oraclerac2,dataguard,每台机器上创建了一个用户叫oracle,密码也是oracle,那么我们下面安装的软件以及配置都是在oracle用户下进行的):
创建用户和组(因我之前搭建了oracle集群,因此直接使用以前的环境了,因此才会在下述创建过程中出现oracle字样的用户和组信息)
创建组oinstall,dba,用户oracle
?[root@oraclerac1 ~]# groupadd oinstall
?[root@oraclerac1 ~]# groupadd dba
?[root@oraclerac1 ~]#? useradd -d /home/oracle -g oinstall -G dba oracle
设置oracle 用户密码(密码也设为oracle)
? [root@oraclerac1 ~]#? passwd oracle
Changing password for user oracle.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

配置/etc/hosts文件:
?这里就不做说明了,我们下面都会以机器名来进行通信配置(同时在HDFS格式化时,需要验证IP地址, 执行Reduce的时候会卡住,在拷贝的时候就无法继续下去,不断重试),因此需要把IP地址和机器名进行绑定在hosts文件中。
安装jdk、hadoop
那么这3台机器都需要安装,运行hadoop需要jdk1.6以上版本,同时安装hadoop最新版本:http://apache.etoak.com//hadoop/common/hadoop-1.0.1/,jdk的安装这里就不在介绍(记得配置环境变量),hadoop解压后,编辑脚本conf/hadoop-env.sh将JAVA_HOME设置为你安装的java根目录:
把#export JAVA_HOME=/usr/lib……..替换成:export JAVA_HOME=/你安装的jdk位置,hadoop脚本以后会经常使用,让我们不加任何参数运行它,看看它的用法文档,输入:bin/hadoop,比如下面的jar命令用法就是:bin/hadoop jar xxx.jar(包含路径) 执行的java名称(包含路径) 输入目录 输出目录

?hadoop集群【初始】


安装SSH
安装Hadoop集群时,要专门指定一个服务器作为主节点,这个服务器通常会驻留NameNode和JobTracker的守护进程,它作为一个基站,负责联络并激活所有从节点上的DataNode和TaskTracker守护进程,因此需要为主节点定制一种手段,使它能够远程访问到集群中的每个节点,因此,hadoop使用了ssh协议,ssh采用标准的公钥加密来生成一对用户验证密钥---一个公钥、一个私钥,并且使用NFS在集群中共享它,公钥被本地存储在集群的每个节点上,私钥则由主节点在视图访问远程节点时发送过来。
配置SSH用户等价
设置ssh是整个实验过程不可或缺的环节,简单说就是配置主节点和副节点之间的信任机制,让两台机器能够相互通信,在相互访问的时候不需要输入密码。
1)?首先在主节点oraclerac1、oraclerac2、dataguard上的不同网段地址互ping 看是否能ping通,Ping通后继续进行下面步骤
2)?在主节点oraclerac1、 oraclerac2、dataguard上切换到oracle用户身份生成用户的公匙和私匙,公钥是以.pub结尾的文件:
oraclerac1节点(其他节点类似配置):

hadoop集群【初始】
3)?我们需要确认公共密钥在我们需要连接到的集群所有机器的~/.ssh/authorized_keys文件中,通过下面的方式可以让导入各个节点的公匙和私匙到authorized_keys文件合成一个文件,在集群中共享,在用各个文件覆盖各个节点下.ssh下的同名文件:
oraclerac1+oraclerac2+dataguard节点设置(配置主节点即可):

hadoop集群【初始】

hadoop集群【初始】

hadoop集群【初始】

?

?

4)?继续执行确认操作(在配置的过程中有些地方会提醒(yes/no)?yes操作,有些没有,是因为我之前有配置过oracle集群的,有些东西是现有的,所以没有提醒,如果新的配置,是会有提醒的,就好比dataguard节点,都有提醒)
oraclerac1节点确认(访问其他节点机器,不需要密码了):

hadoop集群【初始】

?

?

然后依次对其他机器进行相同的命令检查是否都不需要密码可以进行相互访问

验证SSH安装
我们可以直接应用oracle集群中创建ssh的方法来进行
第一步是检查节点上是否安装了SSH:

hadoop集群【初始】
生成密钥对之后,公钥的形式为:

hadoop集群【初始】

?

?

?

?

文件配置

集群配置(特定硬件环境特定配置,但方法基本一致,我们以下的集群方式是把nodename和jobtracker放在一起(oraclerac1),snn放在单独的服务器上(oraclerac2),从节点用了1个(dataguard)):
配置core-site.xml、mapred-site.xml、hdfs-site.xml文件,我们在前两个文件中分别指定NameNode和JobTracker的主机名与端口,在最后一个文件中指定了HDFS的默认副本数,如果是单机集群在一个节点上,这里副本数是1(当超过一个机架时,块副本和任务的位置就变得更加复杂,块副本应放在彼此独立的机架上来减少潜在的数据丢失,标准的副本是3,在写入一个块时默认放置策略是:如果执行写操作的客户端是hadoop集群的一部分,第一个副本应放在客户端所在DataNode中,第二个副本随机放置在与第一个副本不同的机架上,第三个副本放在与第二个副本相同机架上的不同节点上),我们这样做了一个简单集群
Master:集群的主节点,驻留NameNode和JobTracker进程(oraclerac1)
SNN:驻留SNN进程,监控master? (oraclerac2)
hadoop1:集群中的从节点,驻留dataNode和TaskTracker进程 (dataguard)
core-site.xml

hadoop集群【初始】

?

mapred-site.xml

hadoop集群【初始】

?

?

hdfs-site.xml(此文件中的dfs.http.address属性只用在SNN机器上添加即可,来让该属性指向NameNode主机地址的端口50070,从NameNode中获取FsImage和EditLog,比如:FsImage---http://地址:端口/getimage?getimage=X)

hadoop集群【初始】

?

当然上述3个文件的配置远远不只这些,配置的属性非常多,我们这里的配置只是一个基础

我们还需要更新masters和slaves文件来指定其他进程的位置(经过我多次测试发现,这里masters配置的内容是SNN,并非真正的主节点,真正的主节点上面已经通过xml文件配置),而slaves配置的是从节点

master

hadoop集群【初始】

Slaves

hadoop集群【初始】

上述5个文件配置完成后,拷贝到各个节点中

格式化

格式化HDFS以准备好存储数据(所有节点都需要执行,如果在新增了节点或者删除节点的时候出现了问题,首先就去删除Slave的hadoop.tmp.dir,然后重新启动试试看,如果还是不行那就干脆把Master的hadoop.tmp.dir删除(意味着dfs上的数据也会丢失),如果删除了Master的hadoop.tmp.dir,那么就需要重新格式化HDFS):

hadoop集群【初始】?

?

现在可以启动hadoop的守护进程(主节点,如果控制台有错误,会有提醒的,没有错误就会显示各节点启动进程情况,主节点运行调用了bin/start-dfs.sh和bin/start-mapred.sh):

hadoop集群【初始】

?

验证节点正在运行被指派的任务(利用java的jps命令):
主节点(oraclerac1):

hadoop集群【初始】
SNN节点(oraclerac2):

hadoop集群【初始】

?

子节点(dataguard):

?

hadoop集群【初始】

子节点(dataguard):

?

hadoop集群【初始】

?

WEB管理集群
监控集群健康状态的web界面,与搜寻日志和目录相比,通过浏览器的界面,我们可以更快地获得所需的信息,NameNode通过端口50070提供的常规报告,描绘集群上的HDFS的状态视图,通过这个界面,可以通览文件系统,检查集群每个DataNode的状态以及存储资源,并详细查看Hadoop进程的日志来判断集群当前运行是否健康。
访问主节点IP+50070端口:http://192.168.2.11:50070/:

hadoop集群【初始】

Hadoop提供了一个MapReduce作业运行时状态的视图,通过这个报告同样可以获得大量的信息,包括MapReduce中任务的运行时状态,以及整个作业的详细报告(描述了哪些节点执行了哪些任务,以及需要完成每个任务锁需的时间或资源比,每个map和reduce任务的日志来辅助程序调试),一个jobTracker通过端口50030给出的视图:http://192.168.2.11:50030/:

hadoop集群【初始】

?

热点排行