大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第四章 分布式数据库HBase

2023-11-06

第四章 分布式数据库HBase

HBase是一个开源的分布式数据库,它是基于Google的Bigtable论文实现的。HBase旨在提供一个高可靠性、高性能、面向列存储的分布式数据库,适用于大规模数据存储和处理。HBase的数据模型和访问接口类似于关系数据库,但是其底层存储和访问方式与关系数据库完全不同


4.1 概述

HBase是一个开源的分布式数据库,它是基于Google的Bigtable论文实现的。


4.1.1 从BigTable说起

BigTable是一种分布式的结构化数据存储系统,由Google开发,用于存储大规模数据。它是一种基于列的数据库,可以处理非常大的数据集,同时具有高可扩展性和高可用性。

BigTable的设计灵感来自于Google的其他项目,如Google File System和MapReduce。它使用类似于MapReduce的技术来处理大规模数据,同时通过Google File System来存储数据。

BigTable的数据模型是基于列族(Column Family)的。列族是一组相关列的集合,它们在物理上存储在一起,并且具有相同的前缀。每个列族都可以包含任意数量的列,这些列被称为列限定符(Column Qualifier)。列族和列限定符的组合形成了一个单元格(Cell),这是BigTable中存储数据的基本单位。

BigTable支持高并发访问和快速读取和写入数据。它还具有可伸缩性和容错性,可以容纳数百个Petabyte的数据,并在数据中心中的数千台服务器上提供高可用性的服务。

除了Google自己使用BigTable来存储大量的数据之外,许多其他公司和组织也在使用BigTable来存储和处理大规模数据,如NASA、Spotify和Twitter等。


4.1.2 HBase简介

HBase是一种开源的分布式列式数据库,它是Apache Hadoop项目的一部分,基于Google BigTable的设计思想和数据模型。HBase可以处理非常大的数据集,并提供高可扩展性和高可用性。它通常用于存储半结构化和非结构化数据,例如日志、社交媒体数据和传感器数据等。

HBase的数据模型是基于列族的,与BigTable类似。它使用类似于Hadoop的分布式文件系统来存储数据,并使用Apache ZooKeeper来协调节点之间的通信和管理集群中的节点。

HBase具有许多特性,例如自动分区、数据复制、数据压缩、数据版本控制和随机读写等。它也支持MapReduce和Apache Spark等分布式计算框架,可以与Hadoop生态系统中的其他组件无缝集成,如Hadoop Distributed File System(HDFS)和YARN等。

与传统的关系型数据库不同,HBase使用Java编程语言和Hadoop的分布式计算框架来处理数据。它适用于需要快速读写大量数据的场景,例如实时分析、搜索引擎、推荐系统和实时监控等。

总之,HBase是一种高性能、可扩展和高可用的分布式数据库,它提供了非常好的数据存储和处理解决方案,适用于大规模数据的存储和处理。


4.1.3 HBase与传统关系数据库的对比分析

HBase和传统关系数据库(Relational Database)有着显著的差异和优劣势,下面进行对比分析:

  1. 数据模型

传统关系数据库采用表格形式存储数据,每个表格包含若干行和列,每行代表一个记录,每列代表一个属性。数据必须严格遵守预定义的数据结构和数据类型,需要进行关系建模,定义表结构和约束等。而HBase采用面向列族(Column Family)的数据模型,将数据按照列族分组存储,每个列族可以动态添加新的列,数据无需预先定义表结构和约束,更加灵活自由。

  1. 存储引擎

传统关系数据库采用B+树等索引结构进行数据存储和查询,支持事务和ACID特性,保证数据的一致性和可靠性。而HBase采用Hadoop基础设施和HDFS进行底层存储,支持分布式存储和处理,具有高扩展性和高可用性,但不支持事务和ACID特性。

  1. 数据访问

传统关系数据库采用SQL语言进行数据访问和查询,具有较高的查询效率和灵活性,支持多种查询操作和聚合函数。而HBase采用Java API或HBase Shell进行数据访问和查询,需要编写代码或命令行操作,相对于SQL语言来说,使用上更加复杂,查询效率也相对较低。

  1. 应用场景

传统关系数据库适用于需要进行高度规范化和事务控制的场景,如金融、电商等领域。而HBase适用于需要进行海量数据存储和实时查询的场景,如社交网络、物联网等领域。

综上所述,HBase和传统关系数据库各有优劣势,应根据具体的应用场景和需求进行选择。如果需要进行高度规范化和事务控制,则传统关系数据库更为适合;如果需要进行海量数据存储和实时查询,则HBase更为适合。


4.2 HBase访问接口

以下是HBase提供的访问接口的表格:

类型

特点

使用场合

Native Java API

面向对象的 API,使用起来直观简单,提供了各种操作 HBase 的方法。

适用于 Java 开发者,需要使用完整的 HBase 功能。

HBase Shell

基于命令行的 Shell 工具,可以使用类似 SQL 的语言进行操作,简单易学,适合初学者。

适用于不需要编程能力的用户,进行简单的 CRUD 操作。

Thrift Gateway

通过 Thrift 接口提供对 HBase 的访问,支持多种语言(Java、Python、PHP、Ruby等),可以通过网络访问 HBase。

适用于多语言环境下,需要通过网络访问 HBase 的应用场合。

REST Gateway

通过 REST 接口提供对 HBase 的访问,支持通过 HTTP、JSON、XML 等方式进行数据传输,可以通过网络访问 HBase。

适用于需要通过 Web 应用程序进行数据访问的场合。

Pig

Hadoop 的一个高级查询语言,可以快速编写 MapReduce 任务,支持对 HBase 进行数据的读写操作。

适用于需要在 Hadoop 生态系统中使用 HBase 进行数据处理的场合,提高查询效率。

Hive

Hadoop 的另一个数据仓库工具,可以将 HBase 表作为 Hive 表使用,支持对 HBase 表进行数据查询和存储。

适用于需要进行数据仓库操作的场合,比如大数据分析、BI 系统等,可以将 HBase 作为 Hive 的数据存储。

注:Thrift 和 REST Gateway 都是通过网络访问 HBase,但 REST Gateway 更适合通过 Web 应用程序进行数据访问,而 Thrift Gateway 更适合在后端使用,以提供对 HBase 的访问。


4.3 HBase数据模型

4.3.1 数据模型概述

HBase数据模型是基于Google的Bigtable论文所描述的数据模型设计的,是一种分布式、面向列族(column family)的数据存储模型。

在HBase中,数据被组织成表(table)的形式,每个表可以包含多个列族(column family),每个列族可以包含多个列(column)。每个列都由列名(column name)和时间戳(timestamp)唯一确定。

