【问题标题】:HBase setting timestampHBase 设置时间戳
【发布时间】:2012-05-31 19:56:47
【问题描述】:

我在使用 java api 设置行时间戳时遇到问题。

当我尝试向 put 构造函数(或 put.add())添加时间戳值时,什么也没有发生,在从表中读取行后,我得到系统提供的时间戳。

public static boolean addRecord(String tableName, String rowKey,
    String family, String qualifier, Object value)
{
    try {
        HTable table = new HTable(conf, tableName);
        Put put = new Put(Bytes.toBytes(rowKey), 12345678l);
        put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value.toString()));
        table.put(put);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

HBase 0.92.1 在独立模式下运行。

提前感谢您的帮助!

【问题讨论】:

  • 您能提供更多信息吗?您使用的是什么版本的 HBase?该行是否有并发写入?可能是版本 12345678L 已成功存储,但您有系统提供的时间戳比 12345678L 更新。尝试获取该行的所有版本并检查 12345678L 是否存在。
  • HBase 0.92.1。该行只有一个版本(我在获取和检查中设置了最大版本号)。
  • 您能否将“hbase> describe 't1'”(HBase Shell)的输出粘贴到您的表 t1(无论它有什么名称)?这将为我们提供有关您尝试写入的列族的信息。可能存在诸如家庭生存时间之类的问题。也尝试写入一个空行,你肯定会得到你想要的时间戳,因为应该没有其他版本。
  • {NAME => 'TestTableName', FAMILIES => [{NAME => 'Family1', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '3', 压缩=> 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'Family2', BLOOMFILTER => 'NONE', REPLIC ATION_SCOPE => '0', VERSIONS => '3', COMPRESSION =>'NONE', MIN_VERSIONS => '0', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => '假',BLOCKCACHE => '真'}]}

标签: java api hadoop hbase


【解决方案1】:

很可能,您的表中已经有具有时间戳 > 12345678l 的行。要确认不是这种情况,请尝试使用非常大的时间戳值,例如 Long.MAX_VALUE

如果确实如此,您可以简单地删除旧版本。然后这个条目就会出现。

【讨论】:

  • 在官方hbase书籍hbase.apache.org/book/versions.html中说“做一个put总是在某个时间戳创建一个新版本的单元格。默认情况下系统使用服务器的currentTimeMillis,但你可以指定在每列级别上自己版本(= 长整数)。这意味着您可以分配过去或未来的时间,或将长值用于非时间目的。"
  • 是的,但是如果您使用 get(),将显示具有最大时间戳的版本,除非您使用 setMaxVersions() 来获取“较旧”(即具有较低时间戳)的版本。因此,如果已经存在时间戳 > 12345678 的相同单元格,则会显示该单元格。
  • 我已经尝试将最大版本数设置为 10 - 这一行只有一个版本。
  • 你得到的版本的时间戳是多少?
  • 你是如何“获得”这一行的?是通过 Java API 还是通过 HBase Shell?在 HBase Shell 中,您应该指定多个版本,例如“hbase> get 't1', 'r1', {VERSIONS => 100}”。在 Java API 中,HTable.get(Get) 中的 Result 对象有两个方法:getColumnLatest 和 getColumn。后者是版本列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多