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进程的主机本地建立一个文 件夹, 这个文件中存储的是命名空间镜像(fsp_w_picpath)和命名空间镜像的编辑日志(editlog)
命名空间镜像文件作为磁盘上的文件,很难和名字节点内存中的元数据时时刻刻保持一致,
为了提高可靠性,将对元数据的修改保存在编辑文件中。
文件夹:current
edits
fsp_w_picpath
fstime最近一次检查点的时间(就是edits与fsp_w_picpath合并的时间)
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 存储合并后的fsp_w_picpath 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 fsp_w_picpath 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 fsp_w_picpath 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
转载于:https://blog.51cto.com/duanzhenyue/1550174