在列族级别上,可以对数据进行操作,例如对某个列族的所有数据进行扫描、删除等。而在列级别上,可以对单个数据进行操作,例如获取某个单元格的值、更新某个单元格的值等。

HBase的数据模型具有以下特点:

  • 稀疏性:只保存有值的单元格,没有值的单元格不会占用存储空间。

  • 可扩展性:可以通过水平扩展增加集群节点来扩展存储容量。

  • 灵活性:可以动态地添加和删除列族、列以及表,数据模型的设计可以根据应用场景进行调整。

  • 顺序性:行键(row key)被排序,因此可以进行范围查询。

HBase的数据模型适用于需要海量数据存储、高并发读写、高可靠性、扩展性好的场景,例如Web应用、日志处理、物联网等。


4.3.2 数据模型的相关概念

HBase 实际上就是一个稀疏、多维、持久化存储的映射表,它采用行键(Row Key )、列(Column Family)列限定符(Column Oualifier)和时戳(Timestamp)进行索引每个值都未经解释的字节数组 byte[]。下面具体介绍HBase 数据模型的相关概念。

HBase 数据模型的相关概念包括:

  1. 表格 (Table):在 HBase 中,数据被组织成一系列的表格,每个表格由多行组成,每行可以包含多列。

  1. 行 (Row):HBase 中的行是由一个唯一的行键 (Row Key) 标识的,它是一个字节数组。行键被用来唯一标识表格中的每一行数据。

  1. 列族 (Column Family):HBase 中的列可以按照其所属的列族进行组织。每个列族都有一个唯一的名称,它们被用来在表格中组织相关的列。列族在表格创建时就必须指定,而且在表格的生命周期中无法更改。

  1. 列限定符 (Column Qualifier):在一个列族下,每个列可以通过其列限定符进行唯一标识,它是一个字节数组。因此,一个 HBase 表格中的列可以通过其所属的列族和列限定符唯一确定。

  1. 单元格 (Cell):HBase 中的单元格是由行键、列族、列限定符和时间戳所确定的一个单元,它可以包含一个字节数组类型的值。

  1. 时间戳 (Timestamp):在 HBase 中,每个单元格都可以保存多个版本的值,每个版本都有一个时间戳。时间戳可以用来进行数据的版本控制和时间序列分析。

  1. 命名空间 (Namespace):命名空间是 HBase 中的一个概念,它用来将表格分组,从而更好地组织和管理表格。一个命名空间可以包含多个表格。

以上是 HBase 数据模型的相关概念,它们一起组成了 HBase 的存储和访问机制。


4.3.3 数据坐标

HBase使用数据坐标来定位表中的数据。具体来说,HBase中的数据是按照行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)和时间戳(Timestamp)等多个维度进行组织和存储的。其中,行键是唯一标识一行数据的关键字,列族是一组相关的列的集合,列限定符是列族中的每个列的唯一标识,时间戳表示数据的版本信息。

在HBase中,数据坐标可以用行键、列族和列限定符来表示。具体来说,HBase表中的每一行数据都有一个唯一的行键,行键可以是任意字符串类型的数据,如数字、字母、符号等。列族是一组相关的列的集合,所有的列都属于某个列族,并且每个列族都有一个唯一的标识符。列限定符是列族中的每个列的唯一标识,可以是任意字符串类型的数据。

通过使用数据坐标,HBase可以快速定位表中的数据。具体来说,当需要查询、插入或更新某个数据时,只需要提供相应的行键、列族和列限定符,HBase就可以根据这些信息快速定位数据所在的位置,从而进行相应的操作。同时,HBase还支持多版本数据,即同一行数据可以有多个版本,每个版本都有一个唯一的时间戳,可以根据时间戳来查询指定版本的数据。

总之,数据坐标是HBase中定位数据的关键,通过合理设计和使用数据坐标,可以提高数据的查询效率和存储效率,从而更好地支持大规模数据存储和处理。


假设有一个HBase表,其中存储着学生的成绩信息,包括学生的姓名、科目、成绩和考试时间等多个维度的数据。那么,在HBase中,可以将数据按照以下方式组织和存储:

  • 表名:StudentScores

  • 行键:学生的学号(唯一标识一行数据)

  • 列族:ScoreInfo(包括科目、成绩和考试时间三个列)

  • 列限定符:科目名称、考试时间、成绩等(唯一标识列族中的每个列)

  • 时间戳:每个数据版本的唯一标识(可选,如果不指定则默认为系统当前时间)

例如,某个学生的学号为001,他在数学、英语和物理三门科目中的成绩分别为85、90和95分,考试时间为2022年1月1日。那么,可以将该学生的成绩信息按照以下方式存储在HBase表中:

行键

列族:ScoreInfo

列限定符:Subject

列限定符:Score

列限定符:ExamTime

001

ScoreInfo

Math

85

2022-01-01 10:00:00

001

ScoreInfo

English

90

2022-01-01 11:00:00

001

ScoreInfo

Physics

95

2022-01-01 12:00:00

通过这种方式,可以通过学生的学号、科目名称和考试时间等数据坐标来快速定位学生的成绩信息,并进行查询、插入、更新等操作。

通过(001,ScoreInfo, Score,2022-01-01 10:00:00)就可以查到结果为85

4.3.4 概念视图

在 HBase 的概念视图中,一个表可以视为一个稀疏、多维的映射关系。

在 HBase 中,表格被视为一个稀疏、多维的映射关系。这里简单解释一下稀疏和多维的含义:

  • 稀疏:稀疏表示表中的数据往往不是密集存在的,有很多位置是空的,也就是没有存储数据的。这是因为 HBase 的数据存储是按照行键排序的,而行键一般是字符串类型,所以在表中可能会存在很多不连续的行键,这些行键之间可能会存在空隙。因此,表中的数据会呈现出一定的稀疏性质,即有很多位置是没有数据的。

  • 多维:多维表示表中的数据是以多维数组的形式进行存储的,可以用行键、列族、列以及时间戳等多个维度来定位一个数据。其中,行键可以看作一维,列族和列可以看作另外两维,时间戳可以看作第四维。通过这些维度的组合,就可以唯一定位一个数据。

举个例子,假设有一个 HBase 表格用于存储学生的成绩信息,那么每个行键就可以表示一个学生,每个列族可以表示不同的科目,每个列可以表示对应科目的不同考试成绩,时间戳可以表示每次考试的时间。这样,通过行键、列族、列以及时间戳四个维度的组合,就可以定位到每一个学生在每门科目的每次考试中的成绩信息。同时,由于表格中存在很多学生,每个学生可能没有参加所有科目的所有考试,因此表格中的数据会呈现出一定的稀疏性质,即存在很多位置是没有存储数据的。


