что значит файл Snapshot. scala в кирпичах данных? - PullRequest
0 голосов
/ 28 февраля 2020

Я выполняю несколько заданий потокового запроса в кластере блоков данных, и когда я просматриваю журналы кластера / заданий, я сначала вижу множество

в снимке. scala: 1

и

withNewExecutionId в TransactionalWriteEdge. scala: 130

Быстрый поиск дал этот scala скрипт https://github.com/delta-io/delta/blob/master/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala Кто-нибудь может объяснить, что это делает в терминах непрофессионалов?

1 Ответ

0 голосов
/ 28 февраля 2020

Внутренне этот класс управляет воспроизведением действий, сохраненных в контрольной точке или дельта-файл

Как правило, этот «снимок» использует дельта-кодирование и косвенно допускает изоляцию снимка .

Практически дельта-кодирование запоминает каждую побочную операцию, такую ​​как INSERT DELETE UPDATE, которую вы выполняли со времени последней контрольной точки. В случае дельты озера это будет SingleAction ( source ): AddFile (вставить) RemoveFile (удалить). Концептуально этот подход близок к источнику событий - без него вам пришлось бы буквально хранить / транслировать все состояние (базу данных или каталог) при каждом обновлении. Он также используется во многих классовых c ACID базах данных с репликацией.

В целом это дает вам:

  • возможность непрерывно реплицировать состояние файловой системы / каталога / базы данных (см. * 1021) * SnapshotManagement.update ). По сути, именно поэтому вы видите много first at Snapshot.scala:1 - оно вызывается для того, чтобы отслеживать журнал каждый раз, когда вы начинаете транзакцию, см. DeltaLog.startTransaction . Я не смог найти TransactionalWriteEdge источников, но, полагаю, он вызывается примерно в одно и то же время.
  • способность восстанавливать состояние путем воспроизведения каждого действия с момента последнего снимка.
  • способность изолировать (и хранить) транзакции, храня их снимки отдельно до фиксации (каждый SingleAction имеет txn для изоляции). Для этого Delta-lake использует optimisti c lock : фиксация транзакции завершится неудачей, если их журналы не будут объединяемыми, а читатели не увидят незавершенные действия.

PS Вы можете увидеть, что доступ к журналу осуществляется в строке val deltaData = load(files), а действия располагаются поверх previousSnapshot (val checkpointData = previousSnapshot.getOrElse(emptyActions); val allActions = checkpointData.union(deltaData))

...