Я пытаюсь прочитать строки из таблицы Apache Phoenix, которая содержит имена файлов и столбец, каждый раз, когда я начинаю и заканчиваю обработку файла. Я наблюдаю несогласованное поведение при выполнении операций UPSERT, которые устанавливают метки времени начала и окончания. Иногда UPSERT работает, как и ожидалось, иногда он не фиксируется, но не выдает ошибок, которые я вижу.
Я пытался решить проблему, заключая большинство вызовов в блоки try / catch для устранения неполадок, но это не помогло.
Я пытался использовать Phoenix UPSERT и UPSERT SELECT, полагая, что, возможно, существует несоответствие между полем имени файла и тем, что в итоге отправляется в базу данных из-за некоторых странных символов в именах файлов, но это также не дает разница.
Я пытался установить и отключить автокоммит несколькими способами. отдельно я устанавливаю для autocommit значение true / false в строке подключения JDBC, явно при создании объекта подключения JDBC, и, наконец, как часть объекта Phoenix Config. Когда в каждом из этих случаев для параметра autocommit задано значение true, я явно не фиксирую UPSERT, при отключении автоматической фиксации я явно вызываю commit.
Единственное поведение, которое я наблюдал, может помочь мне, это то, что если я жду значительное время, то кажется, что UPSERT работает, но во время тестирования я вручную сбрасываю старт / финиш в столбец NULL и попробуйте еще раз, чтобы убедиться, что решение работает, но оно работает только один раз, все последующие попытки кажутся неудачными.
С учетом всего сказанного я могу последовательно воспроизвести проблему, выполнив следующие действия:
- UPSERT, изменяющий поле STARTED с нуля на текущую метку времени (now ())
- UPSERT, который изменяет поле STARTED обратно на NULL
- Повторное выполнение первого 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)