该图中行键是一个反向的URL,这是为了保证让同一个网站的数据都尽量保存在一个分区里。

正向的URL在字典序中排列是没有规律可言的,是因为URL字符串本身的构成和长度是不可控的。URL字符串中可能包含各种字符、数字、特殊符号等,长度也可能各不相同,因此正向的URL字符串在字典序中排列是不规律的,无法按照一定的规则进行排序。
例如,假设有两个URL:" http://www.example.com/" 和 " https://www.example.com/index.html",在字典序中,这两个URL的排序就无法按照某种规律进行,因为两个URL的长度和构成都不相同,无法进行比较和排序。 不能比较就说明不容易确定这两个的相似性,那这两个URL的数据就容易被存在不同的分区中,网站对数据的操作就会趋于麻烦。

反向的URL字符串是按照“域名倒序+路径倒序”这个规则进行构造的,因此在字典序中排列是有规律可循的。具体来说,这个规则是指将URL中的域名和路径分别进行倒序,然后将它们拼接起来,作为行键进行存储和查询。
举个例子,假设有两个URL: http://www.example.com/index.htmlhttp://www.example.com/about.html。按照反向的URL字符串规则,它们会被转换为如下形式的行键:
对于 http://www.example.com/index.html,反向的URL字符串为 com.example.www/index.html
对于 http://www.example.com/about.html,反向的URL字符串为 com.example.www/about.html
按照字典序排序,这两个行键会排列成如下顺序:
com.example.www/about.html
com.example.www/index.html
可以看到,这两个行键按照反向的URL字符串规则进行排序,它们的域名和路径分别倒序后拼接成了新的字符串,然后按照字典序进行排序。这种方式使得具有相似URL的行键可以被分配到同一个分区中,从而提高了查询效率。

4.3.5 物理视图

在传统的关系型数据库中,数据是按照行存储的,也就是说每一行数据都会存储在一个物理块中,包括行的各个字段。这种存储方式在查询某些行数据时非常高效,因为可以直接读取该行的所有字段。

HBase则采用基于列的存储方式。在HBase中,所有的数据都是按照行键、列族、列名、时间戳的顺序存储的。每一个行键对应着一行数据,但是这些数据并不是按照行存储的,而是按照列族和列名存储的。也就是说,如果一行数据包括多个列,那么这些列的数据会被存储在不同的物理块中。这种存储方式被称为稀疏存储,因为每行数据中可能只有部分列有值。

采用基于列的存储方式,可以大大降低存储空间的消耗,同时也可以提高数据查询的效率。在HBase中,可以通过列族来组织数据,将相同类型的数据放在一起存储,提高数据的读取效率。

在表 4-4 的概念视图中,我们可以看到,有些列是空的,即这些列上面不存在值。在物理视图中,这些空的列不会被存储成 null,而是根本就不会被存储,当请求这些空白的单元格的时候会返回 null值。


4.3.6 面向列的存储

面向列的存储是指将每一列的数据作为一个单独的存储单元来处理,而不是将整行数据作为一个单元进行存储。这种存储方式最初是为了解决数据仓库中的大型数据集的存储和查询问题而出现的,而现在已经在大量的数据处理和存储系统中被广泛使用。

在面向列的存储中,每一列的数据都被存储在一起,而不是像传统的行式存储方式一样,将整行数据一次性读取出来。这种存储方式可以提高查询效率,尤其是对于需要对大量数据进行聚合、过滤和分析的场景,比如数据仓库、日志分析等。

面向列的存储还具有更好的可扩展性,因为每一列的数据都可以被单独地分配和处理,这样可以更容易地将数据分布到多个节点上进行处理,从而实现横向扩展。

在 HBase 中,面向列的存储方式被广泛应用,因为它可以更好地处理海量数据的存储和查询需求。通过将数据按列族进行组织和存储,可以进一步提高数据的查询和访问效率,同时还能够保证数据的可扩展性和可靠性。

NSM(N-ary Storage Model)和DSM(Column Store Model)是两种不同的数据存储模型。
NSM是传统关系数据库采用的存储模型,数据是按行存储的,即每行数据中包含了所有列的信息,数据是按照列定义的数据类型来存储的。例如,假设有一个学生表,其中包含学生的ID、姓名、年龄、性别等信息,那么每行数据都会包含这些信息。这种存储方式的优点是可以提高数据的可读性和可维护性,方便进行数据的查询和分析。但是,由于数据是按照行存储的,会造成大量的空间浪费和查询效率低下的问题,特别是当表中有大量的列时。
DSM是面向列的存储模型,数据是按列存储的,即每个列都是一个存储单元,数据也是按照列存储的。例如,假设有一个学生表,其中包含学生的ID、姓名、年龄、性别等信息,那么每个列都会包含相同类型的数据。这种存储方式的优点是可以减少空间浪费,提高查询效率,尤其是当需要查询特定的列时。但是,由于数据是按照列存储的,需要通过特定的技术来将列拼接在一起,这样会增加数据的复杂度和维护难度。
举个例子,假设有一个销售记录表,其中包含销售日期、销售员、销售金额、产品名称等信息。如果采用NSM模型存储,每行数据都会包含这些信息,但是当表中有大量的记录时,会造成大量的空间浪费。如果采用DSM模型存储,每个列都会包含相同类型的数据,例如,所有销售金额会存储在一个列中,这样可以减少空间浪费,并且在查询销售金额时也可以提高效率。

假设有一个类似以下的表结构:

用户ID

用户名

邮箱地址

注册时间

最后登录时间

001

Alice

alice@example.com

2022-01-01 00:00:00

2022-01-15 12:00:00

002

Bob

bob@example.com

2022-01-02 00:00:00

2022-01-14 09:00:00

003

Charlie

charlie@example.com

2022-01-03 00:00:00

2022-01-16 16:00:00

在传统的关系型数据库中,该表的存储方式是基于行的。即每个用户的所有信息都存储在一行中,包括用户ID、用户名、邮箱地址、注册时间和最后登录时间。

而在HBase中,该表的存储方式是基于列的。即每个列族的数据存储在一起,例如可以将用户名和邮箱地址存储在一个列族中,将注册时间和最后登录时间存储在另一个列族中。每个列族中的数据又按列存储,例如可以将所有用户的用户名存储在一个列中,将所有用户的邮箱地址存储在另一个列中。这样的存储方式可以更方便地进行列级别的查询和更新,并且支持动态添加列,使得表的结构更加灵活。


4.4 HBase的实现原理

4.4.1 HBase的功能组件

