带时间戳的HBase Put不起作用
我编写了一个简单的测试程序来插入一行。与普通HBase Put示例程序的唯一不同之处在于,Put实例及其KeyValue实例是使用时间戳创建的 预期的行为是插入一行。但是,在我的HBase环境中,没有插入任何行 下面是我的测试程序带时间戳的HBase Put不起作用,hbase,Hbase,我编写了一个简单的测试程序来插入一行。与普通HBase Put示例程序的唯一不同之处在于,Put实例及其KeyValue实例是使用时间戳创建的 预期的行为是插入一行。但是,在我的HBase环境中,没有插入任何行 下面是我的测试程序 import java.io.*; import java.util.*; import org.apache.hadoop.conf.*; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbas
import java.io.*;
import java.util.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.*;
public class Test
{
// Names of table, family, qualifier and row ID.
private static final byte[] TABLE = Bytes.toBytes("test-table");
private static final byte[] FAMILY = Bytes.toBytes("test-family");
private static final byte[] QUALIFIER = Bytes.toBytes("test-qualifier");
private static final byte[] ROWID = Bytes.toBytes("test-rowid");
/**
* The entry point of this program.
*
* <p>
* This program assumes that there already exists an HBase
* table named "test-table" with a column family named
* "test-family". To create an HBase table satisfying these
* conditions, type the following at the hbase shell prompt.
* </p>
*
* <pre>
* hbase> create 'test-table', 'test-family'
* </pre>
*
* <p>
* This program inserts a row whose row ID is "test-rowid"
* with a column named "test-family:test-qualifier". The
* value of the column is the string expression of
* <code>new Date()</code>.
* </p>
*/
public static void main(String[] args) throws Exception
{
// Get the table.
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, TABLE);
// Prepare data to put.
byte[] value = Bytes.toBytes(new Date().toString());
Put put = new Put(ROWID);
put.add(FAMILY, QUALIFIER, value);
// Clone Put with a timestamp.
put = clone(put, 10);
// Put the data.
table.put(put);
// Read back the data.
Get get = new Get(ROWID);
Result result = table.get(get);
// Dump the read data.
System.out.println("DATA = " + result.toString());
}
/**
* Clone the given Put instance with the given timestamp.
*/
private static Put clone(Put a, long timestamp) throws IOException
{
// Create a Put instance with the specified timestamp.
Put b = new Put(a.getRow(), timestamp);
Map<byte[], List<KeyValue>> kvs = a.getFamilyMap();
// Copy KeyValue's from the source Put (a) to
// the cloned Put (b). Note the given timestamp
// is used for each new KeyValue instance.
for (List<KeyValue> kvl : kvs.values())
{
for (KeyValue kv : kvl)
{
b.add(new KeyValue(
kv.getRow(),
kv.getFamily(),
kv.getQualifier(),
timestamp,
kv.getValue()));
}
}
return b;
}
}
该程序生成的控制台输出如下所示
hbase(main):011:0> scan 'test-table'
ROW COLUMN+CELL
0 row(s) in 0.0080 seconds
hbase外壳上的“扫描”显示“0行”
注释掉代码行以克隆Put实例,如下所示
DATA = keyvalues={test-rowid/test-family:test-qualifier/1344594210281/Put/vlen=28}
也就是说,使用不带时间戳参数创建的Put实例会更改程序的行为。在这种情况下,控制台输出显示插入的值
hbase(main):012:0> scan 'test-table'
ROW COLUMN+CELL
test-rowid column=test-family:test-qualifier, timestamp=1344594210281, value=Fri Aug 10 19:23:30 JST 2012
1 row(s) in 0.0110 seconds
“扫描”显示插入的行
在我的测试程序中使用时间戳克隆Put实例的逻辑是一个开源项目的摘录,已知该项目可以工作。因此,我想这个问题的根本原因存在于我的HBase环境中,但我没有任何线索。我的调查可能不够充分,但我还没有在HBase日志中看到任何错误
有谁能告诉我这个问题吗?时间戳列族和列名构成一个组合键。这里的时间戳是UNIX时间戳 KeyValueTestUtil.create可以创建KeyValue对象,并将其设置为Put我不确定这是否会有帮助,但是-我以前去过,所以,只是想帮助您调试逻辑 我要确保的第一件事是,您以前从未删除过该行。H-Base Delete的工作方式是在(Row/KeyValue)中有问题的位置放置一个带有当前时间戳的墓碑标记(除非您指定了另一个)。Soooo-如果你在删除后打了一个Put,并且没有进行重大压缩,你将永远看不到你的Put。。。这里有一个线程:-在执行另一个测试循环之前,您可以尝试从该表上的H-Base shell执行“major_compact” …这是我的第一个猜测…它与一个测试场景相关联:在当前时间放置,执行扫描,断言放置操作工作(是的,确实如此!),然后,删除当前数据以重置托盘,使用较小的时间戳执行下一次放置-执行扫描-刮头 分离思想-Get操作始终返回最新版本的KeyValue。所以如果在测试中执行时间戳为T1的Put,然后执行时间戳为T2且T2
希望其中的某些内容对您的旅程有所帮助….您是否尝试创建带有时间戳的新put,而不是克隆现有put?还可以在Put类的add方法中指定时间戳。只是想看看问题是否依然存在,如果是的话,这可能意味着问题在您怀疑的环境中。
DATA = keyvalues={test-rowid/test-family:test-qualifier/1344594210281/Put/vlen=28}
hbase(main):012:0> scan 'test-table'
ROW COLUMN+CELL
test-rowid column=test-family:test-qualifier, timestamp=1344594210281, value=Fri Aug 10 19:23:30 JST 2012
1 row(s) in 0.0110 seconds