0

我目前正在为 3 节点集群上的分析项目评估 Kinetica DB,以在其上构建自定义仪表板。

据我了解,有一种方法可以直接从数据节点中检索记录,称为“多头查找”。

使用 Java API 时,它似乎只从第一个节点连接和请求数据(也检查了 Wireshark)。知道有什么问题吗?

该表在 vendor_id 和 rate_code_id 上进行了分片,当在 Admin-UI 中按下“dist”按钮时,它表明一切都正确分布。

这是我的 DDL:

CREATE TABLE "demo"."nyctaxi_sharded"
(
   "vendor_id" VARCHAR (4, shard_key) NOT NULL,
   "pickup_datetime" TIMESTAMP NOT NULL,
   "dropoff_datetime" TIMESTAMP NOT NULL,
   "passenger_count" TINYINT NOT NULL,
   "trip_distance" REAL NOT NULL,
   "pickup_longitude" REAL NOT NULL,
   "pickup_latitude" REAL NOT NULL,
   "rate_code_id" SMALLINT (shard_key) NOT NULL,
   "store_and_fwd_flag" VARCHAR (1) NOT NULL,
   "dropoff_longitude" REAL NOT NULL,
   "dropoff_latitude" REAL NOT NULL,
   "payment_type" VARCHAR (16) NOT NULL,
   "fare_amount" REAL NOT NULL,
   "surcharge" REAL NOT NULL,
   "mta_tax" REAL NOT NULL,
   "tip_amount" REAL NOT NULL,
   "tolls_amount" REAL NOT NULL,
   "total_amount" REAL NOT NULL,
   "cab_type" TINYINT NOT NULL
)
TIER STRATEGY (
( ( VRAM 1, RAM 5, PERSIST 5 ) )
);

这是截断的Java代码:

GPUdb gpudb = new GPUdb("http://myserver:9191", new GPUdbBase.Options().setUsername("user").setPassword("pw"));
        Type tableType = Type.fromTable(gpudb, "demo.nyctaxi_sharded");
        RecordRetriever<GenericRecord> recordRetriever = new RecordRetriever<>(gpudb, "demo.nyctaxi_sharded", tableType);
        List<List<Object>> lookupValues = Arrays.asList(
                        Arrays.asList("VENDOR1", 0),
                        Arrays.asList("VENDOR2", 0),
                        Arrays.asList("VENDOR3", 0),
                        Arrays.asList("VENDOR1", 1),
                        Arrays.asList("VENDOR2", 1),
                        Arrays.asList("VENDOR3", 1),
                        Arrays.asList("VENDOR1", 2),
                        Arrays.asList("VENDOR2", 2),
                        Arrays.asList("VENDOR3", 2));
        
        lookupValues.forEach(lookup -> {
           try {
               GetRecordsResponse<GenericRecord> record = recordRetriever.getByKey(lookup, "");
               System.out.println(record);
           } catch (GPUdbException e) {
               e.printStackTrace();
           }
        });

一旦这工作,我想在预先计算的物化视图上使用这个查找。这可能吗?

4

1 回答 1

0

确认 gpudb.conf 文件(在服务器上,通常在 /opt/gpudb/core/etc 中)具有:

enable_worker_http_servers = true

默认情况下这可以是“false”,如果“false”,那么 Java 的 RecordRetriever 将只使用一个节点,这就是你所描述的你所看到的。

于 2021-03-02T18:21:19.230 回答