HBase的实现包括三个主要的功能组件:HDFS、ZooKeeper 和 HBase RegionServer。其中,HDFS是用来存储数据的分布式文件系统,ZooKeeper是用来管理集群状态和元数据的分布式协调服务,而 HBase RegionServer 是用来处理数据读写请求并维护分配给它的 Region 的工作节点。HBase Master 是集群的管理节点,但并不是负责维护 HBase 表的分区信息的,而是负责协调 RegionServer 和进行负载均衡。HBase的表被分成多个 Region,每个 Region 存储一部分数据,由 HBase RegionServer 负责存储和维护。因此,如果某个 RegionServer 失效,只有该 RegionServer 上存储的 Region 会受影响,其他 RegionServer 上的 Region 不受影响。当某个 RegionServer 发生故障时,HBase Master 会将该 RegionServer 上存储的 Region 重新分配给其他可用的 RegionServer。除此以外,HBase Master 还处理表和列族的创建、修改和删除等操作。

HBase 的实现包括三个主要的功能组件:库函数,链接到每个客户端;一个 Master 主服务器也称为 Master;许多个 Region 服务器。库函数是 HBase 客户端 API,用于与 Master 和 Region 服务器通信。Master 主服务器负责协调集群中的 Region 服务器,并处理元数据操作,如创建、删除和修改表。Region 服务器负责存储和管理表中的一部分或多部分数据,并处理客户端请求.

HBase 客户端在进行数据读取时,并不是直接从 HBase Master 主服务器上读取数据,而是通过 ZooKeeper 获取对应 RegionServer 的地址信息,然后直接与对应的 RegionServer 进行数据读取操作。这种设计方式减轻了 HBase Master 主服务器的负载,因为客户端不需要与 Master 进行通信来获取数据位置信息。相反,HBase Master 主服务器主要负责处理元数据和负载均衡等管理任务。


4.4.2 表和Region

在 HBase 中,数据存储在表中,表由若干个 Region 组成。表可以在任何时候进行分割和合并,而分割和合并操作的基本单位是 Region。每个 Region 包含一定范围的行键(Row Key)和列族(Column Family)。

当一个表被创建时,HBase 会为该表创建一个或多个 Region,并将这些 Region 平均分布到不同的 RegionServer 上。当表中的数据增长到一定程度时,为了保证查询效率和负载均衡,HBase 会自动将一个 Region 分割成两个或多个子 Region,这个过程称为分裂(Split)。分裂操作会生成新的 Region,并重新分配这些 Region 到不同的 RegionServer 上。相反,如果一个表的数据量减少了,可以通过将相邻的两个 Region 合并成一个 Region 的方式来优化表的存储结构,这个过程称为合并(Merge)。

在 HBase 中,Region 是数据的物理存储单位,每个 Region 都存储一部分数据。Region 的大小可以通过配置来控制,通常在 10 GB 到 20 GB 之间。HBase 通过 Region 来实现数据的自动分区和负载均衡,每个 Region 对应一个 RegionServer,RegionServer 负责处理对该 Region 的读写请求。当一个 RegionServer 处理的请求数量过多时,HBase 会将一部分 Region 从该 RegionServer 移动到其他 RegionServer 上,以实现负载均衡。


4.4.3 Region的定位

在HBase中,一个表会被分成多个Region,每个Region会存储一部分表中的数据。这些Region可以被分发到不同的Region服务器上,这样可以实现数据的并行处理和负载均衡。为了让客户端能够知道数据存储在哪个Region服务器上,HBase提供了一种基于一致性哈希的Region定位机制。

在HBase中,每个Region都有一个唯一的RegionID,它用于标识该Region在表中的位置。RegionID由三部分组成,分别是表名、开始主键和Region编号。因此,一个Region标识符就可以表示“表名+开始主键+RegionID”。

其中,表名指的是该Region所属的表的名称;开始主键是指该Region所包含的第一行数据的主键值,用于定位该Region在表中的位置;Region编号是指该Region在表中的顺序编号,从0开始递增。因此,通过组合这三部分信息,可以唯一地确定一个Region在表中的位置。

例如,假设有一个名为“user”的表,它的开始主键为“100”,而第一个Region的编号为“0”,则该Region的唯一标识符为“user+100+0”。当客户端需要访问该Region时,只需要提供该标识符,就可以找到存储该Region的服务器,并获取该Region中的数据。

总之,HBase中的Region有唯一的RegionID,它由表名、开始主键和Region编号组成。通过这个唯一标识符,客户端可以定位存储该Region的服务器,并访问该Region中的数据。


在HBase中,为了定位每个Region所在的位置,可以构建一张映射表。这张映射表可以存储每个Region的标识符和对应的Region服务器的信息。通常,映射表会被存储在HBase的元数据表中,称为“.META.”表。

每个映射表的条目通常包含两项内容,一项是Region标识符,另一项是该Region所在的Region服务器的地址信息。其中,Region标识符用于唯一标识该Region,而地址信息用于指示存储该Region的Region服务器的位置。在.HBASE.META.表中,每个Region的位置也会被记录下来,从而帮助客户端定位所需的Region。

映射表的构建可以通过多种方式实现。一种简单的方式是使用HBase的Java API,通过扫描.HBASE.META.表来获取每个Region的标识符和对应的Region服务器的地址信息。另一种方式是使用HBase Shell命令,如“scan ‘.META.’”来查看.HBASE.META.表的内容。在生产环境中,通常会使用自动化工具来管理映射表,例如使用Apache Ambari等工具进行集群管理。


当一个HBase表中的Region数量非常庞大时,.META.表的条目会非常多,单个服务器无法容纳。为了解决这个问题,.META.表也会被分裂成多个Region,因此需要一个新的映射表来记录所有元数据的具体位置,这个新的映射表就是“根数据表”,也被称为“-ROOT-表”。

-ROOT-表是不能被分裂的,永远只存在一个Region用于存放-ROOT-表。因此,这个用于存放-ROOT-表的唯一一个Region的位置在程序中是被“写死”的,Master主服务器永远知道它的位置。当客户端需要查找某个Region时,它首先会查找-ROOT-表,获取所需Region的位置信息,然后再根据该信息连接到对应的Region服务器上获取数据。

-ROOT-表中的每个条目都包含两个信息:表名和Region服务器的地址信息。因为-ROOT-表只有一个Region,所以只需要查找这个Region就能够定位任何一个表的Region。但是,为了提高查找效率,通常还会在-ROOT-表的Region服务器上建立一个缓存,用于缓存最近访问过的表的位置信息。这样,在客户端需要查找某个表的Region时,可以先查找缓存,如果缓存中存在相应信息,则直接使用该信息连接到对应的Region服务器上获取数据,从而提高查找效率。

