最近在做Azkaban方面的工作鲜漩,需要了解下Azkaban上傳文件的存儲機制炊苫。下面我們簡要分析下Azkaban中的zip文件上傳的過程:
zip文件上傳的時候首先緩存到temp文件夾下,然后上傳到MySQL中子眶,并更新相關(guān)信息之碗。當上成功上傳到MySQL后將刪除本地緩存文件。
其中上傳的相關(guān)表代碼及過程如下:
上傳包括以下操作:
logger.info("Uploading file to db " + archive.getName());
logger.info("Uploading flow to db " + archive.getName());
logger.info("Changing project versions " + archive.getName());
logger.info("Uploading Job properties");
logger.info("Uploading Props properties");
由此可以看出失晴,Azkaban上傳zip的時候主要涉及到以下幾個表:
1. project_files
Uploading file to db指的是將zip文件上傳到project_files表中冤议,具體操作代碼以及流程如下:
sql語句如下:
"INSERT INTO project_files (project_id, version, chunk, size, file) values (?,?,?,?,?)";
上傳過程按照CHUCK_SIZE(默認10M)將zip進行切片,然后上傳师坎,本文以一個59M的文件做實驗,結(jié)果如下堪滨,可以看出分成(5*10+9):
在project_files中胯陋,其存儲zip文件的字段為file類型為longblob。
2.project_flows
在project_flows中袱箱,插入一條上傳的信息:
sql語句:
"INSERT INTO project_flows (project_id, version, flow_id, modified_time, encoding_type, json) values (?,?,?,?,?,?)";
查看更新的flow信息:
3.project_versions
當上傳新的文件遏乔,MySQL會在project_versions中記錄本次上傳的版本信息。同時发笔,更新其在projects的版本信息盟萨。該版本信息記錄的是當前執(zhí)行的project版本,因為用戶會上傳多個版本了讨,需要一個地方記錄project的最新版本號捻激,使得用戶能夠執(zhí)行最新的上傳版本。不過前计,用戶每次執(zhí)行flow的時候胞谭,只有在第一次才會從MySQL中獲得版本信息,后面都是直接從內(nèi)存的對象中獲得版本男杈。
Sql語句:
"UPDATE projects SET version=?,modified_time=?,last_modified_by=? WHERE id=?";
當用戶上傳一個新的版本時丈屹,version自動加1: