Используемые ресурсы
Аналитика журнала записывает данные в учетную запись хранения BLOB-объектов в контейнере с использованием правила экспорта. Databricks имеет один и тот же контейнер, смонтированный и работающий конвейер, который считывает данные каждый час и выполняет преобразования. Конвейер Databricks иногда работает правильно, а иногда выдает следующую ошибку. Я понимаю, что при чтении и записи данных в хранилище BLOB-объектов возникает состояние гонки. Правило экспорта данных Log Analytics не имеет фиксированного порога времени для отправки данных в хранилище. Есть идеи, как справиться с этим состоянием гонки?
Caused by: java.io.IOException: Operation failed: "The condition specified using HTTP conditional header(s) is not met.", 412, GET, https://xxx.dfs.core.windows.net/xx-xxx/WorkspaceResourceId%3D/subscriptions/xxx.json?timeout=90, ConditionNotMet, "The condition specified using HTTP conditional header(s) is not met. RequestId:xxx-xxxx-xxxx-xxxx-xxx Time:xxx-04-03T20:11:21.xxxx"
at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.services.AbfsInputStream.readRemote(AbfsInputStream.java:673)
at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.services.AbfsInputStream.readInternal(AbfsInputStream.java:619)
at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.services.AbfsInputStream.readOneBlock(AbfsInputStream.java:409)
at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.services.AbfsInputStream.read(AbfsInputStream.java:346)
at java.io.DataInputStream.read(DataInputStream.java:149)
at com.databricks.common.filesystem.LokiAbfsInputStream.$anonfun$read$3(LokiABFS.scala:204)
at scala.runtime.java8.JFunction0$mcI$sp.apply(JFunction0$mcI$sp.java:23)
at com.databricks.common.filesystem.LokiAbfsInputStream.withExceptionRewrites(LokiABFS.scala:194)
"The condition specified using HTTP conditional header(s) is not met.", 412, GET, https://xxx.dfs.core.windows.net/xx-xxx/WorkspaceResourceId%3D/subscriptions/xxx.json?timeout=90, ConditionNotMet, "The condition specified using HTTP conditional header(s) is not met."
Согласно этому,
Когда операция
write
выполняется над большим двоичным объектом,ETag
этого большого двоичного объекта сбрасывается, скажем,0x8CDA1BF0593B660
. И прежде чем он будет запущен (со значением ETag0x8CDA1BF0593B660
), большой двоичный объект обновляется другой службой, и егоETag
меняется на0x8CDA1BF0593B661
.
Это может быть причиной появления указанной выше ошибки при чтении файла JSON из учетной записи хранения в Databricks. Поведение параллелизма можно настроить в соответствии с документацией библиотеки Hadoop-Azure. Это библиотека, используемая для доступа к ADLS (abfss).
Для получения дополнительной информации вы можете перейти по ссылкам ниже:
Не могли бы вы предоставить пример кода, который вы использовали для чтения JSON из хранилища BLOB-объектов?