总之,-ROOT-表是用于存放所有HBase表的元数据信息的一个特殊表。-ROOT-表只包含一个Region,永远不能被分裂。它的位置是被“写死”的,Master主服务器永远知道它的位置。当客户端需要查找某个表的Region时,它首先会查找-ROOT-表,获取所需Region的位置信息,然后连接到对应的Region服务器上获取数据。


HBase的三层结构中各层次的名称和作用:

第一层:Zookeeper文件,记录以-ROOt-表的位置信息。

第二层:-ROOT-表,记录了.META.表的Region位置信息。-ROOT-表只能一个Region。通过-ROOT-表,就可以访问.META。表中的数据。

第三层:.META.表,记录了用户数据表的Region位置息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息。

为了加快访问速度,.META.表的全部Region都会被保存在内存中。

假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:

-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)

一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=2的17次方 行。

行,也就是说,一个-ROOT-表可以寻址2的17次方个.META.表的Region。

同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=2的17次方。

最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 2的34次方个Region。

客户端访问数据时的“三级寻址”:

为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题.

寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器.


客户端访问数据大致的流程:

  1. 访问ZooKeeper:ZooKeeper是一个分布式协调服务,它用于在HBase集群中维护一些元数据信息,例如-ROOT-表的位置信息。客户端需要先连接到ZooKeeper,获取-ROOT-表的位置信息。

  1. 访问-ROOT-表:客户端使用获取到的-ROOT-表位置信息,访问-ROOT-表,获取META表的信息。

  1. 访问META.表:客户端使用META表中的信息,例如表名和行键范围等,找到所需的Region具体位于哪个Region服务器。需要注意的是,META表也可能被分裂成多个Region,客户端可能需要在多个Region服务器上查询。

  1. 访问Region服务器:最后,客户端可以访问所需的Region服务器,读取或写入具体的数据。需要注意的是,HBase使用了数据缓存机制,所以实际上客户端可能会先从本地缓存中获取数据,如果缓存中没有数据才会从Region服务器中读取。

需要注意的是,HBase还支持多种优化和扩展方式,例如预分区、区域服务器组和Region缓存等,可以根据具体应用场景进行配置和调整。


4.5 HBase运行机制

4.5.1 HBase系统架构

HBase是一个分布式、可扩展、列式存储系统,它基于Apache Hadoop和Apache ZooKeeper构建。它的系统架构由以下几个主要组件构成:

  1. 客户端:客户端是使用HBase的应用程序。客户端可以使用Java API或REST API等方式与HBase进行交互,例如读取或写入数据。

  1. HMaster:HMaster是HBase的主节点。它负责管理整个集群的元数据信息,例如表的schema、Region的分布情况、Region的负载均衡等。HMaster还负责处理表的管理操作,例如创建表、删除表等。在HBase中,只有一个HMaster节点处于活跃状态,其他节点处于备份状态。

  1. RegionServer:RegionServer是HBase的工作节点。它负责管理一组Region,处理读写请求,维护数据的一致性和可用性等。每个RegionServer通常运行在一个独立的节点上,并负责管理多个Region。在HBase中,可以动态地增加或删除RegionServer节点来实现集群的扩展或缩容。

  1. ZooKeeper:ZooKeeper是HBase的分布式协调服务。它用于维护HBase集群的元数据信息,例如-ROOT-表和META表的位置信息,RegionServer节点的状态等。ZooKeeper还负责协调HBase集群中各个组件之间的通信和协作。

  1. HDFS:HDFS是Hadoop分布式文件系统,它用于存储HBase的数据。在HBase中,每个Region被存储为一个HFile,这些HFile被存储在HDFS中。HDFS提供了高可靠性和高可扩展性的存储服务,使得HBase能够存储非常大的数据集。

总体来说,HBase的系统架构是基于Master/Slave模式的分布式架构,它将数据存储在HDFS中,并使用ZooKeeper进行协调和管理。这种架构使得HBase能够提供高可靠性、高可扩展性和高性能的数据存储和访问服务。


4.5.2 Region服务器的工作原理

下图描述了Region服务器向HDFS中读写数据的基本原理。

Region服务器向HDFS中读写数据的基本原理可以概括如下:

  1. 每个Region服务器管理着一系列的Region对象和一个HLog文件。

  1. 每个Region对象由多个Store组成,每个Store对应表中的一个列族的存储。

  1. 每个Store包含一个MemStore和若干个StoreFile,其中MemStore是在内存中的缓存,保存最近更新的数据;StoreFile是磁盘中的文件,这些文件都是B树结构的,方便快速读取。

  1. 底层的StoreFile通过HDFS的HFile实现,HFile的数据块通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO。

  1. 当客户端向Region服务器发送读请求时,Region服务器会首先查询MemStore中是否存在所需数据,如果存在,则直接返回给客户端;如果不存在,则在StoreFile中查找数据,并返回给客户端。

  1. 当客户端向Region服务器发送写请求时,Region服务器会首先将数据写入MemStore,然后异步地将数据写入HLog文件。

  1. 当HLog文件中的数据达到一定大小或者时间间隔时,会触发HLog文件的刷盘操作,将HLog中的数据刷写到磁盘中的HFile文件中。

  1. 当HFile文件的大小达到一定阈值时,会触发HFile文件的切分操作,将HFile文件切分成多个小文件,方便快速读取。

  1. 当Region服务器中的某个StoreFile文件大小达到一定阈值时,会触发StoreFile的合并操作,将多个小文件合并成一个大文件,减少文件数量,方便管理。

总之,Region服务器通过内存缓存和磁盘存储的方式,高效地读写HBase中的数据,并通过异步写入HLog文件和周期性的刷盘操作,保证数据的可靠性和一致性。


  1. 用户读写数据的过程

当用户写人数据时,会被分配到相应的 Region 服务器去执行操作。用户数据首先被写入MemStore和HLog 中,当操作写人 HLog 之后,commit()调用才会将其返回给客户端。

当用户读取数据时,Region 服务器会首先访问 MemStore 缓存,如果数据不在缓存中,才会到磁盘上面的 StoreFile 中去寻找。


2.缓存的刷新

