2014/9/8

hadoop 记录 第一天:

          

一:节点的划分:

对于HDFS来讲,将整个集群中的节点,依据它们运行的进程,划分为三种:

名字节点:namenode

数据节点:datanode 

第二名字节点:seconderynamenode 

名字节点:

    维护着HDFS文件系统的文件目录树,以及文件的数据块索引(每个文件对应的数据块列表)。

    数据块和数据节点的对应关系。

    其中,目录树,数据块索引会持久化到磁盘上。

    数据块和数据节点的对应关系,在名字节点启动后,由数据节点上报,动态建立。

数据节点:

    存储数据块。

第二名字节点:

    产生检查点。

    根据集群配置的时间间隔,不停获取HDFS某一个时间点的命名空间镜像和镜像的编辑日志,

    合并得到一个新的命名空间镜像,自己备份,再把该镜像上传到名字节点,并清空原来的日志。

    不支持名字节点的故障自动恢复。

    namenode和seconderynamenode不要运行在一起。


二:如何通过配置文件来让集群区分节点:

需要熟悉shell-script,

我现在不懂,这一块有疑问。

在集群中,是怎么通过配置来指定不同的主机作为不同的节点:

namenode这个我现在不懂,通过执行脚本的方式start-dfs.sh,是在执行这个脚本的

主机上开启namenode进程,但是如果在core-site.xml中,配置的fs.default.name不                    是指向这台主机,那么namenode就启动不了。


fs.default.name指定namenode和默认文件系统,


seconderynamenode 在配置文件masters中,指定的主机,运行这个进程。


namenode 在配置文件slaves中,指定的主机,运行这个进程。


三:不同节点的本地磁盘建立的文件结构:

在HDFS中,名字节点,数据节点和第二名字节点都需要在磁盘上组织、存储持久化数据,他们            会在磁盘上维护一定的文件结构。

在hdfs_site.xml中,有以下几个参数:dfs.name.dir  dfs.data.dir    fs.checkpoint.dir

            dfs.name.dir 这个参数的作用,是在我们指定的运行namenode进程的主机本地建立一个文            件夹, 这个文件中存储的是命名空间镜像(fsimage)和命名空间镜像的编辑日志(editlog)

命名空间镜像文件作为磁盘上的文件,很难和名字节点内存中的元数据时时刻刻保持一致,

为了提高可靠性,将对元数据的修改保存在编辑文件中。

文件夹:current

edits

fsimage

fstime最近一次检查点的时间(就是edits与fsimage合并的时间)

VERSION

previous.checkpoint 保存名字节点的上一次检查点,与current一致

 文件: in_use.lock

    

            dfs.data.dir 指定运行datanode进程的主机在本地建立文件夹,存储的是实际的数据块。

文件夹:blocksBeingWritten  保存着当前客户端正在“写”的数据块。

current  保存着已经写入hdfs文件系统的数据块。这个目录下最多有64个子                                     目录,64个数据块(128个文件)。每个数据块由两个文件组成                                    (数据块,数据块的校验信息)

detach   用于配合数据节点升级????????

tmp      保存数据块复制引发的写操作,另一个节点正在发送数据到数据块                                     中。

文件:in_use.lock 表明这个目录,已经有节点独占了。




fs.checkpoint.dir 指定运行seconderynamenode的主机建立一个文件夹,

目录:  current  存储合并后的fsimage edits(新的),

        previous.checkpoint  

这两个目录的结构是完全相同的,这样设计的目的是:

万一整个namenode发生故障,并且没有备份,就可以直接从                                        Secondary Namenode恢复。


今天的问题:

1.如果namenode主机死掉了,怎么来恢复?

2.hadoop 集群支持动态扩展,如何向一个集群中,添加一个datanode.

3.hadoop 集群中的namenode死掉了怎么办?



一、配置1. 在masters文件中添加 Secondary节点的主机名。

*注:masters文件用于指定secondary的主机而不是namenode,

    slaves用于指定datanode和tasktracker,

    namenode由core-site.xml fs.default.name指定,

    jobtracker由mapred-site.xml mapred.job.tracker指定


2. 修改hdfs-site.xml文件

<property>    

<name>dfs.http.address</name>

<value>${your-namenode}:50070</value>

<description>Secondary get fsimage and edits  via dfs.http.address

                </description>

</property>

<property>    

<name>dfs.secondary.http.address</name>    

<value>${your-secondarynamenode}:50090</value>    

<description>NameNode get the newest fsimage via dfs.secondary.http.address

                </description>

</property>

*注:1、实际上dfs.http.address只在secondary设置,

dfs.secondary.http.address只在namenode上设置即可,

为了便于管理,集群所有机器同样配置

    2、采用默认端口(namenode:50070,secondary:50090)时可以省略该配置

        2. 修改core-site.xml文件

<property>

<name>fs.checkpoint.period</name>

<value>3600</value> 

<description>The number of seconds between two periodic checkpoints.                        </description>

</property>

<property> 

<name>fs.checkpoint.size</name>  

<value>67108864</value>  

<description>The size of the current edit log (in bytes) that triggers a periodic checkpoint even if the fs.checkpoint.period hasn't expired. 

                 </description>

</property>

<property>    

<name>fs.checkpoint.dir</name> 

<value>${hadoop.tmp.dir}/dfs/namesecondary</value>  

<description>Determines where>

*注:该配置在secondary设置即可,为了便于管理,集群所有机器同样配置


二、 namenode故障恢复(importCheckpoint)

*注意事项:

(1) 为了便于将随便一台datanode临时用作namenode,datanode和namenode配置需要一模一样

包括conf目录下的所有文件、目录结构、环境变量

(2) 新namenode的主机名要与原namenode保持一致,主机名若是在hosts写死,需要批量替换

datanode hosts文件 (用内部域名服务最好,改下域名指向即可)

(3) fs.checkpoint.dir的内容非常重要,无法保证secondnamenode不出故障,

所以需要定期对secondnamenode fs.checkpoint.dir的内容做备份

(4) 最近一次check至故障发生这段时间的内容将丢失,

fs.checkpoint.period参数值需要权衡,

既不太频繁又尽可能保证数据完整,默认1小时

恢复步骤:

(0) 可选,当namenode主机名发生变化时(为了不影响应用,最好不好发生变化),

需修改:[core-site.xml] fs.default.name = 新namenode    

[hdfs-site.xml] dfs.http.address = 新namenode   

[mapred-site.xml]mapred.job.tracker = 新jobtracker,

如果jobtracker与namenode在同一台机器上

(1) 确保新namenode ${dfs.name.dir}目录存在,且清空其内容

(2) 把SecondaryNameNode节点中 ${fs.checkpoint.dir} 的所有内容

拷贝到新的NameNode节点的 ${fs.checkpoint.dir} 目录中

(3) 在新机器上执行   hadoop namenode -importCheckpoint     

该步会从${fs.checkpoint.dir}中恢复${dfs.name.dir},并请动namenode

(4) 检查文件block完整性        hadoop fsck /

(5) 停止namenode,使用crrl+C或者会话结束

(6) 删除新namenode ${fs.checkpoint.dir}目录下的文件(保持干净)

(7) 正式启动namenode,恢复工作完成        

        sh $HADOOP_HOME/bin/hadoop_daemon.sh start namenode