0%

总结下 RPC 框架 [wuYin/nsx](<http://wibliss.com) v0.1 版的设计思路和工作流程。

前言

不久前内部做了 RPC 的技术分享,参考分享的设计思路写了个简化的 RPC 框架:nsx,后续完善和优化更多 feature

关于 RPC

我的简单理解是:将本地函数调用网络化,通过网络传递参数、执行并返回调用结果。网络调用会面临以下问题:

1. 通信协议

RPC 调用双方的进程是指 socket(IP:Port)唯一标识的进程,二者一般是指在同一局域网内不同主机上的两个进程,当然也可以只是本地系统中两个端口不一样的进程。

为保证网络调用的可靠性,传输层协议选择 TCP,但相比 UDP 每个数据报独立传输界线分明的特点,TCP 流式传输的二进制数据包之间是没有分界的。既然选择 TCP,那包的分割和拼接操作就需要由应用层的程序来实现。可参考 Redis Server 和 Client 间的通信协议 protocol

2. 执行网络调用

本地调用:多个函数代码都在进程的代码段内存区域中,相互调用成本低,但耦合度高。
网络调用:进程 A 想调用进程 B 中的函数,需要像本地调用一样,将函数名、函数实参值通过网络发送给进程 B,等待函数执行完毕后将返回值通过网络响应给进程 A,交互的数据即通信的协议包中的包内容。那进程 A 如何调用非本地的函数呢?答案是使用 反射

RPC 调用的核心代码如下,在进程 A 中被执行 add 调用的看似只是初始值为 nil 的 fakeAdd,但其实在 MakeFunc 中包含了复杂的网络调用过程:

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
package main

import (
"fmt"
"reflect"
)

// 进程 A
func main() {
var fakeAdd func(a, b int64) int64
fakeType := reflect.TypeOf(fakeAdd)
fakeAddV := reflect.MakeFunc(fakeType, addCaller)
resps := fakeAddV.Call([]reflect.Value{ // 执行网络调用,并将返回值响应给调用方
reflect.ValueOf(int64(1)),
reflect.ValueOf(int64(1)),
})

fmt.Println("1+1 =", resps[0].Int()) // 1+1=2
}

func addCaller(in []reflect.Value) []reflect.Value {
sum := add(in[0].Int(), in[1].Int()) // 此处省略了进程 A 向进程 B 发起网络调用请求并等待响应
sumV := reflect.ValueOf(sum)
return []reflect.Value{sumV}
}

// 进程 B
func add(base, diff int64) int64 {
return base + diff
}

3. 服务注册

假设现有服务 add-service 实现了加法功能,即实现了 Add 函数能传入 2 个整数计算后返回和,假设已经是运行在主机 1 上的进程 A。现在主机 2 上的进程 B 要调用 Add 函数进行计算,那就需要先知道 add-service 的网络地址(IP:Port)是什么?

3.1 初步方案:调用方和被调用方都要维护全部对方的地址

在主机 2 的内存中维护 [add-service : addr] 的哈希映射,进程 B 直接取地址调用即可。这就是最简单的 Registry,虽然实现了取地址功能,但缺陷也很明显:

  • 发布低效
    每次 add-service 更新功能发布后需通知主机 2 更新 map 中的 addr,如果只有一个调用方更新一次还好,如果有 100 个调用方呢?那每次发布都需要逐一告知其他 100 台主机更新服务地址…效率很低,如果想改善可使用 UDP 广播机制一次性通知完毕,但就算你实现了,可靠性肯定不如 zk 的 broadcast。因此服务方和调用方都要维护对方的地址。服务方每次发布都要通知调用方地址变化,调用方地址变更也要通知服务方:

  • 机制可靠性低
    万一 add-service 因为某个操作 panic 了或 disk full 导致服务不可用,其他调用方每次都要傻傻的等待调用超时返回,而不是被告知说服务下线了不必再调用。如果 add-service 是多主机的,其他调用方还要实现服务切换功能。在分布式环境中,想要实现服务的高度可靠性并不容易。

3.2 可靠方案:使用分布式协调服务 zookeeper 来实现注册中心

参考 dubbo 注册中心的结构:Introduction to Dubbo

参与对象:

  • Provider:服务提供者,即被调用方,如主机 1 上 add-service 的进程 A
  • Consumer: 服务消费者,即调用方,如主机 2 上的进程 B
  • Registry:注册中心,add-service 注册,进程 B 获取服务调用地址的地方

工作流程:

  • Register: 每次服务发布 Provider 都会向 Registry 发起注册,将它的服务名称和网络地址存储在注册中心
  • Subscribe:很多调用方 Consumer 将想调用的服务订阅到 Registry 中,当某个关心的服务上线或下线时都会 Notify Consumer
  • Invoke:Consumer 获取到服务地址后,直接发起调用并阻塞等待返回响应或调用超时

现在的 nsx 支持上边 2 种方案:简单 Registry 和分布式 zk Registry,但是没有 Notify 和 Monitor 功能,后续使用 zk 的 event 通知机制继续完善。

nsx 架构

nsx 框架分为了三个子项目:nsx 来完成通信。

Tron 网络框架

现在的 v0.2 相比 v0.1 只加入了包序列管理功能。文档地址:docs/v0.1.md
Tron 定义了自己的 Server 和 Client,并将二者的每次连接都抽象成 Session,它们数据交互如下:

注:虚线的 connect / dispatch 过程只会进行一次,实线的 packet 交互过程会进行多次。
其中 Client 和 ServerWorker 使用相同的代码,作为通信双方都能在连接超时后进行二次规避策略的重连直到超过指定次数,此外对于 packet 的读写提供了 Codec 接口,Tron 提供了默认的 codec 实现,同时也让使用 Tron 框架的第三方能够自定义 packet 的读写格式,如 nsx 和 nsx-cli 就是复用了 Redis Protocol 进行调用交互。

nsx: Service Provider

调用流程:每个 Provider 在实例化时都会启动一个底层 Tron Server 运行并监听,并且会将自身服务的实现托管到 ServiceManager 中,在 Manager 内部会将服务实现的各个方法取反射值并记录方法 in 和 out 的参数 Type 以便在被调用时做校验。当接收到调用请求后,使用自定义的 Codec 解码出调用参数,再告诉 manager 执行调用并将调用结果异步写回给调用方。

注册中心:nsx 内部实现了一个默认的 Registry Proxy,它本身只是发起注册/下线请求的代理,至于注册中心本身是由 nsx Server 实例内部来维护的,它就是上边说的注册中心初步方案。此外还提供了 zk 实现的注册中心功能,能进行服务的注册和调用,但基于 event 的服务发布功能还待实现。

nsx-cli: Service Consumer

调用流程:每个 Consumer 在实例化时会定时从配置好的服务中心拉取自己关心的服务地址,并且逐一启动底层的 Tron Client 进行连接,连接成功后待命等待被调用。此外会对所有服务的方法进行网络调用的包装,当调用执行时阻塞等待调用响应或超时。

总结

整个 nsx RPC 框架的大概工作流程如上,其实还有很多可以改进的地方,如:

  • 服务通知:通过 zk event 实现服务订阅的 Notify
  • worker 池化:Server 维护一定数量 worker goroutine pool 用于请求处理,节省内存资源

对了,nsx 项目名来源于 Grand Tour S02 E01 中的很酷的 Honda NSX 混动跑车,Tron 是上海迪士尼乐园极速光轮项目的名字,我也很喜欢电影《TRON》中 Draft Punk 的配乐,项目都很酷,期待 v0.2 更多特性。

系统原理

系统原理旨在总结大型系统中常用的核心技术,这也架构设计的基石。

内容

学习资料

作为程序员,想必每个人都会有大量的资料、数据。按照条理清晰的目录结构去分类化存储,十分有助于管理文件。

目录结构

以下是我个人整理的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── Codes #代码目录
│ ├── Other #第三方代码目录
│ ├── My #个人代码目录
│ └── Work #工作代码目录
├── Data #数据目录
├── Downloads #下载文件目录
├── Docs #文档目录
│ ├── Books #电子书目录
│ ├── My #个人文档目录
│ └── Work #工作文档目录
├── Movies #视频目录
├── Music #音乐目录
├── Pictures #图片目录
├── Public #共享目录
├── Temp #临时文件目录
└── Tools #工具软件目录
└── Packages #安装包目录

注:如果您使用的操作系统是 Mac 这种可以为目录或文件添加 tag 的操作系统,那么您可以根据自己的喜好更细致化的管理。

2. 文件管理软件

选用便利的文件管理软件,可以让你的文件管理如虎添翼。这里推荐几款经典的文件管理工具。

2.1. Clover

Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能。

2.2. Everything

Everything 可以立即在 windows 系统中找到制定名称的文件和文件夹。

2.3. Wox

Wox 是一款简单易用的 Windows 启动器。可以把它视为 windows 版的 Alfred。

2.4. Q-dir

Q-dir 是轻量的文件管理器,特点鲜明,各种布局视图切换灵活,默认四个小窗口组成一个大窗口,操作快捷。

文档采用 Markdown 语法书写。

📚 「参考」Markdown 语法可以参考:

1. 标题

1.1. 标题层级

标题分为四级。

  1. 一级标题:文章的标题
  2. 二级标题:文章内容的大标题
  3. 三级标题:二级标题下一级的标题
  4. 四级标题:三级标题下一级的标题

1.2. 标题原则

  • 一篇文章中应该尽力避免同名标题。
  • 一级标题下,不能直接出现三级标题。
  • 标题要避免孤立编号(即同级标题只有一个)。
  • 下级标题不重复上一级标题的内容。
  • 谨慎使用四级标题,尽量避免出现,保持层级的简单和防止出现过于复杂的章节。如果三级标题下有并列性的内容,建议只使用项目列表(Item list)。

2. 文本

2.1. 字间距

全角中文字符与半角英文字符之间,应有一个半角空格。

1
2
3
反例:本文介绍如何快速启动Windows系统。

正例:本文介绍如何快速启动 Windows 系统。

全角中文字符与半角阿拉伯数字之间,有没有半角空格都可,但必须保证风格统一,不能两种风格混杂。

1
2
3
正例:2011年5月15日,我订购了5台笔记本电脑与10台平板电脑。

正例:2011 年 5 月 15 日,我订购了 5 台笔记本电脑与 10 台平板电脑。

半角的百分号,视同阿拉伯数字。

英文单位若不翻译,单位前的阿拉伯数字与单位间不留空格。

1
2
3
反例:一部容量为 16 GB 的智能手机

正例:一部容量为 16GB 的智能手机

半角英文字符和半角阿拉伯数字,与全角标点符号之间不留空格。

1
2
3
反例:他的电脑是 MacBook Air 。

正例:他的电脑是 MacBook Air。

2.2. 句子

  • 避免使用长句。一个句子建议不超过 100 字或者正文的 3 行。
  • 尽量使用简单句和并列句,避免使用复合句。

2.3. 写作风格

尽量不使用被动语态,改为使用主动语态。

1
2
3
反例:假如此软件尚未被安装,

正例:假如尚未安装这个软件,

不使用非正式的语言风格。

1
2
3
反例:Lady Gaga 的演唱会真是酷毙了,从没看过这么给力的表演!!!

正例:无法参加本次活动,我深感遗憾。

用对“的”、“地”、“得”。

1
2
3
4
5
6
7
8
她露出了开心的笑容。
(形容词+的+名词)

她开心地笑了。
(副词+地+动词)

她笑得很开心。
(动词+得+副词)

使用代词时(比如“其”、“该”、“此”、“这”等词),必须明确指代的内容,保证只有一个含义。

1
2
3
反例:从管理系统可以监视中继系统和受其直接控制的分配系统。

正例:从管理系统可以监视两个系统:中继系统和受中继系统直接控制的分配系统。

名词前不要使用过多的形容词。

1
2
3
反例:此设备的使用必须在接受过本公司举办的正式的设备培训的技师的指导下进行。

正例:此设备必须在技师的指导下使用,且指导技师必须接受过由本公司举办的正式设备培训。

单个句子的长度尽量保持在 20 个字以内;20 ~ 29 个字的句子,可以接受;30 ~ 39 个字的句子,语义必须明确,才能接受;多于 40 个字的句子,在任何情况下都不能接受。

1
2
3
反例:本产品适用于从由一台服务器进行动作控制的单一节点结构到由多台服务器进行动作控制的并行处理程序结构等多种体系结构。

正例:本产品适用于多种体系结构。无论是由一台服务器(单一节点结构),还是由多台服务器(并行处理结构)进行动作控制,均可以使用本产品。

同样一个意思,尽量使用肯定句表达,不使用否定句表达。

1
2
3
反例:请确认没有接通装置的电源。

正例:请确认装置的电源已关闭。

避免使用双重否定句。

1
2
3
反例:没有删除权限的用户,不能删除此文件。

正例:用户必须拥有删除权限,才能删除此文件。

2.4. 英文处理

英文原文如果使用了复数形式,翻译成中文时,应该将其还原为单数形式。

1
2
3
英文:⋯information stored in random access memory (RAMs)⋯

中文:……存储在随机存取存储器(RAM)里的信息……

外文缩写可以使用半角圆点(.)表示缩写。

1
2
U.S.A.
Apple, Inc.

表示中文时,英文省略号()应改为中文省略号(……)。

1
2
3
英文:5 minutes later⋯

中文:5 分钟过去了⋯⋯

英文书名或电影名改用中文表达时,双引号应改为书名号。

1
2
3
英文:He published an article entitled "The Future of the Aviation".

中文:他发表了一篇名为《航空业的未来》的文章。

第一次出现英文词汇时,在括号中给出中文标注。此后再次出现时,直接使用英文缩写即可。

1
IOC(International Olympic Committee,国际奥林匹克委员会)。这样定义后,便可以直接使用“IOC”了。

专有名词中每个词第一个字母均应大写,非专有名词则不需要大写。

1
2
3
“American Association of Physicists in Medicine”(美国医学物理学家协会)是专有名词,需要大写。

“online transaction processing”(在线事务处理)不是专有名词,不应大写。

3. 段落

3.1. 段落原则

  • 一个段落只能有一个主题,或一个中心句子。
  • 段落的中心句子放在段首,对全段内容进行概述。后面陈述的句子为核心句服务。
  • 一个段落的长度不能超过七行,最佳段落长度小于等于四行。
  • 段落的句子语气要使用陈述和肯定语气,避免使用感叹语气。
  • 段落之间使用一个空行隔开。
  • 段落开头不要留出空白字符。

3.2. 引用

引用第三方内容时,应注明出处。

1
One man’s constant is another man’s variable. — Alan Perlis

如果是全篇转载,请在全文开头显著位置注明作者和出处,并链接至原文。

1
本文转载自 WikiQuote

使用外部图片时,必须在图片下方或文末标明来源。

1
本文部分图片来自 Wikipedia

3.3. 强调

一些特殊的强调内容可以按照如下方式书写:

🔔 『注意』

💡 『提示』

📚 『参考』

4. 数值

4.1. 半角数字

数字一律使用半角形式,不得使用全角形式。

1
2
3
反例: 这件商品的价格是1000元。

正例: 这件商品的价格是 1000 元。

4.2. 千分号

数值为千位以上,应添加千分号(半角逗号)。

1
XXX 公司的实收资本为 RMB1,258,000。

对于 4 ~ 6 位的数值,千分号是选用的,比如10001,000都可以接受。对于 7 位及以上的数值,千分号是必须的。

多位小数要从小数点后从左向右添加千分号,比如4.234,345

4.3. 货币

货币应为阿拉伯数字,并在数字前写出货币符号,或在数字后写出货币中文名称。

1
2
$1,000
1,000 美元

4.4. 数值范围

表示数值范围时,用连接。参见《标点符号》一节的“连接号”部分。

带有单位或百分号时,两个数字都要加上单位或百分号,不能只加后面一个。

1
2
3
4
5
反例:132~234kg
正例:132kg~234kg

反例:67~89%
正例:67%~89%

4.5. 变化程度的表示法

数字的增加要使用“增加了”、“增加到”。“了”表示增量,“到”表示定量。

1
2
3
4
5
增加到过去的两倍
(过去为一,现在为二)

增加了两倍
(过去为一,现在为三)

数字的减少要使用“降低了”、“降低到”。“了”表示增量,“到”表示定量。

1
2
3
4
5
降低到百分之八十
(定额是一百,现在是八十)

降低了百分之八十
(原来是一百,现在是二十)

不能用“降低 N 倍”或“减少 N 倍”的表示法,要用“降低百分之几”或“减少百分之几”。因为减少(或降低)一倍表示数值原来为一百,现在等于零。

5. 符号

5.1. 符号原则

  • 中文语句的标点符号,均应该采取全角符号,这样可以保证视觉的一致。
  • 如果整句为英文,则该句使用英文/半角标点。
  • 句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。

5.2. 句号

中文语句中的结尾处应该用全角句号()。

句子末尾用括号加注时,句号应在括号之外。

1
2
3
反例:关于文件的输出,请参照第 1.3 节(见第 26 页。)

正例:关于文件的输出,请参照第 1.3 节(见第 26 页)。

5.3. 逗号

逗号表示句子内部的一般性停顿。

注意避免“一逗到底”,即整个段落除了结尾,全部停顿都使用逗号。

5.4. 顿号

句子内部的并列词,应该用全角顿号() 分隔,而不用逗号,即使并列词是英语也是如此。

1
2
3
反例:我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。

正例:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。

英文句子中,并列词语之间使用半角逗号(,)分隔。

1
例句:Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components.

5.5. 分号

分号表示复句内部并列分句之间的停顿。

5.6. 引号

引用时,应该使用全角双引号(“ ”),注意前后双引号不同。

1
例句:许多人都认为客户服务的核心是“友好”和“专业”。

引号里面还要用引号时,外面一层用双引号,里面一层用单引号(‘ ’),注意前后单引号不同。

1
例句:鲍勃解释道:“我要放音乐,可萨利说,‘不行!’。”

5.7. 圆括号

补充说明时,使用全角圆括号(),括号前后不加空格。

1
例句:请确认所有的连接(电缆和接插件)均安装牢固。

5.8. 冒号

全角冒号()常用在需要解释的词语后边,引出解释和说明。

1
例句:请确认以下几项内容:时间、地点、活动名称,以及来宾数量。

表示时间时,应使用半角冒号(:)。

1
例句:早上 8:00

5.9. 省略号

省略号……表示语句未完、或者语气的不连续。它占两个汉字空间、包含六个省略点,不要使用。。。...等非标准形式。

省略号不应与“等”这个词一起使用。

1
2
3
4
5
反例:我们为会餐准备了香蕉、苹果、梨…等各色水果。

正例:我们为会餐准备了各色水果,有香蕉、苹果、梨……

正例:我们为会餐准备了香蕉、苹果、梨等各色水果。

5.10. 感叹号

应该使用平静的语气叙述,尽量避免使用感叹号

不得多个感叹号连用,比如!!!!!

5.11. 破折号

破折号————一般用于做进一步解释。破折号应占两个汉字的位置。

1
例句:直觉————尽管它并不总是可靠的————告诉我,这事可能出了些问题。

5.12. 连接号

连接号用于连接两个类似的词。

以下场合应该使用直线连接号(-),占一个半角字符的位置。

  • 两个名词的复合
  • 图表编号
1
2
3
例句:氧化-还原反应

例句:图 1-1

以下场合应该使用波浪连接号(),占一个全角字符的位置。

  • 数值范围(例如日期、时间或数字)
1
例句:2009 年~2011 年

注意,波浪连接号前后两个值都应该加上单位。

波浪连接号也可以用汉字“至”代替。

1
例句:周围温度:-20°C 至 -10°C

6. 结构

6.1. 目录结构

技术手册目录结构是一部完整的书,建议采用下面的结构。

  • 简介(Introduction) - [必选][目录|文件] 提供对产品和文档本身的总体的、扼要的说明
  • 入门篇(Quickstart) - [可选][文件] 如何最快速地使用产品
  • 基础篇(Basics) - [必选][目录] 又称”使用篇“,提供初级的使用教程
    • 环境准备(Prerequisite) - [可选][文件] 软件使用需要满足的前置条件
    • 安装(Installation) - [可选][文件] 软件的安装方法
    • 配置(Configuration) - [可选][目录|文件] 软件的配置
    • 特性(Feature) - [必选][目录|文件] 软件的功能特性
  • 进阶篇(Advanced) - [可选][目录] 又称”开发篇“,提供中高级的开发教程
    • 原理(Principle) - [可选][目录|文件] 软件的原理
    • 设计(Design) - [可选][目录|文件] 软件的设计,如:架构、设计思想等
  • 实战篇(Action) - [可选][目录] 提供一些具有实战意义的示例说明
  • API(API) - [可选][目录|文件] 软件 API 的逐一介绍
  • 常见问题(FAQ) - [可选][目录|文件] 常见问题解答
  • 附录(Appendix) - [可选][目录] 不属于教程本身、但对阅读教程有帮助的内容
    • 命令(Command) - [可选][目录] 命令
    • 资源(Resource) - [必选][文件] 资源
    • 术语(Glossary) - [可选][文件] 名词解释
    • 技巧(Recipe) - [可选][文件] 最佳实践
    • 版本(Changelog) - [可选][文件] 版本说明
    • 反馈(Feedback) - [可选][文件] 反馈方式

下面是两个真实范例,可参考。

6.2. 文件名

文档的文件名不得含有空格。

文件名必须使用半角字符,不得使用全角字符。这也意味着,中文不能用于文件名。

1
2
3
反例: 名词解释.md

正例: glossary.md

文件名建议只使用小写字母,不使用大写字母。

1
2
3
反例:TroubleShooting.md

正例:troubleshooting.md

为了醒目,某些说明文件的文件名,可以使用大写字母,比如READMELICENSE

文件名包含多个单词时,单词之间建议使用半角的连词线(-)分隔。

1
2
3
反例:advanced_usage.md

正例:advanced-usage.md

7. Emoji

在 markdown 文档中,普遍会使用 emoji,帮助理解内容。但是,如果滥用 emoji,可能会适得其反。

这里,将一些比较约定俗成的 emoji 表情使用场景列举一下:

  • 💡 提示 - [推荐]
  • 🔔 注意、警告 - [推荐]
  • ⭕ 正确 - [推荐]
  • ❌ 错误 - [推荐]
  • ❓ 问题 - [推荐]
  • ⛔ 禁止 - [推荐]
  • 🚧 未完待续、有待补充 - [推荐]
  • 📚 参考、参考资料 - [可选]
  • ⌨ 源码 - [可选]

8. 参考

HBase 命令

1. 连接 HBase

1
2
$ ./bin/hbase shell
hbase(main):001:0>

2. 查询帮助

1
help

3. 创建表

1
create 'table1','columnFamliy1','columnFamliy2'

说明:

创建一张名为 table1 的 HBase 表,columnFamliy1、columnFamliy2 是 table1 表的列族。

4. 查看表信息

1
list 'table1'

5. 查看表详细信息

1
describe 'table1'

6. 向表中写数据

1
2
3
4
5
6
7
8
9
10
11
put 'table1', 'row1', 'columnFamliy1:a', 'valueA'
put 'table1', 'row1', 'columnFamliy1:b', 'valueB'
put 'table1', 'row1', 'columnFamliy1:c', 'valueC'

put 'table1', 'row2', 'columnFamliy1:a', 'valueA'
put 'table1', 'row2', 'columnFamliy1:b', 'valueB'
put 'table1', 'row2', 'columnFamliy1:c', 'valueC'

put 'table1', 'row1', 'columnFamliy2:a', 'valueA'
put 'table1', 'row1', 'columnFamliy2:b', 'valueB'
put 'table1', 'row1', 'columnFamliy2:c', 'valueC'

7. 扫描表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
hbase> scan 'hbase:meta'
hbase> scan 'hbase:meta', {COLUMNS => 'info:regioninfo'}
hbase> scan 'ns1:
hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
hbase> scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]}
hbase> scan 't1', {REVERSED => true}
hbase> scan 't1', {ALL_METRICS => true}
hbase> scan 't1', {METRICS => ['RPC_RETRIES', 'ROWS_FILTERED']}
hbase> scan 't1', {ROWPREFIXFILTER => 'row2', FILTER => "
(QualifierFilter (>=, 'binary:xyz')) AND (TimestampsFilter ( 123, 456))"}
hbase> scan 't1', {FILTER =>
org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
hbase> scan 't1', {CONSISTENCY => 'TIMELINE'}
For setting the Operation Attributes
hbase> scan 't1', { COLUMNS => ['c1', 'c2'], ATTRIBUTES => {'mykey' => 'myvalue'}}
hbase> scan 't1', { COLUMNS => ['c1', 'c2'], AUTHORIZATIONS => ['PRIVATE','SECRET']}
For experts, there is an additional option -- CACHE_BLOCKS -- which
switches block caching for the scanner on (true) or off (false). By
default it is enabled. Examples:

hbase> scan 't1', {COLUMNS => ['c1', 'c2'], CACHE_BLOCKS => false}

8. 查询 row

1
2
3
get 'table1', 'row1'
get 'table1', 'row1', 'columnFamliy1'
get 'table1', 'row1', 'columnFamliy1:a'

9. 禁用、启用表

1
2
3
4
5
hbase(main):008:0> disable 'test'
0 row(s) in 1.1820 seconds

hbase(main):009:0> enable 'test'
0 row(s) in 0.1770 seconds

10. 删除表

1
2
hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds

11. 停止 HBase

1
2
3
$ ./bin/stop-hbase.sh
stopping hbase....................
$

HBase 维护

配置文件

  • backup-masters - 默认情况下不存在。列出主服务器应在其上启动备份主进程的主机,每行一个主机。
  • hadoop-metrics2-hbase.properties - 用于连接 HBase Hadoop 的 Metrics2 框架。
  • hbase-env.cmd and hbase-env.sh - 用于 Windows 和 Linux / Unix 环境的脚本,用于设置 HBase 的工作环境,包括 Java,Java 选项和其他环境变量的位置。
  • hbase-policy.xml - RPC 服务器用于对客户端请求进行授权决策的默认策略配置文件。仅在启用 HBase 安全性时使用。
  • hbase-site.xml - 主要的 HBase 配置文件。此文件指定覆盖 HBase 默认配置的配置选项。您可以在 docs / hbase-default.xml 中查看(但不要编辑)默认配置文件。您还可以在 HBase Web UI 的 HBase 配置选项卡中查看群集的整个有效配置(默认值和覆盖)。
  • log4j.properties - log4j 日志配置。
  • regionservers - 包含应在 HBase 集群中运行 RegionServer 的主机列表。默认情况下,此文件包含单个条目 localhost。它应包含主机名或 IP 地址列表,每行一个,并且如果群集中的每个节点将在其 localhost 接口上运行 RegionServer,则应仅包含 localhost。

环境要求

  • Java
    • HBase 2.0+ 要求 JDK8+
    • HBase 1.2+ 要求 JDK7+
  • SSH - 环境要支持 SSH
  • DNS - 环境中要在 hosts 配置本机 hostname 和本机 IP
  • NTP - HBase 集群的时间要同步,可以配置统一的 NTP
  • 平台 - 生产环境不推荐部署在 Windows 系统中
  • Hadoop - 依赖 Hadoop 配套版本
  • Zookeeper - 依赖 Zookeeper 配套版本

运行模式

单点

hbase-site.xml 配置如下:

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.example.org:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
</configuration>

分布式

hbase-site.xm 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.example.org:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>
</configuration>

引用和引申

扩展阅读