在Java中创建RocksDB SST文件以进行批量加载

时间:2019-11-09 23:13:07

标签: rocksdb rocksdb-java

我是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中。

谢谢。

2 个答案:

答案 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));