提交 4154f45e 编写于 作者: W wizardforcel

2022-01-08 19:12:35

上级 ad743ec3
# 一、HBase 简介
HBase 是一个 NoSQL 数据库,可以在单台机器上运行,也可以在一组服务器上运行,以提高性能和容错能力。它是为扩展而构建的—HBase 表可以存储数十亿行和数百万列—但与其他面向批处理的大数据技术不同,HBase 提供实时数据访问。
有几个关键概念使 HBase 不同于其他数据库,在本书中,我们将了解所有关于行键结构、列族和区域的知识。但是 HBase 使用了与其他数据库设计相同的基本概念,所以很容易理解。
......
# 二、HBase 和 HBase Shell
对于开发和测试环境,您可以在一台机器上运行 HBase。HBase 支持三种运行模式:独立、伪分布式和分布式。分布式模式适用于由 HDFS 支持的完整集群,多个服务器运行不同的 HBase 堆栈组件,我们将在第 8 章“HBase 的体系结构”中介绍这一点
独立模式适用于单个机器,其中所有组件在单个 Java 虚拟机中运行,本地文件系统用于存储,而不是 HDFS。伪分布式模式在一台服务器上的不同 JVM 中运行每个 HBase 组件,它可以使用 HDFS 或本地文件系统。
......
# 三、HBase 表的设计
在数据库中的表之间没有任何关系,也没有索引、数据类型、默认值、计算列,或者任何其他在现代 SQL 数据库,甚至其他 NoSQL 数据库中得到的奇特功能。正因为如此,HBase 中的数据建模看似简单——您必须处理的唯一构造是表、行和列族。
但是在 HBase 中对数据的访问总是通过行键,所以如何构造键对数据库的性能和可用性有着巨大的影响。在上一章的访问日志表中,我使用了行键格式{systemID}|{userId}|{period}。这种格式意味着该表对于一个读取场景是好的,但是对于其他场景是坏的。
......
# 四、使用 Java API 来连接
客户端连接到 HBase 的本机应用编程接口是 Java 应用编程接口。该功能可以分为两部分——元数据和管理功能——它们连接到主服务器,以及数据访问功能,它们连接到区域服务器(我们将在第 8 章“HBase 的体系结构”中更深入地介绍这些服务器)。
除了确保端口打开(默认情况下,Zookeeper 为 2181,Master 为 60000,Region Servers 为 60020)之外,您不需要做任何事情来从服务器支持 Java API。
......
# 五、使用 Python 和 Thrift 来连接
HBase 非常适合跨平台的解决方案,而节俭 API 是 Java API 的替代。节俭是 Apache 的通用 API 接口,支持从不同语言到 Java 服务器的客户端连接。我们将在本章中使用 Python,但是您可以使用任何带有节俭绑定的语言(包括 Go、C#、Haskell 和 Node)。
节俭应用编程接口是一个外部接口,所以它需要一个额外的 JVM 来运行。您可以用 HBase 守护程序脚本 hbase-daemon 启动它。它可以独立于其他 HBase 集群托管,也可以在区域服务器上运行。节俭没有本机负载平衡器,但传输是 TCP,所以您可以使用外部负载平衡器(如 HAProxy)。
......
星门是 HBase REST API 的名称,它使数据可以通过 HTTP 进行读写。Stargate 公开来自与表结构匹配的 URL 的数据(例如,/access-logs/rk1 将从 access-logs 表中获取带有关键字 rk1 的行)。
# 六、.NET 和 Stargate 来连接
Stargate是 HBase REST API 的名称,它使数据可以通过 HTTP 进行读写。Stargate 公开来自与表结构匹配的 URL 的数据(例如,/access-logs/rk1 将从 access-logs 表中获取带有关键字 rk1 的行)。
HTTP 动词 GET、POST 和 DELETE 用于处理作为资源的数据,这给了 Stargate 一个很好的 RESTful 接口。您可以在 JSON 中处理行和单元格,但该应用编程接口的缺点是所有数据都表示为 Base64 字符串,这些字符串是从 HBase 中的原始字节数组编码而来的。如果您只想使用像 Postman 或 cURL 这样的 REST 客户端进行浏览,这将使应用编程接口变得很尴尬。
像节俭应用编程接口一样,星际之门是一个独立的服务,你可以从 hbase-daemon.sh 开始休息。默认情况下,它监听端口 8080(并且已经在 hbase-简洁地说是 Docker 映像上运行)。
在生产环境中,您可以在区域服务器上运行星门,但是如果您想将它用作 HBase 的主要接口,您应该考虑使用单独的服务器进行负载平衡。
在生产环境中,您可以在区域服务器上运行Stargate,但是如果您想将它用作 HBase 的主要接口,您应该考虑使用单独的服务器进行负载平衡。
![](img/00012.jpeg)提示:在[这篇博文](https://blog.sixeyed.com/using-nginx-as-a-load-balancing-proxy-for-stargate)中,我用 Nginx 构建了一个负载平衡反向代理。
您可以使用任何带有 HTTP 客户端的框架来与星门对话。在本章中,我们将使用 cURL 来查看原始的 HTTP 数据,并使用. NET 客户端库在更高的抽象级别上工作。
您可以使用任何带有 HTTP 客户端的框架来与Stargate对话。在本章中,我们将使用 cURL 来查看原始的 HTTP 数据,并使用. NET 客户端库在更高的抽象级别上工作。
代码清单 48 显示了对根星门 URL 的 GET 请求(cURL 中的默认动词)。响应与 HBase Shell 中的列表命令相同:
代码清单 48 显示了对根Stargate URL 的 GET 请求(cURL 中的默认动词)。响应与 HBase Shell 中的列表命令相同:
48:用 cURL 列出表格
......@@ -21,9 +23,9 @@ HTTP 动词 GET、POST 和 DELETE 用于处理作为资源的数据,这给了
```
HTTP GET 请求相当于 HBase 外壳中的 GET 命令。您可以添加一个接受头来指定您想要的响应格式,但是星门提供的数据量有一些限制。
HTTP GET 请求相当于 HBase 外壳中的 GET 命令。您可以添加一个接受头来指定您想要的响应格式,但是Stargate提供的数据量有一些限制。
如果您试图请求整个表,例如 http://127 . 0 . 0 . 1:8080/access-logs,您将得到一个错误响应,状态代码为 405,这意味着该方法不被允许。你不能在 HBase 中获取整个表,405 是星门的实现。
如果您试图请求整个表,例如 http://127 . 0 . 0 . 1:8080/access-logs,您将得到一个错误响应,状态代码为 405,这意味着该方法不被允许。你不能在 HBase 中获取整个表,405 是Stargate的实现。
您可以通过在表名后添加行键来获取一整行,但是如果您的行格式中有任何对 HTTP 不友好的字符,您将需要在 URL 中对它们进行转义。您也不能获得一行的纯文本表示;您需要用像 JSON 这样的以数据为中心的格式发出请求。
......@@ -61,11 +63,11 @@ HTTP GET 请求相当于 HBase 外壳中的 GET 命令。您可以添加一个
| 单元格.列 | dDoxMTA2 | t:1106 |
| 手机。$ | MTIw | One hundred and twenty |
6:编码和解码的星门
6:编码和解码的Stargate
请注意,单元格中的列值是全名(列族加上限定符,用冒号分隔),数值单元格值实际上是字符串。
您还可以从 Stargate 获取一行中的单列族(使用 URL 格式/{ table }/{ row-key }/{ column-family }),或者单个单元格值。对于单个单元格,您可以以纯文本方式获取它们,星门将在响应中解码该值,如**错误!未找到参考源。**:
您还可以从 Stargate 获取一行中的单列族(使用 URL 格式/{ table }/{ row-key }/{ column-family }),或者单个单元格值。对于单个单元格,您可以以纯文本方式获取它们,Stargate将在响应中解码该值,如**错误!未找到参考源。**:
代码清单 50:获取单个单元格值
......@@ -81,7 +83,7 @@ HTTP GET 请求相当于 HBase 外壳中的 GET 命令。您可以添加一个
网址格式仍然需要一个行键和一个表,但是使用 PUT,网址中的键被忽略,取而代之的是请求数据中的键。代码清单 51 显示了更新我的行中两个单元格的 PUT 请求:
51:用星门更新细胞
51:用Stargate更新细胞
```java
$ curl -X PUT -H "Content-Type: application/json" -d '{
......@@ -101,9 +103,9 @@ HTTP GET 请求相当于 HBase 外壳中的 GET 命令。您可以添加一个
```
![](img/00012.jpeg)提示:星门对于临时请求非常方便,但是使用 Base64 可能会很困难。我在博客上写了一些简单的工具让它变得更简单。
![](img/00012.jpeg)提示:Stargate对于临时请求非常方便,但是使用 Base64 可能会很困难。我在博客上写了一些简单的工具让它变得更简单。
该 PUT 请求增加了实际上是我的行中的字符串的数值。通过星门不能使用 incr 命令自动增加计数器列,所以如果你需要增加值,那么你必须先读取它们,然后进行更新。
该 PUT 请求增加了实际上是我的行中的字符串的数值。通过Stargate不能使用 incr 命令自动增加计数器列,所以如果你需要增加值,那么你必须先读取它们,然后进行更新。
您可以使用 cURL 做更多的事情,比如发送删除请求来删除数据,以及创建扫描仪来获取多行,但是语法变得很麻烦。在星际之门中使用 RESTful API 的包装器是一个更好的选择。
......@@ -113,18 +115,18 @@ NuGet 是的包管理器。NET 应用,还有几个开源包是访问星际之
将该包及其依赖项添加到。NET 应用中,您可以使用代码清单 52 中的 NuGet 包管理器控制台命令:
52:为星门添加一个 NuGet 引用
52:为Stargate添加一个 NuGet 引用
```java
Install-Package "HBase.Stargate.Client.Autofac"
```
在本书的 GitHub 存储库中,有一个. NET 控制台应用,它使用部落的客户端连接到星门,运行在简洁的 Docker 容器中。
在本书的 GitHub 存储库中,有一个. NET 控制台应用,它使用部落的客户端连接到Stargate,运行在简洁的 Docker 容器中。
要设置星门客户端,您需要配置服务器网址并构建容器。代码清单 53 展示了如何使用 Autofac 实现这一点:
要设置Stargate客户端,您需要配置服务器网址并构建容器。代码清单 53 展示了如何使用 Autofac 实现这一点:
53:配置星门客户端
53:配置Stargate客户端
```java
var builder = new ContainerBuilder();
......@@ -138,7 +140,7 @@ NuGet 是的包管理器。NET 应用,还有几个开源包是访问星际之
```
星之门选项对象包含星之门(或代理)网址,星之门模块包含所有其他容器注册。从容器中获得的 IStargate 接口提供了对所有星门客户端操作的访问,具有简洁的抽象,并且所有数据项都编码为字符串。
星之门选项对象包含星之门(或代理)网址,星之门模块包含所有其他容器注册。从容器中获得的 IStargate 接口提供了对所有Stargate客户端操作的访问,具有简洁的抽象,并且所有数据项都编码为字符串。
星际之门客户端有两种读取数据的方法。最简单的是 ReadValue(),它获取一个特定的单元格值,将表名、行键、列族和限定符传递给它。这在功能上等同于带有包含表名、行键和列名的 URL 的 GET 请求,它返回编码为字符串的单个单元格值,如代码清单 54 所示:
......@@ -166,9 +168,9 @@ NuGet 是的包管理器。NET 应用,还有几个开源包是访问星际之
ReadValue()调用将很快返回,因为它获取的是单个数据,FindCells()调用将很快为 Stargate 服务,但是如果有许多包含大量数据的单元格,客户端可能需要更长时间才能收到。
星门获取数据的另一种方法是创建一个行扫描器,它类似于服务器端的游标,您可以使用它来读取多行,并且扫描器可以选择有一个过滤器来限制返回的单元格数量。
Stargate获取数据的另一种方法是创建一个行扫描器,它类似于服务器端的游标,您可以使用它来读取多行,并且扫描器可以选择有一个过滤器来限制返回的单元格数量。
星门扫描行有两个部分。首先,创建运行在服务器上的扫描仪。星际之门给你一个扫描仪的参考,你可以用它来获取行。在。NET 客户端,您可以使用 ScannerOptions 对象来指定扫描的开始和结束行。
Stargate扫描行有两个部分。首先,创建运行在服务器上的扫描仪。星际之门给你一个扫描仪的参考,你可以用它来获取行。在。NET 客户端,您可以使用 ScannerOptions 对象来指定扫描的开始和结束行。
代码清单 56 显示了如何创建一个扫描器,从 2015 年 10 月开始为一个系统检索一个用户的所有访问日志:
......@@ -205,7 +207,7 @@ ReadValue()调用将很快返回,因为它获取的是单个数据,FindCells
![](img/00015.jpeg)注意:当您通过扫描仪迭代时返回的单元格可能来自多行,因此不要假设 MoveNext(或其他客户端中的等效方法)移动到下一行—它会移动到下一组单元格,这些单元格可能来自多行。
按行键扫描是从星门读取数据的最快方法,但是如果需要通过列中的数据(限定符或单元格值)来额外限制结果,则可以在创建扫描仪时指定过滤器。
按行键扫描是从Stargate读取数据的最快方法,但是如果需要通过列中的数据(限定符或单元格值)来额外限制结果,则可以在创建扫描仪时指定过滤器。
过滤器也在 Stargate 中运行服务器端,所以它比在客户端获取整行和提取某些列更快,但是它确实使用了额外的服务器资源(如果您在区域服务器上运行 Stargate,这很重要)。
......@@ -233,7 +235,7 @@ column prefixfilter–返回列名与指定前缀匹配的单元格
```
IStargate 接口有两种写入数据的方法。最简单的是 WriteValue(),它相当于对一行中特定单元格的 PUT 请求。如果需要,星门会创建行和/或列,并设置值,如代码清单 59 所示:
IStargate 接口有两种写入数据的方法。最简单的是 WriteValue(),它相当于对一行中特定单元格的 PUT 请求。如果需要,Stargate会创建行和/或列,并设置值,如代码清单 59 所示:
59:用 IStargate 更新单元格值
......@@ -277,7 +279,7 @@ IStargate 接口有两种写入数据的方法。最简单的是 WriteValue(),
```
星际之门 API 是无状态的(即使是扫描器也运行在 Region Server 上,Region Server 不一定是星际之门服务器),客户端也是无状态的,所以本地没有数据缓存,除非你自己在内存中保留单元格。每次调用星门客户端读取或写入数据都会导致对星门的 REST 调用。
星际之门 API 是无状态的(即使是扫描器也运行在 Region Server 上,Region Server 不一定是星际之门服务器),客户端也是无状态的,所以本地没有数据缓存,除非你自己在内存中保留单元格。每次调用Stargate客户端读取或写入数据都会导致对Stargate的 REST 调用。
在这一章中,我们看了星际之门,HBase 提供的 REST API。它将行中的数据作为资源公开,使用描述数据路径的 URL 格式,始终包括表名和行键,以及可选的列族和限定符。
......
# 七、HBase 的架构
在 HBase 的分布式部署中,体系结构有四个组件,它们共同构成了 HBase 服务器:
区域服务器–托管区域并提供数据访问的计算节点
......
# 八、区域服务器内部
尽管区域服务器利用了 HDFS,因此它与存储层之间的接口清晰明了,但要提供最佳性能,还需要增加复杂性。区域服务器最大限度地减少了与 HDFS 的交互次数,并将热数据保存在缓存中,这样就可以在没有缓慢磁盘读取的情况下提供服务。
每个区域服务器中有两种类型的缓存,如图 10 所示:
......
# 九、监控和管理 HBase
所有的 HBase 服务都提供了一个简单的网络用户界面,它为您提供了关于服务如何运行的基本信息,并允许您访问日志。这些对于故障排除和诊断非常有用,核心服务(主服务器和区域服务器)拥有更丰富的网络用户界面,可以告诉您很多关于数据库运行状况的信息。
网络用户界面是使用 Jetty 网络服务器(内存占用少,响应时间快)嵌入的,因此它们在您运行相关服务时启动。它们都是不安全的网站;它们在没有通过 HTTP 进行身份验证的情况下运行。每个用户界面都运行在一个非标准的 HTTP 端口上,因此如果您想要限制用户界面的可用性,您需要阻止对端口的外部访问。
......@@ -14,7 +16,7 @@ Docker 容器 hbase-简洁地说,所有的 HBase 服务器都在运行,所
![](img/00029.jpeg)
18:星门 UI
18:Stargate UI
两个用户界面都显示了正在运行的 HBase 的确切版本,包括 git 提交标识(在修订字段中)和服务器的正常运行时间。如果服务器没有运行,您将不会从网络用户界面得到响应。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册