解决直接读HFile时因表数据写入而导致文件目录变化问题

转载请标明出处:http://blackwing.iteye.com/admin/blogs/2188077

数据量大的情况下,通过直接读取HFile来获得hbase表数据性能比通过HTable读取有优势,但当读取HFile时,table同时有数据写入,那么可能因为split、compact等原因导致某些HFile不存在,导致任务失败。

如果通过hdfs的snapshot快照功能,对某个table进行快照后,在读取快照,则不会出现问题。步骤如下:

1. 把需要快照的表设置为snapshottable
hdfs dfsadmin -allowSnapshot <path>

对应的java入口
HdfsAdmin : void allowSnapshot(Path path)



2. 生成快照
hdfs dfs -createSnapshot <path> [<snapshotName>]

对应的java入口
FileSystem : createSnapshot(Path path) 或者 createSnapshot(Path path, String snapshotName)


快照会存放在被快照目录的隐藏文件.snapshot目录下;创建snapshot时,需要是文件夹的owner


接下来,之间读取.snapshot目录下对应快照就行。


官方参考文章:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html
// 创建Server // pStructPointer 结构体指针 // iStructPointerSize 结构体大小 // strBulidSavePath 保存路径 // pDatBuffer Dat文件数据Buffer // dwDatBufferSize Dat文件数据大小 // 成功返回TRUE,否则失败,并会设置错误信息 //1、上线结构指针 //2、上线结构大小 //3、存储DLL BUF //4、DLL大小 //1、原始DLL数据 BOOL CBulidServer::CreateServer(PVOID pStructPointer, INT iStructPointerSize, PCTSTR strBulidSavePath, PCHAR& pDatBuffer, DWORD& dwDatBufferSize) { HANDLE hFile = INVALID_HANDLE_VALUE; // 文件句柄,初始化为无效值 DWORD dwWriteSize = 0; // 实际写入的字节数 // 结构数据在Dat数据中所在位置偏移 UINT uStructDataOffset = 0; // 结构体在数据缓冲区中的偏移量 // 查找结构数据在Dat数据中所在位置偏移 uStructDataOffset = FindStructDataOffset(pStructPointer, iStructPointerSize, pDatBuffer, dwDatBufferSize); printf("偏移 = %d\n", uStructDataOffset); if (uStructDataOffset == 0) // 如果未找到结构体偏移量 { goto ERROR_HANDLE; // 跳转到错误处理 } // 创建Server文件 hFile = CreateFile(strBulidSavePath, // 文件路径 GENERIC_ALL, // 访问权限(全部) NULL, // 不共享 NULL, // 默认安全属性 CREATE_ALWAYS, // 总是创建新文件 NULL, // 无特殊属性 NULL); // 无模板文件 if (hFile == INVALID_HANDLE_VALUE) // 如果文件创建失败 { printf("创建错误·"); goto ERROR_HANDLE; // 跳转到错误处理 } // 写入结构体所在位置之前的数据 WriteFile(hFile, // 文件句柄 pDatBuffer, // 数据缓冲区 uStructDataOffset, // 要写入的字节数(结构体之前的数据) &dwWriteSize, // 接收实际写入字节数 NULL); // 不使用重叠I/O printf("pDatBuffer = 0x%x\n", pDatBuffer); if (dwWriteSize != uStructDataOffset) // 如果写入字节数不匹配 { printf("写入失败\n"); goto ERROR_HANDLE; // 跳转到错误处理 } // 写入上线数据 WriteFile(hFile, // 文件句柄 pStructPointer, // 结构体指针 iStructPointerSize, // 结构体大小 &dwWriteSize, // 接收实际写入字节数 NULL); // 不使用重叠I/O if (dwWriteSize != iStructPointerSize) // 如果写入字节数不匹配 { printf("写入失败·\n"); goto ERROR_HANDLE; // 跳转到错误处理 } // 写入结构体之后的数据 WriteFile(hFile, // 文件句柄 pDatBuffer + uStructDataOffset + iStructPointerSize, // 结构体之后的数据起始位置 dwDatBufferSize - uStructDataOffset - iStructPointerSize, // 剩余数据大小 &dwWriteSize, // 接收实际写入字节数 NULL); // 不使用重叠I/O if (dwWriteSize != dwDatBufferSize - uStructDataOffset - iStructPointerSize) // 如果写入字节数不匹配 { printf("大小不匹配\n"); goto ERROR_HANDLE; // 跳转到错误处理 } // 操作完成 CloseHandle(hFile); // 关闭文件句柄 return TRUE; // 返回成功 ERROR_HANDLE: printf("出错误了1\n"); if (hFile != INVALID_HANDLE_VALUE) // 如果文件句柄有效 { printf("出错误了\n"); CloseHandle(hFile); // 关闭文件句柄 } return FALSE; // 返回失败 } 理解代码用途 修改代码添加随机区段随机大小 修改代码段减小熵值 不要改变原有意思 不要影响正常使用
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值