面对现实,超越自己
逆水行舟,不进则退
C++博客
首页
新随笔
新文章
联系
聚合
管理
posts - 269,comments - 32,trackbacks - 0
<
2012年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔分类
(267)
ATL(2)
C++(37)
DataBase(5)
Design Pattern(6)
IOS(11)
Linux(33)
MFC(84)
NodeJS(1)
NSIS(14)
Openfire&Gloox(2)
Product Management(5)
SQLite(3)
STL(10)
VCL
工具(6)
脚本(9)
其他(14)
算法(21)
网络编程(4)
随笔档案
(269)
2016年8月 (1)
2015年3月 (1)
2014年11月 (1)
2014年10月 (1)
2014年9月 (1)
2014年8月 (3)
2014年7月 (5)
2014年6月 (2)
2014年5月 (2)
2014年4月 (2)
2014年3月 (4)
2014年1月 (1)
2013年12月 (4)
2013年11月 (15)
2013年10月 (4)
2013年9月 (9)
2013年8月 (8)
2013年7月 (4)
2013年6月 (1)
2013年5月 (12)
2013年4月 (8)
2013年3月 (8)
2013年2月 (6)
2013年1月 (15)
2012年12月 (2)
2012年11月 (21)
2012年10月 (11)
2012年9月 (30)
2012年8月 (5)
2012年7月 (11)
2012年6月 (20)
2012年5月 (15)
2012年4月 (28)
2012年3月 (6)
2012年2月 (1)
2011年10月 (1)
常用链接
CODEGURU
CODEPROJECT
CSDN
MSDN
MULTI-PLATFORM
NSIS
PUDN
VC-CCTRY
VCKBASE
朋友博客
程序描绘人生
胡满超的技术博客
用自信照亮人生
推荐博客
ggjucheng
k-eckel
Kevin Lynx
陈皓
罗朝辉(飘飘白云)
最新随笔
1. SWIG实现python对c++封装
2. UISearchBar控件(转载)
3. (转载)推荐!国外程序员整理的 C++ 资源大全
4. MFC wcslen获取中文长度
5. Gloox文件传输小记
6. GLOOX 1.0.10注册问题
7. iOS 解决NSString转换为NSURL时包含中文字符
8. iOS 监听 Home键(转载)
9. UIGestureRecognizer学习笔记(转载)——手势识别功能
10. iOS 添加libxml2.dylb 后 找不到
头文件
搜索
积分与排名
积分 - 742514
排名 - 21
最新评论
1. re: MFC检测网络连接和ping IP地址
通过这种方式无法实现对ping结果的侦测,例如ping一个地址X.X.X.X无法知道是可以正常回复,还是请求超时。
--SherlockLee
2. re: C++ Deque(双向队列)
xcvx
--cxv
3. re: 查找CString里面出现某个字符的次数
@JJ
你注意看人家博主用的是哪个版本的重载函数,不是字符,是字符串。
--过客
4. re: MFC COMBOX控件只接受数字和设置数字范围
评论内容较长,点击标题查看
--zju_cfb
5. re: C++ 解析Json——jsoncpp
我喜欢博主的这句话,面对现实,超越自己
--huben
阅读排行榜
1. C++ 解析Json——jsoncpp(123331)
2. C++ Queues(队列)、Priority Queues(优先队列)(49300)
3. C++ Deque(双向队列) (22749)
4. MFC对话框中显示BMP,JPG图片(14679)
5. Richedit使用大全(14462)
评论排行榜
1. C++ 解析Json——jsoncpp(6)
2. MFC检测网络连接和ping IP地址(5)
3. NSIS修改创建文件夹读写权限(2)
4. 最短路径算法—Floyd(弗洛伊德)算法分析与实现(C/C++)(2)
5. MFC bmp图片添加文字(2)
hadoop分析之二元数据备份方案的机制(转载)
1、NameNode启动加载元数据情景分析
NameNode函数里调用FSNamesystemm读
取dfs.namenode.name.dir和dfs.namenode.edits.dir构建FSDirectory。
FSImage类recoverTransitionRead和saveNameSpace分别实现了元数据的检查、加载、内存合并和元数据的持久化存储。
saveNameSpace将元数据写入到磁盘,具体操作步骤:首先将current目录重命名为lastcheckpoint.tmp;然后在创建新的current目录,并保存文件;最后将
lastcheckpoint.tmp重命名为privios.checkpoint.
checkPoint的过程:Secondary NameNode会通知nameNode产生一个edit log文件edits.new,之后所有的日志操作写入到edits.new文件中。接下来Secondary NameNode会从namenode下载fsimage和edits文件,进行合并产生新的fsimage.ckpt;然后Secondary会将fsimage.ckpt文件上传到namenode。最后namenode会重命名fsimage.ckpt为fsimage,edtis.new为edits;
2、元数据更新及日志写入情景分析
以mkdir为例:
logSync代码分析:
代码:
public
void
logSync ()
throws
IOException {
ArrayList<EditLogOutputStream > errorStreams =
null
;
long
syncStart =
0
;
// Fetch the transactionId of this thread.
long
mytxid = myTransactionId .get (). txid;
EditLogOutputStream streams[] =
null
;
boolean
sync =
false
;
try
{
synchronized
(
this
) {
assert
editStreams. size() >
0
:
"no editlog streams"
;
printStatistics (
false
);
// if somebody is already syncing, then wait
while
(mytxid > synctxid && isSyncRunning) {
try
{
wait (
1000
);
}
catch
(InterruptedException ie ) {
}
}
//
// If this transaction was already flushed, then nothing to do
//
if
(mytxid <= synctxid ) {
numTransactionsBatchedInSync ++;
if
(metrics !=
null
)
// Metrics is non-null only when used inside name node
metrics .transactionsBatchedInSync .inc ();
return
;
}
// now, this thread will do the sync
syncStart = txid ;
isSyncRunning =
true
;
sync =
true
;
// swap buffers
for
( EditLogOutputStream eStream : editStreams ) {
eStream .setReadyToFlush ();
}
streams =
editStreams .toArray (
new
EditLogOutputStream[editStreams. size()]) ;
}
// do the sync
long
start = FSNamesystem.now();
for
(
int
idx =
0
; idx < streams. length; idx++ ) {
EditLogOutputStream eStream = streams [idx ];
try
{
eStream .flush ();
}
catch
(IOException ie ) {
FSNamesystem .LOG .error (
"Unable to sync edit log."
, ie );
//
// remember the streams that encountered an error.
//
if
(errorStreams ==
null
) {
errorStreams =
new
ArrayList <EditLogOutputStream >(
1
) ;
}
errorStreams .add (eStream );
}
}
long
elapsed = FSNamesystem.now() - start ;
processIOError (errorStreams ,
true
);
if
(metrics !=
null
)
// Metrics non-null only when used inside name node
metrics .syncs .inc (elapsed );
}
finally
{
synchronized
(
this
) {
synctxid = syncStart ;
if
(sync ) {
isSyncRunning =
false
;
}
this
.notifyAll ();
}
}
}
3、Backup Node 的checkpoint的过程分析:
/**
* Create a new checkpoint
*/
void
doCheckpoint()
throws
IOException {
long
startTime = FSNamesystem.now ();
NamenodeCommand cmd =
getNamenode().startCheckpoint( backupNode. getRegistration());
CheckpointCommand cpCmd =
null
;
switch
( cmd. getAction()) {
case
NamenodeProtocol .ACT_SHUTDOWN :
shutdown() ;
throw
new
IOException (
"Name-node "
+ backupNode .nnRpcAddress
+
" requested shutdown."
);
case
NamenodeProtocol .ACT_CHECKPOINT :
cpCmd = (CheckpointCommand )cmd ;
break
;
default
:
throw
new
IOException (
"Unsupported NamenodeCommand: "
+cmd.getAction()) ;
}
CheckpointSignature sig = cpCmd. getSignature();
assert
FSConstants.LAYOUT_VERSION == sig .getLayoutVersion () :
"Signature should have current layout version. Expected: "
+ FSConstants.LAYOUT_VERSION +
" actual "
+ sig. getLayoutVersion();
assert
!backupNode .isRole (NamenodeRole .CHECKPOINT ) ||
cpCmd. isImageObsolete() :
"checkpoint node should always download image."
;
backupNode. setCheckpointState(CheckpointStates .UPLOAD_START );
if
( cpCmd. isImageObsolete()) {
// First reset storage on disk and memory state
backupNode. resetNamespace();
downloadCheckpoint(sig);
}
BackupStorage bnImage = getFSImage() ;
bnImage. loadCheckpoint(sig);
sig.validateStorageInfo( bnImage) ;
bnImage. saveCheckpoint();
if
( cpCmd. needToReturnImage())
uploadCheckpoint(sig);
getNamenode() .endCheckpoint (backupNode .getRegistration (), sig );
bnImage. convergeJournalSpool();
backupNode. setRegistration();
// keep registration up to date
if
( backupNode. isRole( NamenodeRole.CHECKPOINT ))
getFSImage() .getEditLog (). close() ;
LOG. info(
"Checkpoint completed in "
+ (FSNamesystem .now() - startTime )/
1000
+
" seconds."
+
" New Image Size: "
+ bnImage .getFsImageName (). length()) ;
}
}
4、元数据可靠性机制。
配置多个备份路径。NameNode在更新日志或进行Checkpoint的过程,会将元数据放在多个目录下。
对于没一个需要保存的元数据文件,都创建一个输出流,对访问过程中出现的异常输出流进行处理,将其移除。并再合适的时机再次检查移除的数据量是否恢复正常。有效的保证了备份输出流的异常问题。
采用了多种机制来保证元数据的可靠性。例如在checkpoint的过程中,分为几个阶段,通过不同的文件名来标识当前所处的状态。为存储失败后进行恢复提供了可能。
5、元数据的一致性机制。
首先从NameNode启动时,对每个备份目录是否格式化、目录元数据文件名是否正确等进行检查,确保元数据文件间的状态一致性,然后选取最新的加载到内存,这样可以确保HDFS当前状态和最后一次关闭时的状态一致性。
其次,通过异常输出流的处理,可以确保正常输出流数据的一致性。
运用同步机制,确保了输出流一致性问题。
本文转自:
http://blog.csdn.net/kntao/article/details/7770597
posted on 2013-05-24 15:29
王海光
阅读(460)
评论(0)
编辑
收藏
引用
所属分类:
Linux
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Google开源项目
28个Unix/Linux的命令行神器
用GDB调试程序(七)
用GDB调试程序(六)
用GDB调试程序(五)
用GDB调试程序(四)
用GDB调试程序(三)
用GDB调试程序(二)
用GDB调试程序(一)
GDB中应该知道的几个调试方法(转载)
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理