当前位置:  编程技术>综合
本页文章导读:
    ▪hbase学习笔记(1)——hbase体系结构      HBase体系结构 HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion Server群和HBase Master Server构成。 HBase Master Server负责管理所有的HRegion Server,而HBase中所有的服务器都是通过ZooKeeper.........
    ▪Linux学习笔记2      今天结合《UNIX环境高级编程》,看到第三章了,主要是熟悉了一下vi的操作,和几个命令 以下是今天的笔记: ./a.out > data  可以把标准输出重定向到data文件中 date 时间 who 显示了当.........
    ▪虚存管理        1、页表的数据结构 页号 标志 主存块号 修改位 外存地址 struct PageItem { unsigned pageID; // 作业的页号 unsigned outMAddr; // 该页在外存上的地址 bool sta.........

[1]hbase学习笔记(1)——hbase体系结构
    来源: 互联网  发布时间: 2013-11-10
HBase体系结构
HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion Server群和HBase Master Server构成。

HBase Master Server负责管理所有的HRegion Server,而HBase中所有的服务器都是通过ZooKeeper来进行协调并处理HBase服务器运行期间可能遇到的错误。

HBase Master本身并不存储HBase中的任何数据,HBase逻辑上的表可能会被划分成多个HRegion,然后存储到HRegion服务器群中。

HBase Master服务器中存储的是从数据到HRegion服务器的映射。

HBase体系结构如下图:
HRegion
当表的大小超过设置值的时候,HBase会自动将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表是被拆分成多块,每块就是一个HRegion。

我们用表名+开始/结束主键来区分每一个HRegion。一个HRegion会保存一个表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面的。
HRegion服务器
所有的数据库数据一般是保存在Hadoop分布式文件系统(HDFS)上面的,用户通过一系列HRegion服务器获取这些数据。一台机器上一般只运行一个HRegion服务器,而且每一个区段的HRegion也只会被一个HRegion服务器维护。

HRegion服务器包括两大部分:HLOG部分和HRegion部分。

其中HLOG用来存储数据日志,采用的是先写日志的方式(Write-ahead log)。

HRegion部分由很多的HRegion组成,存储的是实际的数据。每一个HRegion又由很多的Store组成,每一个Store存储的实际上是一个列族(ColumnFamily)下的数据。

此外,每一个HSore中包含一块MemStore。MemStore驻留在内存中,数据来到时首先更新到MemStore中,当到达阀值之后再更新到对应的StoreFile(又名HFile)中。

每一个Store包含了多个StoreFile,StoreFile负责的是实际的数据存储,为HBase中最小的存储单元。

HBase中不涉及数据的直接删除和更新操作,所有的数据均通过追加的方式进行更新。数据的删除和更新在HBase合并(compact)的时候进行。当Store中StoreFile的数量超过设定的阀值时将触发合并操作,该操作会把多个StoreFile文件合并成一个StoreFile。

当用户需要更新数据的时候,数据会被分配到对应的HRegion服务器上提交修改。数据首先被提交到HLOG文件里面,在写入HLOG之后,commit()调用才会将其返回给客户端。HLOG文件用于故障恢复。例如某一台HRegionServer发生故障时,那么它所维护的HRegion会被重新分配到新的机器上。这时HLOG会按照HRegion进行划分。新的机器在加载HRegion的时候可以通过HLOG对数据进行恢复。

当一个HRegion变得过于巨大、超过了设定的阀值时,HRegion服务器会调用HRegion.closeAndSplit(),将此HRegion拆分为两个,并且报告主服务器让它决定由哪台HRegion服务器来存放新的HRegion。

这个拆分过程十分迅速,因为两个新的HRegion最初只是保留原来HRegionFile文件的引用。这时旧的HRegion会处于停止服务的状态,当新的HRegion拆分完成并且把引用删除了以后,旧的HRegion才会删除。

另外,两个HRegion可以通过调用HRegion.closeAndMerge()合并成一个新的HRegion,当前版本下进行此操作需要两台HRegion服务器都停机。

HBase Master服务器
每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每个HRegion服务器它要维护哪些HRegion。

当一台新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其它HRegion服务器中。

如果当前HBase已经解决了之前存在的SPFO(单点故障),并且HBase总可以启动多个HMaster,那么它就能通过Zookeeper来保证系统中总有一个Master在运行。

HMaster在功能上主要负责Table和HRegion的管理工作,具体包括:
  • 管理用户对table的增、删、改、查操作;
  • 管理HRegion服务器的负载均衡,调整HRegion分布;
  • 在HRegion分裂后,负责新HRegion的分配;
  • 在HRegion服务器停机后,负责失效HRegion服务器上的HRegion迁移。
ROOT表和META表
HRegion是按照表名和主键范围来区分,由于主键范围是连续的,所以一般用开始主键就可以表示相应的HRegion。
但是,因为我们有合并和分割操作,如果正好在执行这些操作的过程中出现死机,那么就可能存在多份表名和开始主键相同的数据,这样的话只有开始主键就不够了,这就需要通过HBase的元数据信息来区分那一份才是正确的数据文件,为了区分这样的情况,每个HRegion都有一个‘regionId’来标识它的唯一性。

    
[2]Linux学习笔记2
    来源: 互联网  发布时间: 2013-11-10

今天结合《UNIX环境高级编程》,看到第三章了,主要是熟悉了一下vi的操作,和几个命令

以下是今天的笔记:


./a.out > data  可以把标准输出重定向到data文件中


date 时间


who 显示了当前登录在该机器上的所有用户的列表 
(但是不包括su的用户,因为su过去的用户进程空间是作为一个子空间存在,他并没有得


到一个登录的tty)


pwd命令用于显示当前工作目录


: set nu vi显示行号
: set nonu vi取消显示行号


od -c first.c 观看first.c文件里面的实际内容 -c表示以字符方式打印文件内容


clear 清屏

作者:lingxiu0613 发表于2013-1-8 18:12:54 原文链接
阅读:29 评论:0 查看评论

    
[3]虚存管理
    来源: 互联网  发布时间: 2013-11-10

 

1、页表的数据结构


页号

标志

主存块号

修改位

外存地址


struct PageItem {
         unsigned pageID;         // 作业的页号
         unsigned outMAddr;    // 该页在外存上的地址
         bool state;                    // 该页是否调入内存,若未调入内存,则blockID和modify字段无效
         unsigned blockID;         // 该页对应的内存物理块号
         bool modify;                 // 该页是否被修改过
};


初始页表结构:

0 1 5 011 1
1 1 8 012 1
2 1 9 013 0
3 1 10 015 0
4 0 0 017 0
5 0 0 025 0
6 0 0 212 0
7 0 0 213 0


2、指令的数据结构


操作

页号

单元号(偏移量)


struct Instruction{
         string OPC;
         unsigned OPAPageID;
         unsigned OPAUnitID;
};


指令序列表:

+ 0 040
+ 1 050
* 2 016
存 3 022
取 0 054
- 6 040
移位 4 052
+ 5 022
存 1 034
取 7 056
+ 4 002
取 6 076



3、地址变换机构算法


 

4、缺页中断机构算法

采用FIFO置换算法,流程图如下:


 

队列进出情况:

页面走向

0

1

2

3

0

6

4

5

1

7

4

6

页框

0

0

0

0

 

1

2

3

6

4

 

5

 

1

1

1

 

2

3

6

4

5

 

1

 

 

2

2

 

3

6

4

5

1

 

7

 

 

 

3

 

6

4

5

1

7

 

6

 


5、源程序
#define_CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<queue>
#include<vector>
#include<string>
#include<cassert>
usingnamespace std;
 
const intPAGE_NUMBER = 8; // 作业所占的页数
const intBLOCK_NUMBER = 4; // 系统最多为作业分配的块数
const intBLOCK_SIZE = 64;     // 主存的每块长度
 
structPageItem {
         unsigned pageID;    // 作业的页号
         unsigned outMAddr;        // 该页在外存上的地址
         bool state;                          // 该页是否调入内存,若未调入内存,则blockID和modify字段无效
         unsigned blockID;    // 该页对应的内存物理块号
         bool modify;              // 该页是否被修改过
 
         // 默认构造函数
         PageItem()
                   :pageID(0),
                   blockID(0),
                   state(false),
                   modify(false),
                   outMAddr(0){}
 
         // 构造函数
         PageItem (
                   unsigned _pageID,
                   unsigned _blockID,
                   bool _state,
                   bool _modify,
                   unsigned _outMAddr)
                   :pageID(_pageID),
                   blockID(_blockID),
                   state(_state),
                   modify(_modify),
                   outMAddr(_outMAddr){}         
};
 
structInstruction {
         string OPC;
         unsigned OPAPageID;
         unsigned OPAUnitID;
};
 
//FIFOQueue的最大长度即系统最多为作业分配的块数BLOCK_NUMBER
voidInterrupt(vector<PageItem> &pageTable, queue<unsigned>&FIFOQueue, const unsigned visitPageID)
{
         assert(FIFOQueue.size() <=BLOCK_NUMBER);
 
         // 按书上给的一定队满,待改进
         if (FIFOQueue.size() == BLOCK_NUMBER)       // 队满则置换,换出队头
         {
                   unsigned num =FIFOQueue.front();         // 队头的页号num
                   pageTable[num].state = false;
                   if (pageTable[num].modify)
                   {
                            cout << "页" << num <<"被修改过,写回磁盘" << endl;
                   }
                   cout << "调页" << num <<"到磁盘" << endl;
                   FIFOQueue.pop();
                   pageTable[visitPageID].blockID= pageTable[num].blockID;
         }
         //pageTable[visitPageID].outMAddr =             // 队不满时实际应按内存分配算法给出该页分配到的物理块号
         cout << "调入页" << visitPageID<< endl;
         pageTable[visitPageID].state = true;
         pageTable[visitPageID].modify = false;
         FIFOQueue.push(visitPageID);
         // 实际还应修改内存分块表
}
 
intmain(int argc, char **argv)
{
         freopen("cin.txt","r", stdin);
 
         vector<PageItem>pageTable(PAGE_NUMBER);    // 作业在内存的页表
         queue<unsigned> FIFOQueue;                                              //系统为作业分配的块队列,元素为该页的页号
         for (int i = 0; i < PAGE_NUMBER;++i)
         {
                   cin >>pageTable[i].pageID
                            >>pageTable[i].state
                            >>pageTable[i].blockID
                            >> pageTable[i].outMAddr
                            >>pageTable[i].modify;
                   if (pageTable[i].state)
                   {
                            FIFOQueue.push(i);
                   }
         }
 
         Instruction ins;
         int cnt = 1;
         while (cin >> ins.OPC >>ins.OPAPageID >> ins.OPAUnitID)    //取指
         {
                   cout << "执行指令" << cnt++ <<endl;
                   unsigned visitPageID =ins.OPAPageID;  // 截取指令中的访问页号,来自MAR
                   if (ins.OPAPageID >=PAGE_NUMBER)
                   {
                            cout << "产生越界中断!" << endl;       // 应抛出异常?
                            return 1;
                   }
 
                   while(!pageTable[visitPageID].state)
                   {
                            cout << &      
    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3