- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
在HBase 中,一个{row,column,version}元组精确指定了一个 cell。可能有无限数量的单元格,其中行和列是相同的,但单元格地址仅在其版本维度上有所不同。
虽然行和列键以字节表示,但版本是使用长整数指定的。通常,这个long包含时间实例,如由java.util.Date.getTime() 或者 System.currentTimeMillis() 返回的时间实例,即:1970年1月1日UTC的当前时间和午夜之间的差值(以毫秒为单位)。
HBase 版本维度按递减顺序存储,因此从存储文件读取时,会先查找最新的值。
在HBase 中,cell 版本的语义有很多混淆。尤其是:
下面我们描述 HBase 当前的版本维度是如何工作的。HBase 中的弯曲时间使得 HBase 中的版本或时间维度得到很好的阅读。它在版本控制方面的细节比这里提供的更多。
在撰写本文时,文章中提到的限制覆盖现有时间戳的值不再适用于HBase。本节基本上是 Bruno Dumon 撰写的文章的简介。
为给定列存储的最大版本数是列架构的一部分,并在创建表时通过 alter 命令 HColumnDescriptor.DEFAULT_VERSIONS 指定 。在 HBase 0.96 之前,保留的版本的默认数量是3,但在 0.96 以及新版本中已更改为1。
示例– 修改一个列族的最大版本数量
本示例使用HBase Shell来保留列族中所有列的最多5个版本f1。你也可以使用HColumnDescriptor。
hbase> alter ‘t1′, NAME => ‘f1′, VERSIONS => 5
示例– 修改列族的最小版本数
您还可以指定每列家族存储的最低版本数。默认情况下,它被设置为0,这意味着该功能被禁用。下面的示例通过 HBase Shell 将在列族 f1 中的所有列的最小版本数设置为2。你也可以使用 HColumnDescriptor。
hbase> alter't1',NAME =>'f1',MIN_VERSIONS => 2
从HBase 0.98.2 开始,您可以通过在 hbase-site.xml 中设置 hbase.column.max.version 为所有新创建列保留的最大版本数指定一个全局默认值。
在下面的内容中,我们将了解每个核心 HBase 操作的版本维度的行为。
获取在Scans 之上实现。以下关于 Get 的讨论同样适用于 Scans。
默认情况下,即如果你没有指定明确的版本,则在执行“get”操作时,会返回其版本值最大的单元格(可能是也可能不是最新版本,请参阅后面的内容)。默认行为可以通过以下方式进行修改:
以下获取将只检索行的当前版本:
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Get get = new Get(Bytes.toBytes("row1"));
Result r = table.get(get);
byte[] b = r.getValue(CF, ATTR); // returns current version of value
以下Get 将返回该行的最后3个版本。
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Get get = new Get(Bytes.toBytes("row1"));
get.setMaxVersions(3); // will return last 3 versions of row
Result r = table.get(get);
byte[] b = r.getValue(CF, ATTR); // returns current version of value
List<KeyValue> kv = r.getColumn(CF, ATTR); // returns all versions of this column
在某个时间戳处进行Put(写)操作总是会创建一个新版本的 cell。默认情况下,系统使用服务器的 currentTimeMillis,但您可以在每列级别上自己指定版本(等于长整数)。这意味着您可以分配过去或未来的时间,或将长时间值用于非时间目的。
要覆盖现有值,请执行与要覆盖的单元格中的行、列和版本完全相同的 put。
隐式版本示例:
HBase 会在当前时间隐式地对以下 Put 进行版本管理。
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Put put = new Put(Bytes.toBytes(row));
put.add(CF, ATTR, Bytes.toBytes( data));
table.put(put);
显示版本示例:
以下Put 具有明确设置的版本时间戳。
public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Put put = new Put( Bytes.toBytes(row));
long explicitTimeInMs = 555; // just an example
put.add(CF, ATTR, explicitTimeInMs, Bytes.toBytes(data));
table.put(put);
注意:版本时间戳由 HBase 内部使用,用于诸如生存时间计算之类的事情。通常最好避免自己设置时间戳。优先使用该行的单独时间戳属性,或者将时间戳记作为行键的一部分,或者同时使用两者。
有三种不同类型的内部删除标记。并添加另一个扫描 HBase:Prefix Delete Marker。
当删除整行时,HBase 将在内部为每个 ColumnFamily(即不是每个单独的列)创建一个逻辑删除。
通过创建 tombstone标记来删除作品。例如,假设我们想要删除一行。为此,您可以指定一个版本,或者默认情况下使用该 currentTimeMillis。这意味着删除版本小于或等于此版本的所有单元格。HBase 从不修改数据,例如删除不会立即删除(或标记为已删除)存储文件中对应于删除条件的条目。相反,所谓的 tombstone被写入,这将掩盖已删除的值。当 HBase 进行重大压缩时,tombstone将被处理以实际移除不能用的值以及 tombstone本身。如果您在删除行时指定的版本大于行中任何值的版本,则可以考虑删除整行。
除非在列族中设置了 KEEP_DELETED_CELLS 选项,否则删除标记在存储区的下一个主要压缩过程中被清除。如果要将删除保留为可配置的时间量,可以通过hbase-site.xml 中的 hbase.hstore.time.to.purge.deletes 属性设置删除 TTL 。如果 hbase.hstore.time.to.purge.deletes 未设置或设置为 0,则将在下一次主要压缩过程中清除所有删除标记,包括将来使用时间戳的标记。否则,将保留在将来具有时间戳的删除标记,直到在由标记时间戳表示的时间加上hbase.hstore.time.to.purge.deletes 的值(以毫秒为单位)之后发生的主要压缩为止。
在hbase-2.0.0 中,操作员可以通过将列描述符属性 NEW_VERSION_BEHAVIOR 设置为 true 来指定备用版本和删除处理(若要在列族描述符上设置属性,您必须首先禁用表,然后改变列族描述符)。
“新版本行为”解除了以下列出的局限性,取消了以下所列的限制,即如果在同一位置,Delete 总是会超过一个Put(即相同的行,列族,限定符和时间戳),而不管哪一个先到达。版本记帐也会因为删除版本考虑到版本总数而发生变化。这是为了确保在重大压缩情况下不会改变结果。
运行这个新配置目前的成本;我们将每个比较的 Cell MVCC 因素考虑在内,因此我们消耗更多的 CPU,这是减速所取决于的,在测试中,我们已经看到0%到25%的降级。
如果正在复制,建议您使用新的串行复制功能运行,因为现在突变到达的顺序是因子。
以下限制在 hbase-2.0.0 中解决。请参阅上面的“HBase-2.0.0 中的可选新版本和删除行为”部分。
删除掩码放入,甚至在输入删除后发生。请记住,删除操作会写入逻辑删除,只有在下一次主要压缩运行后才会消失。假设你删除了所有的⇐ T 的内容,然后你做了一个带有时间戳 ⇐ T 的新放。这种情况下,即使在删除后发生,也会被删除 tombstone 屏蔽。执行投入不会失败,但是当你做出投注时,你会注意到投注没有任何效果。重大压缩后,它将再次开始工作。如果您使用不断增加的版本进行新的放置,则这些问题不应该是一个问题。但即使您不在乎时间,也可能发生这种情况:只需删除并立即放置在对方之后,并且有可能在同一毫秒内发生。
在t1,t2 和 t3 中创建三个单元格版本,最大版本设置为 2。因此,获取所有版本时,只会返回 t2 和 t3 的值。但是如果在 t2 或 t3 删除版本,则 t1 中的版本将再次出现。显然,一旦主要的压实运行后,这种行为将不会是这样了。
无法使用 Hive 版本 1.1.0 HBase 版本 0.94.8 和 hadoop 版本 2.7.0 从 hive 创建 Hbase 表 hive (default)> CREATE TABLE
我试图为 electron app 创建可执行文件但面临这个问题 Unable to determine Electron version. Please specify an Electron ve
我正在尝试让自适应阈值在 python 绑定(bind)到 opencv 中工作(swig 一个 - 无法让 opencv 2.0 工作,因为我正在使用 beagleboard 因为交叉编译还没有工作
我一直在 linux 机器上使用 JMeter,在命令行下使用了一段时间。工作正常。 今天,我在 Windows 机器(新客户端等)上尝试了它,它确实可以工作,但在控制台窗口中输出有很大不同。 Lin
在我的编码环境中,我通常使用最新版本的 Java 和 Eclipse。当我编写源代码时,我不会注意我使用的 API 方法或类是否向后兼容旧版本的 Java 或 Eclipse。在 javadoc 中存
问题是关于版本的特定组合,但更普遍。 我刚刚从 Kubuntu 12.04 升级到 14.04。现在,当我想编译 CUDA 代码(使用 CUDA 6.5)时,我得到: #error -- unsupp
我目前正在对我的一些应用程序进行沙箱处理,看来我必须删除一些功能才能满足 Mac App Store 沙箱(和其他)规则。 显然用户不会因为失去功能而感到高兴,我担心他们不会指责苹果制定了愚蠢的规则,
我用 flash 和 js 版本创建了一个动画横幅。 是否可以检测低于版本 9 的 ie 版本,然后提供 Flash 横幅,否则提供 js 横幅。 最佳答案 您可以使用条件注释来检测 IE 版本
我有一个处理不同位置的数据库的应用程序,我想检查这些数据库是否使用 Firebird 2.5 或更高版本打开。我们最近从 Firebird 2.0 迁移到了 2.5,我们有很多数据库可以响应 sele
我正在开发一个应用程序,我使用托管在我的服务器上的 Java 和 Jersey 构建了后端部分。我在服务器上使用 Tomcat7 来调用 Web 服务。 我以前有一台安装了 Ubuntu 的计算机,我
我可以使用 GetVersionEx() 函数来获取 Windows 版本,但是这个函数将返回一个数字而不是一个字符串。但是没有问题,因为我可以将数字转换为字符串,例如: if (osvi.dwMaj
我已经在我的系统中安装了 Anaconda 2 & 3。 Anaconda 2 包含 python 2.7 & Anaconda 3 包含 python 3.6。 我需要使用命令提示符运行我的 pyt
我正在尝试构建一个 Android 项目,但发生了以下错误 Error:(10, 1) A problem occurred evaluating project ':app'. > Failed t
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
在降级我的 GCC 之前,我想知道是否有办法确定我的机器中的哪些程序/框架或依赖项会中断,以及是否有更好的方法来执行 openpose 安装? (例如,在 CMake 中更改某些内容) 有没有办法在不
我已经在终端的代码sudo apt-get install Shadowsocks-qt5中安装了Shadowsocks-Qt5,然后我可以通过搜索找到启动图标,但是它当我点击图标时打不开。然后我尝试
在网络上找到的文档说,MLLP V2(第 2 版)是用于传输 HL7 版本 3 内容的所有消息传输协议(protocol)的要求。似乎 MLLP 第 2 版主要用于 HL7 第 3 版。 我们可以/应
我正在使用带有 selinium webdriver 的 Protractor 。我的chromeDriver版本是78.0.1,chrome版本是78.0.3904.97。两个版本都匹配,应该不会有
我正在按照教程设置 mysql 数据库并做一些事情。我无法找到数据库资源管理器。我读了很多,但在 Window->show View-> Dataxxx 或右侧上部选项卡中无法正常工作。 最佳答案 从
我已经在 KDE 桌面上安装了 Anaconda 2.0.1。当我运行 python 并看到所有已安装的模块时,我收到此消息“无法将不兼容的 Qt 库(版本 0x40801)与该库(版本 0x4080
我是一名优秀的程序员,十分优秀!