соединитель redis presto поврежден ключом, когда redis.key-prefix-schema-table = true для формата данных json

#sql #json #redis #presto

#sql #json #redis #presto

Вопрос:

Я пытаюсь настроить рабочий пример presto и redis на моем локальном компьютере в соответствии с (ограниченной) документацией presto-redis.

Краткое описание проблемы:

При использовании redis.key-prefix-schema-table=true ключа redis с префиксом dev:simple_table: (как указано на странице presto redis connector) все ключевые столбцы равны нулю, а внутренний столбец _key_corrupt равен true. Все столбцы значений проанализированы правильно.

При использовании redis.key-prefix-schema-table=false и чистых строк ключей и значений JSON оба работают должным образом. (примечание: я также пытался и не смог использовать формат данных csv)

Что работает:

У меня есть пример работы с сервером redis и сервером presto, запущенным на моем локальном компьютере.

etc/catalog/redis.properties файл presto:

 connector.name=redis
redis.table-names=simple_table
redis.default-schema=dev
redis.nodes=127.0.0.1:6379
redis.table-description-dir=/Users/acarson/var/redis/tables
redis.key-delimiter=:
redis.key-prefix-schema-table=false
redis.hide-internal-columns=false
  

У меня есть файл определения таблицы в /Users/acarson/var/redis/tables/simple_table.json

 {
    "tableName": "simple_table",
    "schemaName": "dev",
    "key": {
        "dataFormat": "json",
        "fields": [
            {
                "name": "id",
                "mapping": "id",
                "type": "BIGINT"
            },
            {
                "name": "word",
                "mapping": "word",
                "type": "VARCHAR"
            }
        ]
    },
    "value": {
        "dataFormat": "json",
        "fields": [
            {
                "name": "name",
                "mapping": "name",
                "type": "VARCHAR"
            },
            {
                "name": "number",
                "mapping": "number",
                "type": "BIGINT"
            },
            {
                "name": "boolean",
                "mapping": "boolean",
                "type": "BOOLEAN"
            }
        ]
    }
}
  

используя redis-cli, я вставляю значение с помощью этой команды:

  SET '{"id": 42, "word": "foo"}' '{"name": "bar", "number": 3, "boolean": "false"}'
  

И затем я могу запросить данные с помощью presto cli, и результирующие столбцы отображаются, как ожидалось:

 presto:dev> SELECT * FROM simple_table;
 id | word | name | number | boolean |           _key            |                      _value                      | _key_length | _value_length | _key_corrupt | _value_corrupt 
---- ------ ------ -------- --------- --------------------------- -------------------------------------------------- ------------- --------------- -------------- ----------------
 42 | foo  | bar  |      3 | false   | {"id": 42, "word": "foo"} | {"name": "bar", "number": 3, "boolean": "false"} |          25 |            48 | false        | false          
  

Что не удается:

Я меняю значение redis.properties redis.key-prefix-schema-table на true, перезапускаю presto, удаляю все ключи в redis-cli с помощью FLUSHALL , а затем вставляю новую строку, используя префикс таблицы схемы:

 SET 'dev:simple_table:{"id": 42, "word": "foo"}' '{"name": "bar", "number": 3, "boolean": "false"}'
  

Запрос из командной строки presto показывает _key_corrupt=true , что значения ключа равны нулю, хотя значения все еще работают.

 presto:dev> SELECT * FROM simple_table;
  id  | word |  name  | number | boolean |                     _key                      |                       _value                        | _key_length | _value_length | _key_corrupt | _value_corrupt 
------ ------ -------- -------- --------- ----------------------------------------------- ----------------------------------------------------- ------------- --------------- -------------- ----------------
 NULL | NULL | bar    |      3 | false   | dev:simple_table:{"id": 42, "word": "foo"}    | {"name": "bar", "number": 3, "boolean": "false"}    |          42 |            48 | true         | false          
  

Я увеличил уровни регистрации redis и presto для подсказок, но ничего, что показывает мне какие-либо ошибки или причину, по которой ключ поврежден. У меня такое чувство, что мой синтаксис для ключей redis может быть неправильным, но я следую точному методу, описанному как в документации presto redis, так и даже при чтении через исходный код presto-redis, который указывает, что ключи используют "schema:table:*" формат с этим флагом.