在HBase中,每个Region服务器都维护着自己的数据缓存,也就是MemStore。MemStore缓存中的数据会定期刷新到磁盘中的StoreFile中,以避免数据过多导致缓存空间不足的问题。以下是Region服务器中缓存的刷新流程:

  1. 当MemStore缓存中的数据量达到一定阈值时,HBase会触发刷新操作。刷新操作会将MemStore中的数据写入到磁盘中的StoreFile文件中,并清空MemStore缓存中的数据。

  1. 刷新操作会在磁盘上生成一个新的StoreFile文件,该文件包含了当前MemStore缓存中的所有数据。

  1. 在刷新操作完成后,HBase会在磁盘上的HLog文件中写入一个Flush Marker,用来标记当前数据已经被持久化到磁盘中了。

  1. 在刷新操作完成后,HBase会通知所有的Region服务器该Region的数据已经被更新,Region服务器会将其内存中的Region信息更新为最新的版本。

  1. 如果有其他Region服务器缓存了该Region的数据,那么它们也会收到通知,从而更新自己的缓存。

  1. 最后,刷新操作会返回一个确认信号,表示刷新操作已经完成。

以上就是Region服务器中缓存的刷新流程。通过定期刷新MemStore缓存中的数据,HBase能够保证数据的持久化,并避免数据过多导致缓存空间不足的问题。同时,HBase还支持多个Region服务器之间的数据复制,以提高数据的可靠性和可用性。


3.StoreFile的合并

在HBase中,StoreFile的合并过程是由Region Server后台线程进行的。下面是Region服务器中StoreFile合并的流程:

  1. 定时合并:Region Server会定时检查每个Store中StoreFile的数量和大小,如果超过了一定的阈值,就会触发StoreFile的合并操作。

  1. 合并操作:当Region Server检测到需要合并StoreFile时,会创建一个新的StoreFile,并将多个小的StoreFile中的数据合并到这个新的StoreFile中。合并过程是按照行键有序进行的,新的StoreFile中的数据也是按照行键有序排列的。

  1. 合并完成:当新的StoreFile生成后,Region Server会将旧的StoreFile删除,并将新的StoreFile添加到Store中。这样就完成了StoreFile的合并操作。

需要注意的是,StoreFile的合并过程是在Region Server的后台线程中进行的,因此在合并过程中并不会影响HBase对外提供的读写服务。同时,合并过程也是一个比较耗时的操作,因此HBase提供了一些参数来控制合并的大小和频率,以便根据实际情况进行调整。

总之,StoreFile的合并机制是HBase中非常重要的优化机制之一,它能够提高读取性能、减少磁盘空间的浪费,是HBase实现高性能和高可靠性的重要手段之一。


4.5.3 Store的工作原理

Store是HBase中存储数据的最小单位,它由多个StoreFile文件和MemStore缓存组成。下面是Store的结构、工作原理和工作流程的详细介绍:

  1. 结构

Store由多个StoreFile文件和一个MemStore缓存组成。StoreFile文件是按照行键排序的数据块,每个数据块包含多行数据。MemStore缓存用来暂存写入的数据,缓存达到一定大小后会被刷入磁盘中的StoreFile文件中。

  1. 工作原理

Store的读取和写入操作都是在StoreFile文件中进行的,读取操作会在StoreFile文件中查找对应的数据块并返回,写入操作则会将数据写入到MemStore缓存中,并在缓存达到一定阈值后,将缓存中的数据刷入磁盘中的StoreFile文件中。同时,Store会周期性地合并小的StoreFile文件,以减少文件数量和磁盘空间的使用。

  1. 工作流程

Store的工作流程可以分为以下几个步骤:

  • 写入操作:当客户端请求写入数据时,HBase会将数据写入到MemStore缓存中。

  • MemStore刷写:当MemStore缓存中的数据达到一定阈值时,HBase会将缓存中的数据刷入磁盘中的StoreFile文件中。

  • 数据读取:当客户端请求读取数据时,HBase会在StoreFile文件中查找对应的数据块,并返回给客户端。

  • 数据合并:当多个小的StoreFile文件中的数据量达到一定阈值时,HBase会将它们合并成一个大的StoreFile文件,并将旧的StoreFile文件删除。

  • 数据清理:当数据过期或者被删除时,HBase会将其标记为删除,并在后续的数据合并操作中清除这些数据。

总之,Store是HBase中存储数据的最小单位,它由多个StoreFile文件和MemStore缓存组成。Store的工作原理是通过StoreFile文件和MemStore缓存来进行数据的读写和管理,同时也包含了数据合并、清理和压缩等功能。这些功能共同作用,保证了HBase的高性能和高可靠性。

一个HBase表会被划分成多个Region,每个Region包含一个或多个Store,而每个Store都对应表的一个列族。因此,对于一个HBase表中的每个列族,都会被分配到多个Region中的多个Store中。每个Store会存储相同列族的所有数据,这样可以方便数据的管理和维护。而Store内部的数据是以StoreFile文件的形式存储的,每个StoreFile文件都是一个按行键排序的数据块,这样可以快速定位和读取数据。

4.5.4 HLog的工作原理

在分布式环境下,必须考虑到系统出错的情形,比如当 Region 服务器发生故障时,MemStore缓存中的数据(还没有被写人文件)会全部丢失。因此,HBase 采用 HLog 来保证系统发生故障时能够恢复到正确的状态。

HBase系统为每个Region服务器配置了一个HLog文件,作为预写式日志(WAL)记录所有写操作,包括数据的增删改操作和元数据的修改操作。用户更新数据时,会首先将写操作记录在HLog文件中,同时将数据写入内存中的MemStore缓存,等到HLog文件已经将操作写入磁盘中之后,对应的数据才会被刷新写入HFile文件。

ZooKeeper服务器在HBase集群中的作用之一是监控和管理Region服务器的状态。它会维护一个包含所有Region服务器的列表,并监测它们的可用性。当某个 Region 服务器发生故障时,ZooKeeper 服务器会及时检测到并通知 Master 主服务器。Master 主服务器会尝试将该 Region 所在的 Region Server 标记为宕机状态,然后会开始处理该故障 Region Server 上遗留的 HLog 文件。

在处理 HLog 文件时,由于一个Region 服务器上面可能会维护多个 Region 对象,这些 Region对象共用一个HLog文件,因此这个遗留的 HLog 文件中包含了来自多个 Region 对象的日志记录。系统会根据每条日志记录所属的 Region 对象对 HLog 数据进行拆分。Master 主服务器会首先将 HLog 文件拆分成多个包含同一 Region 数据的日志文件,然后将每个日志文件分配给负责该 Region 的 Region Server 上的对应的 HLog Writer 线程进行处理。HLog Writer 线程会将这些日志文件追加到自己维护的本地 HLog 文件中,并将已处理的日志文件标记为已完成。

一旦所有的 HLog 日志文件都被处理完毕,Master 主服务器就会将该 Region Server 标记为已恢复状态,然后该 Region Server 就可以重新加入集群,并且从 HDFS 中的数据文件恢复所有数据。

