我是RocksDB abd的新手,他试图在Java中创建SST文件以进行批量加载。最终的用例是在Apache Spark中创建它。
我在Ubuntu 18.04.03中使用rocksdbjni
6.3.6
我一直收到此错误,
org.rocksdb.RocksDBException: Keys must be added in order
at org.rocksdb.SstFileWriter.put(Native Method)
at org.rocksdb.SstFileWriter.put(SstFileWriter.java:104)
at CreateSSTFile.main(CreateSSTFile.java:34)
示例代码为
public static void main(String[] args) throws RocksDBException {
RocksDB.loadLibrary();
final Random random = new Random();
final EnvOptions envOptions = new EnvOptions();
final StringAppendOperator stringAppendOperator = new StringAppendOperator();
Options options1 = new Options();
SstFileWriter fw = null;
ComparatorOptions comparatorOptions = new ComparatorOptions();
try {
options1 = options1
.setCreateIfMissing(true)
.setEnv(Env.getDefault())
.setComparator(new BytewiseComparator(comparatorOptions));
fw = new SstFileWriter(envOptions, options1);
fw.open("/tmp/db/sst_upload_01");
for (int index = 0; index < 1000; index++) {
Slice keySlice = new Slice(("Key" + "_" + index).getBytes());
Slice valueSlice = new Slice(("Value_" + index + "_" + random.nextLong()).getBytes());
fw.put(keySlice, valueSlice);
}
fw.finish();
} catch (RocksDBException ex) {
ex.printStackTrace();
} finally {
stringAppendOperator.close();
envOptions.close();
options1.close();
if (fw != null) {
fw.close();
}
}
}
如果循环索引小于10,则文件创建成功,并且我能够将其提取到rock db中。
谢谢。
答案 0 :(得分:0)
我认为我发现了代码问题。
必须按顺序使用SST键。我执行循环并使用String字典比较进行排序的方式会产生错误的排序。像比较“ 10”和“ 9”将破坏顺序。取而代之的是,如果我在插入SST文件之前对所有键进行排序,那么它将起作用。
(inc n)
当我尝试使用整数键时,我发现了问题。
答案 1 :(得分:0)
实际上,您可以创建Comparator扩展DirectComparator以避免排序。
class MyComparator extends DirectComparator {
public MyComparator(ComparatorOptions copt) {
super(copt);
}
@Override
public String name() {
return "MyComparator";
}
@Override
public int compare(DirectSlice a, DirectSlice b) {
// always true
return 1;
}
}
}
然后设置选项
options1.setComparator(new MyComparator(comparatorOptions));