Заявление коммит работает с Apache Phoenix JDBC - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь прочитать строки из таблицы Apache Phoenix, которая содержит имена файлов и столбец, каждый раз, когда я начинаю и заканчиваю обработку файла. Я наблюдаю несогласованное поведение при выполнении операций UPSERT, которые устанавливают метки времени начала и окончания. Иногда UPSERT работает, как и ожидалось, иногда он не фиксируется, но не выдает ошибок, которые я вижу.

Я пытался решить проблему, заключая большинство вызовов в блоки try / catch для устранения неполадок, но это не помогло.

Я пытался использовать Phoenix UPSERT и UPSERT SELECT, полагая, что, возможно, существует несоответствие между полем имени файла и тем, что в итоге отправляется в базу данных из-за некоторых странных символов в именах файлов, но это также не дает разница.

Я пытался установить и отключить автокоммит несколькими способами. отдельно я устанавливаю для autocommit значение true / false в строке подключения JDBC, явно при создании объекта подключения JDBC, и, наконец, как часть объекта Phoenix Config. Когда в каждом из этих случаев для параметра autocommit задано значение true, я явно не фиксирую UPSERT, при отключении автоматической фиксации я явно вызываю commit.

Единственное поведение, которое я наблюдал, может помочь мне, это то, что если я жду значительное время, то кажется, что UPSERT работает, но во время тестирования я вручную сбрасываю старт / финиш в столбец NULL и попробуйте еще раз, чтобы убедиться, что решение работает, но оно работает только один раз, все последующие попытки кажутся неудачными.

С учетом всего сказанного я могу последовательно воспроизвести проблему, выполнив следующие действия:

  1. UPSERT, изменяющий поле STARTED с нуля на текущую метку времени (now ())
  2. UPSERT, который изменяет поле STARTED обратно на NULL
  3. Повторное выполнение первого UPSERT

Первый UPSERT работает (устанавливает метку времени на now (), второй UPSERT работает (устанавливает поле метки времени обратно в NULL, а третий UPSERT (устанавливает метку времени обратно на текущую метку времени (которая обязательно отличается от первой метки времени)) нет ошибок вообще, но не отражается в таблице базы данных.

Вот DDL для таблицы, которую я использую:

CREATE TABLE DEFAULT.FILE_INDEX(
    MTIME TIMESTAMP NOT NULL,
    FILENAME VARCHAR NOT NULL,
    TYPE VARCHAR NOT NULL,
    SUBTYPE VARCHAR NOT NULL,
    SENSOR VARCHAR NOT NULL,
    SIZE BIGINT NOT NULL,
    OWNER VARCHAR NOT NULL,
    GROUP_OWNER VARCHAR NOT NULL,
    PERMISSIONS VARCHAR NOT NULL,
    STARTED TIMESTAMP,
    PROCESSED TIMESTAMP,
    EVENT_COUNT BIGINT
    CONSTRAINT PK PRIMARY KEY(MTIME ROW_TIMESTAMP,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS)) COMPRESSION='SNAPPY',DEFAULT_COLUMN_FAMILY='F';

И так как я могу воспроизвести проблему в терминале SQL (phoenix-sqlline), просто чтобы устранить потенциальные красные селедки, вот фрагмент из phoenix-sqlline, который показывает проблему. Пожалуйста, обратите внимание, что UPSERT, который, кажется, не имеет никакого эффекта, все еще показывает, что была затронута 1 строка, тем самым сообщая мне, что UPSERT успешно выполнен:

0: jdbc:phoenix:master-1.> UPSERT INTO DEFAULT.FILE_INDEX(MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,STARTED) SELECT MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,now() AS STARTED FROM DEFAULT.FILE_INDEX WHERE FILENAME='hdfs://filename.log';
1 row affected (5.041 seconds)
0: jdbc:phoenix:master-1.> select * from default.file_index where started is not null;
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------+-------+----------+-----------------+---------+------------+--------------+------+
|          MTIME           |                                                          FILENAME                                                           | TYPE  | SUBTYPE  |     SENSOR      |  SIZE   |   OWNER    | GROUP_OWNER  | PERM |
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------+-------+----------+-----------------+---------+------------+--------------+------+
| 2018-11-01 00:00:00.000  | hdfs://filename.log  | BRO   | DNS      | something  | 224500  | somebody  | hdfs         | rw-r |
+--------------------------+-----------------------------------------------------------------------------------------------------------------------------+-------+----------+-----------------+---------+------------+--------------+------+
1 row selected (4.046 seconds)
0: jdbc:phoenix:master-1.> UPSERT INTO DEFAULT.FILE_INDEX(MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,STARTED) SELECT MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,NULL AS STARTED FROM DEFAULT.FILE_INDEX WHERE FILENAME='hdfs://filename.log';
1 row affected (4.541 seconds)
0: jdbc:phoenix:master-1.> select * from default.file_index where started is not null;
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
| MTIME  | FILENAME  | TYPE  | SUBTYPE  | SENSOR  | SIZE  | OWNER  | GROUP_OWNER  | PERMISSIONS  | STARTED  | PROCESSED  | EVENT_COUNT  |
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
No rows selected (4.782 seconds)
0: jdbc:phoenix:master-1.> UPSERT INTO DEFAULT.FILE_INDEX(MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,STARTED) SELECT MTIME,FILENAME,TYPE,SUBTYPE,SENSOR,SIZE,OWNER,GROUP_OWNER,PERMISSIONS,now() AS STARTED FROM DEFAULT.FILE_INDEX WHERE FILENAME='hdfs://filename.log';
1 row affected (5.254 seconds)
0: jdbc:phoenix:master-1.> select * from default.file_index where started is not null;
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
| MTIME  | FILENAME  | TYPE  | SUBTYPE  | SENSOR  | SIZE  | OWNER  | GROUP_OWNER  | PERMISSIONS  | STARTED  | PROCESSED  | EVENT_COUNT  |
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
+--------+-----------+-------+----------+---------+-------+--------+--------------+--------------+----------+------------+--------------+
No rows selected (4.389 seconds)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...