假设你正在打字并保存在你的电脑上。你打的内容相当于 HBase 中的数据,而你的电脑相当于 HBase 中的 Region 服务器。假设你的电脑崩溃了,所有未保存的数据都会丢失。为了防止这种情况发生,你可以打开一个文本编辑器并在其中记录你打的每个字,这就相当于 HBase 中的 HLog。每次你输入一个字,都需要先记录到文本编辑器中,然后再保存到你的电脑上。如果你的电脑崩溃了,你可以打开文本编辑器并查看其中记录的内容,然后恢复你在电脑上丢失的数据。
在这个例子中,文本编辑器就是 HLog,记录每个字相当于 HBase 中的数据的写入操作,保存到电脑上相当于将数据写入到 HBase 中的 Store 文件中。如果你的电脑崩溃了,你可以打开文本编辑器并查看其中记录的内容,然后恢复你在电脑上丢失的数据,这就相当于 HBase 中的数据恢复过程。

需要特别指出的是,HBase 系统中,每个Region Server都会维护多个Region,而这些Region共用一个HLog文件,因此一个Region Server只需要维护一个HLog文件就能够满足所有Region的日志记录需求。这种设计可以有效减少HLog文件的数量,降低系统管理的复杂度,提高系统的性能和可靠性。同时,通过这种方式,HBase系统还可以更加高效地利用磁盘资源,减少系统IO开销。

这种方式的主要缺点是,如果一个 Region 对象出现故障,整个 HLog 文件都可能变得无用,因为无法区分哪些日志记录属于正常运行的 Region 对象,哪些日志记录属于出现故障的 Region 对象。因此,当一个 Region 对象出现故障时,需要对整个 HLog 文件进行拆分,将属于正常运行的 Region 对象的日志记录提取出来,而丢弃出现故障的 Region 对象的日志记录,这个过程比较耗时,并且需要在 Master 主服务器上执行,可能会影响系统的性能和可用性。此外,由于多个 Region 对象共用同一个 HLog 文件,如果某个 Region 对象的写入负载非常高,会影响其他 Region 对象的写入性能,因为它们需要竞争同一个 HLog 文件的写入。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第四章 分布式数据库HBase 的相关文章

  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • CorelDRAW2024官方中文版重磅发布更新

    35年专注于矢量设计始于1988年并不断推陈出新 致力为全球设计工作者提供更高效的设计工具 CorelDRAW 滋养并见证了一代设计师的成长 在最短的时间内交付作品 CorelDRAW的智能高效会让你一见钟情 CorelDRAW 全称 Co
  • SpringCloud Config分布式配置中心

    文章目录 代码地址 简介 与GitHub整合配置 项目整合 测试 Config客户端配置与测试 测试 Config客户端之动态刷新 测试
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
  • HBase:复制是如何工作的?

    我目前正在将 HBase 作为数据存储进行评估 但有一个问题没有得到解答 HBase 在许多节点上存储同一对象的许多副本 也称为复制 由于HBase具有所谓的强一致性 相比之下最终一致 它保证每个副本在读取时返回相同的值 据我了解 HBas
  • 如何实现hbase安全批量加载

    我已经在 kerberos 集群中的 hbase 中创建了一个批量加载 其驱动程序类与此类似 工作 public static void main String args try int response ToolRunner run HB
  • 将 Spark 数据帧插入 hbase

    我有一个数据框 我想将其插入到 hbase 中 我遵循这个文档 https hbase apache org book html sparksql dataframes 这就是我的数据框的样子 id name address 23 marr
  • 如何在 Hive 中访问 HBase 表,反之亦然?

    作为一名开发人员 我通过使用以下命令从现有 MySQL 表导入数据 为我们的项目创建了 HBase 表 sqoop job 问题是我们的数据分析师团队熟悉MySQL语法 意味着他们可以查询HIVE轻松上桌 对于他们 我需要在 HIVE 中公
  • HBase 扫描时出现 java.lang.NoClassDefFoundError

    我正在尝试运行 MapReduce 作业来扫描 HBase 表 目前我使用的是Cloudera 4 4附带的HBase 0 94 6版本 在我的程序中的某个时刻 我使用 Scan 并使用以下命令正确导入它 import org apache
  • Hbase 架构嵌套实体

    有谁有关于如何创建带有嵌套实体的 Hbase 表的示例吗 Example UserName string SSN string Books collection 例如 书籍收藏看起来像这样 Books isbn title etc 我找不到
  • 在scala Spark2中运行saveAsNewAPIHadoopDataset到hbase时出现空指针异常

    我正在使用 saveAsNewAPIHadoopDataset 将 RDD 保存到 Hbase 中 以下是我的工作创建和提交 val outputTableName test3 val conf2 HBaseConfiguration cr
  • 使用 Spark 和 Phoenix 将 CSV 文件保存到 hbase 表

    有人可以向我指出使用 Spark 将 csv 文件保存到 Hbase 表的工作示例吗2 2我尝试过但失败的选项 注意 它们都适用于我的 Spark 1 6 凤凰火花 hbase spark it nerdammer bigdata spar
  • 如何将多个 QualifierFilter 应用于 HBase 中的一行

    我们想使用两个 QualifierFilters 过滤 HBase 表上的扫描 意味着我们只想获取表中确实具有特定列 col A 的行AND 某个其他列 col B 我们当前的方法如下所示 FilterList filterList new
  • 错误:org.apache.hadoop.hbase.MasterNotRunningException:null+hbase+hadoop

    我最近用两台机器 在ubuntu上 配置了hadoop集群 到目前为止效果很好 但是当我尝试在上面的 hadoop 集群上配置 hbase 时 它 显示错误 这就是我所做的 我有两台机器 192 168 1 110 Hadoop主站 192
  • 将多个前缀行过滤器设置为扫描仪 hbase java

    我想创建一台扫描仪 它可以为我提供带有 2 个前缀过滤器的结果例如 我想要其键以字符串 x 开头或以字符串 y 开头的所有行 目前我知道只能使用一个前缀 方法如下 scan setRowPrefixFilter prefixFiltet 在
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • 如何使用hbase协处理器实现groupby?

    最近学习了hbase协处理器 我使用endpoint来累加hbase表的一列 例如 名为 pendings 的hbase表 它的家族是 asset 我累加了 asset amount 的所有值 该表还有其他列 例如 asset custom
  • 在 HBase 中存储和检索字符串数组

    我读过这个答案 如何将复杂对象存储到hadoop Hbase中 https stackoverflow com questions 4086684 how to store complex objects into hadoop hbase
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何通过HBase REST服务获取Phoenix表数据

    我使用 Phoenix JDBC 驱动程序在以下代码片段中创建了一个 HBase 表 Class forName org apache phoenix jdbc PhoenixDriver Connection conn DriverMan

