Атомарность файлов с библиотекой luigi python - PullRequest
0 голосов
/ 07 августа 2020

Нужно ли мне беспокоиться об атомарности файлов в luigi с помощью следующего кода, выбирая фрейм данных и возвращая его как результат выполнения задачи? Я не понимаю, что такое атомарность, так как я надеюсь, что Луиджи просто дождется завершения записи файла, прежде чем заявить, что задача завершена.

class readSQLtoPickle(luigi.Task):

    sql = luigi.Parameter()
    pickle = luigi.Parameter()

    def output(self):
        return luigi.LocalTarget(self.pickle,format=format.Nop)


    def run(self):
        data = pd.read_sql(self.sql, ariel)
        with self.output().open('w') as f:
            pickle.dump(data, f)





class grabData(luigi.Task): # standard Luigi Task class

    sql = luigi.Parameter(default="SELECT * FROM DIM_DRUG_PRODUCT")
    pickle = luigi.Parameter(default="drug_product.pkl")

    def requires(self):
    # we need to read the log file before we can process it
        return readSQLtoPickle(sql=self.sql, pickle=self.pickle)

    def run(self):
        with self.input().open('r') as f:
            df = pickle.load(f)
            print(type(df))
            print(df.head(100))
            print(len(df))

1 Ответ

0 голосов
/ 20 августа 2020

Запись в LocalTarget - это atomi c. За кулисами Луги сначала записывает во временный файл, а затем перемещает временный файл к вашей реальной цели. Найдите atomic_file в исходном коде

Я не понимаю части атомарности, так как я надеюсь, что Луиджи просто дождется завершения задачи записи файла, прежде чем указывать задача завершена.

Если вы используете локальный планировщик для выполнения вашей задачи (--local-scheduler) и у вас только один рабочий, тогда все будет в порядке.

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

В вашем примере один рабочий мог бы попытаться проверить, готов ли grabData к запуску, и посмотреть что файл доступен, пока другой работник находится в процессе записи readSQLtoPickle в файл.

...