Вот журналы presto на уровне отладки при выполнении запроса:

 2016-10-20T17:09:55.048-0700    INFO    main    com.facebook.presto.server.PrestoServer ======== SERVER STARTED ========
2016-10-20T17:10:24.785-0700    DEBUG   query-execution-0   com.facebook.presto.execution.QueryStateMachine Query 20161021_001024_00000_qx72p is PLANNING
2016-10-20T17:10:24.802-0700    DEBUG   Query-20161021_001024_00000_qx72p-104   com.facebook.presto.redis.RedisTableDescriptionSupplier Considering files: [/Users/acarson/var/redis/tables/simple_table.json]
2016-10-20T17:10:24.849-0700    DEBUG   Query-20161021_001024_00000_qx72p-104   com.facebook.presto.redis.RedisTableDescriptionSupplier Redis table dev.simple_table: RedisTableDescription{tableName=simple_table, schemaName=dev, key=RedisTableFieldGroup{dataFormat=json, name=null, fields=[RedisTableFieldDescription{name=id, type=bigint, mapping=id, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=word, type=varchar, mapping=word, dataFormat=null, formatHint=null, hidden=false}]}, value=RedisTableFieldGroup{dataFormat=json, name=null, fields=[RedisTableFieldDescription{name=name, type=varchar, mapping=name, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=number, type=bigint, mapping=number, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=boolean, type=boolean, mapping=boolean, dataFormat=null, formatHint=null, hidden=false}]}}
2016-10-20T17:10:24.850-0700    DEBUG   Query-20161021_001024_00000_qx72p-104   com.facebook.presto.redis.RedisTableDescriptionSupplier Loaded table definitions: [dev.simple_table]
2016-10-20T17:10:24.850-0700    DEBUG   Query-20161021_001024_00000_qx72p-104   com.facebook.presto.redis.RedisTableDescriptionSupplier Found Table definition for dev.simple_table: RedisTableDescription{tableName=simple_table, schemaName=dev, key=RedisTableFieldGroup{dataFormat=json, name=null, fields=[RedisTableFieldDescription{name=id, type=bigint, mapping=id, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=word, type=varchar, mapping=word, dataFormat=null, formatHint=null, hidden=false}]}, value=RedisTableFieldGroup{dataFormat=json, name=null, fields=[RedisTableFieldDescription{name=name, type=varchar, mapping=name, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=number, type=bigint, mapping=number, dataFormat=null, formatHint=null, hidden=false}, RedisTableFieldDescription{name=boolean, type=boolean, mapping=boolean, dataFormat=null, formatHint=null, hidden=false}]}}
2016-10-20T17:10:25.020-0700    DEBUG   query-execution-0   com.facebook.presto.execution.QueryStateMachine Query 20161021_001024_00000_qx72p is STARTING
2016-10-20T17:10:25.027-0700    DEBUG   query-execution-1   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.1 is SCHEDULING
2016-10-20T17:10:25.064-0700    DEBUG   query-execution-1   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.1 is SCHEDULED
2016-10-20T17:10:25.065-0700    DEBUG   query-execution-2   com.facebook.presto.execution.QueryStateMachine Query 20161021_001024_00000_qx72p is RUNNING
2016-10-20T17:10:25.119-0700    DEBUG   query-execution-2   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.1 is RUNNING
2016-10-20T17:10:25.165-0700    DEBUG   query-execution-2   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.0 is SCHEDULING
2016-10-20T17:10:25.174-0700    DEBUG   query-execution-2   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.0 is SCHEDULED
2016-10-20T17:10:25.179-0700    DEBUG   query-execution-2   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.0 is RUNNING
2016-10-20T17:10:25.278-0700    INFO    20161021_001024_00000_qx72p.1.0-0-58    com.facebook.presto.redis.RedisJedisManager Creating new JedisPool for 127.0.0.1:6379
2016-10-20T17:10:25.313-0700    DEBUG   20161021_001024_00000_qx72p.1.0-0-58    com.facebook.presto.redis.RedisRecordCursor Scanning new Redis keys from cursor 0 . 0 values read so far
2016-10-20T17:10:25.326-0700    DEBUG   20161021_001024_00000_qx72p.1.0-0-58    com.facebook.presto.redis.RedisRecordCursor Read a total of 1 values with 48 bytes.
2016-10-20T17:10:25.330-0700    DEBUG   20161021_001024_00000_qx72p.1.0-0-58    com.facebook.presto.execution.TaskExecutor  Split 20161021_001024_00000_qx72p.1.0-0 RedisSplit{connectorId=redis, schemaName=dev, tableName=simple_table, keyDataFormat=json, valueDataFormat=json, keyName=null, start=0, end=-1, nodes=[127.0.0.1:6379]} (start = 1477008625258, wall = 72 ms, cpu = 56 ms, calls = 1) is finished
2016-10-20T17:10:25.350-0700    DEBUG   http-worker-77  com.facebook.presto.execution.SqlTask   Aborting task 20161021_001024_00000_qx72p.1.0 output 0
2016-10-20T17:10:25.352-0700    DEBUG   task-notification-1 com.facebook.presto.execution.TaskStateMachine  Task 20161021_001024_00000_qx72p.1.0 is FINISHED
2016-10-20T17:10:25.357-0700    DEBUG   query-execution-0   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.1 is FINISHED
2016-10-20T17:10:25.367-0700    DEBUG   20161021_001024_00000_qx72p.0.0-0-59    com.facebook.presto.execution.TaskExecutor  Split 20161021_001024_00000_qx72p.0.0-0  (start = 1477008625257, wall = 110 ms, cpu = 9 ms, calls = 4) is finished
2016-10-20T17:10:25.369-0700    DEBUG   http-worker-88  com.facebook.presto.execution.SqlTask   Aborting task 20161021_001024_00000_qx72p.0.0 output 0
2016-10-20T17:10:25.372-0700    DEBUG   task-notification-0 com.facebook.presto.execution.TaskStateMachine  Task 20161021_001024_00000_qx72p.0.0 is FINISHED
2016-10-20T17:10:25.379-0700    DEBUG   query-execution-0   com.facebook.presto.execution.StageStateMachine Stage 20161021_001024_00000_qx72p.0 is FINISHED
2016-10-20T17:10:25.380-0700    DEBUG   query-execution-2   com.facebook.presto.execution.QueryStateMachine Query 20161021_001024_00000_qx72p is FINISHING
2016-10-20T17:10:25.383-0700    DEBUG   query-execution-2   com.facebook.presto.execution.QueryStateMachine Query 20161021_001024_00000_qx72p is FINISHED
2016-10-20T17:10:25.420-0700    INFO    query-execution-2   com.facebook.presto.event.query.QueryMonitor    TIMELINE: Query 20161021_001024_00000_qx72p :: Transaction:[c54dc7fe-8159-434d-b4cc-cb13ad41a5d7] :: elapsed 610ms :: planning 247ms :: scheduling 248ms :: running 0ms :: finishing 363ms :: begin 2016-10-20T17:10:24.773-07:00 :: end 2016-10-20T17:10:25.383-07:00
  

Ответ №1:

Возможно, из этой строки нужно исключить : Вы пробовали ее удалить, поскольку: в любом случае используется по умолчанию.

 redis.key-delimiter=:
  

Также у вашего префикса есть хвост: который следует исключить:

 SET 'dev:simple_table{"id": 42, "word": "foo"}' '{"name": "bar", "number": 3, "boolean": "false"}'
  

вместо

 SET 'dev:simple_table:{"id": 42, "word": "foo"}' '{"name": "bar", "number": 3, "boolean": "false"}'
  

Комментарии:

1. Мне нужно будет проверить, не экранируется ли символ двоеточия в файле свойств. Из документации по коду следует, что ваше второе утверждение неверно. github.com/prestodb/presto/blob/master/presto-redis/src/main /… функция setScanParms() анализирует текст с обоими двоеточиями. (Кажется, существует несоответствие между этой функциональностью и официальной документацией presto.)