随机推荐

  • 领取你的数字员工,人工智能加速定制#11xAI

    数字员工 采用人工智能技术模拟人类行为 协助员工完成大量重复 规则明确且耗费时间的工作 实现业务流程自动化 数字员工的出现 使得企业可以快速处理大量数据和业务流程 提高工作效率和质量 同时也降低了人力成本和错误率 11xAI 11xAI 是
  • 淘宝服务端高并发分布式架构演进之路

    本文以淘宝作为例子 介绍从一百个到千万级并发情况下服务端的架构的演进过程 同时列举出每个演进阶段会遇到的相关技术 让大家对架构的演进有一个整体的认知 文章最后汇总了一些架构设计的原则 特别说明 本文以淘宝为例仅仅是为了便于说明演进过程可能遇
  • 数据库视图详解

    数据库视图详解 定义 视图 View 是从一个或多个表 或视图 导出的表 视图与表 有时为与视图区别 也称表为基本表 Base Table 不同 视图是一个虚表 即视图所对应的数据不进行实际存储 数据库中只存储视图的定义 在对视图的数据进行
  • 强化学习(零)—— 强化学习算法汇总(基于概率 & 基于价值 & 在线学习 & 离线学习 Policy Gradients 策略梯度)

    强化学习 强化学习是机器学习的一个分支 目的是开发出智能体 Agent 做出决策和控制 强化学习让计算机实现从一开始什么都不懂 一点想法都没有 通过不断地尝试 从错误中学习 更新自己的行为准则 最后找到规律 学习到达到目标的方法 监督学习有
  • JVM内存溢出原理及案例分析

    前言 再程序中 什么是内存溢出呢 什么情况下会出现内存溢出呢 内存溢出原理 一般来说 程序中出现内存溢出是非常严重的 一但出现内存溢出 会导致程序无法正常运行 一般再程序中 内存溢出分为两种 一种是 堆内存溢出 一种是永久代溢出 堆内存溢出
  • 浏览器升级怎么升_手机经常弹出"系统升级", 那到底升不升级?内行人告诉你怎么做...

    手机的发展历史并不长 从功能机到智能机 发生了很大的变化 过去手机可能只是一种通讯工具 但现在手机已经成为人们生活中不可或缺的一部分 很多东西如网上购物 外卖等通常都需要使用手机 毕竟 现在是移动支付时代 而且市面上有很多手机品牌的海外苹果
  • java List<Object[]>转Class<T> clz对象

    package com xny base util import java lang reflect Constructor import java util ArrayList import java util List author w
  • J2EE/JAVA——在Servlet容器指定url的方法(注解与Web.xml文件)

    目录 1 在注解中指定URL方法 2 在web xml文件中指定 3 两种方法的不同点 4 常见问题 1 项目文件中找不到web xml文件 2 无法使用注解进行路径指定 1 在注解中指定URL方法 首先 这里给出一个Servlet的简单实
  • 求助matlab算法修改,该算法运行有问题要如何修改呢

    clc clear close 电力系统经济调度 Matlab 程序 使用 MATPOWER 工具箱 作者 123Bot 引用 MATPOWER 工具箱 addpath 路径 matpower7 1 更改 路径 为正确的 MATPOWER
  • 高通charge

    smbchg parse peripherals里面设置了 base地址chip gt usb chgpth base resource gt start 属性 sys class power supply battery 目录下的属性定义
  • 随身wifi折腾日记 (刷armbian搭建服务器,内网穿透部署网站)

    随身wifi折腾日记 跳转博客 观感更佳 商业转载请联系作者获得授权 非商业转载请注明出处 For commercial use please contact the author for authorization For non com
  • jenkins部署springboot项目(超详细讲解)

    原来写了一篇博客是如何安装jenkins的 今天也来介绍一下怎么简单使用吧 首先 我们要明确 jenkins自动化部署也只是代替你去做你要做的事 我们梳理一下 你的代码写完 打包 扔到服务器上 部署 所以jenkins代替我们要做什么 1
  • Safari浏览器实用小技巧

    Safari在 macOS Monterey 中获得了一些更明显的更新 它们可能会让您更多地使用书签 现已经有一些小技巧可以让 Safari 书签成为一个关键的 有组织的研究工具 而不是被遗忘在角落 如何在 Safari 中固定网站 导航到
  • 配置IIS Express局域网访问 VS2017调试.Net Core

    局域网配置参考https blog csdn net yeluo vinager article details 84305111 注意 当出现这个问题 注意将VS关闭 重新以管理员身份打开就可以了
  • AI日报|AI“翻白眼”,是满足还是隐藏的反抗?

    今日值得关注的人工智能新动态 AI 翻白眼 是满足还是隐藏的反抗 通过AI揭示牙齿隐藏疾病 CodeVQA 通过代码生成进行视觉问答 NASA 提前30分钟准确预测太阳风暴 思想实验 利用反事实来改进道德推理 基于大型AI模型的语义通信 可
  • 踩坑:Vue.js中v-for和v-if不能同时使用

    踩坑 Vue js中v for和v if不能同时使用 问题出现之时 v if代码地方出现报错下面有红色的波浪线 具体报错信息大概是说v for和v if不能混用 取而代之要使用computed计算属性 让数组变量替换为返回的已过滤数组的计算
  • C++实现改进的冒泡排序

    冒泡排序法 Bubble Sort 即起泡排序并不能改观普通排序的时间复杂度 还是O n 2 冒泡排序法是从后往前两两比较 然后遍历整个数组 犹如鱼吐水泡 故起此名 而普通排序法是遍历整个数组 然后每个元素和后面的所有元素进行比较 升序则是
  • 给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。

    题目描述 给定区间 2 31 2 31 内的3个整数A B和C 请判断A B是否大于C 输入 输入第1行给出正整数T lt 10 是测试用例的个数 随后给出T组测试用例 每组占一行 顺序给出A B和C 整数间以空格分隔 输出 对每组测试用例
  • matlab中evrnd函数_Matlab内生成随机数的函数

    1 rand 生成 0 1 区间上均匀分布的随机数 基本语法 rand M N P 生成排列成M N P 多维向量的随机数 如果只写M 则生成M M矩阵 如果参数为 M N 可以省略方括号 2 randn 生成服从标准正太分布 均值为0 方
  • 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第四章 分布式数据库HBase

    第四章 分布式数据库HBase HBase是一个开源的分布式数据库 它是基于Google的Bigtable论文实现的 HBase旨在提供一个高可靠性 高性能 面向列存储的分布式数据库 适用于大规模数据存储和处理 HBase的数据模型和访问接