Upload velkého množství dat do Azure Storage Table

Na posledním Architekt fóru jsem dostal zajímavý dotaz. „Máme tabulku s 50 milióny řádků a potřebujeme je co nejrychleji dostat do Azure Storage. Podle našich předběžných testů to bude trvat asi 200 dní. Lze tuto operaci zrychlit?“

Hned na místě jsem si nebyl úplně jistý odpovědí, kromě jednoduché rady – používejte dávkový zápis do tabulky. Konkrétní zkušenost jsem však neměl.

Výsledky z labu

Společně s Michael Juřkem jsme si řekli, že pro tento příklad napíšeme demo s využitím několika variant uploadu dat. Data jsme definovali jako tabulku, jejíž jeden řádek obsahuje 1 kB dat. Případná tabulka s 50M řádky bude mít celkovou velikost 50GB.

Michael nejdříve provedl testy na domácím ADSL a firemní síti. Zde se však ukázalo, že ani jedno připojení neoplývá stabilní a vysokou upload rychlosti. Ve finále jsme testovací kód spouštěli na pronajatém virtuálním serveru v datovém centru s 10Mb uplinkem i downlinkem.

První varianta, zcela triviálně ukládající řádky jeden po druhém, dosáhla podle očekávání nejhorší výsledek – průměrně 9.5 řádků za 1s.

Ve druhé variantě jsme kód aplikace paralelizovali, ale ponechali triviální upload po jednom řádku. Cílem bylo využití více jader na použitém serveru. Tato úprava se projevila v dvojnásobné rychlosti - průměrně 18.2 řádků za 1s.

Třetí varianta již inteligentně nahrává data po dávkách 100 řádků. Skupinová transakce totiž může obsahovat maximálně 100 položek, jak je uvedeno v MSDN dokumentaci. Rychlost se tímto krokem dostala na 100.7 řádků za 1s.

Pokud třetí verzi ještě paralelizujeme, získáme asi tu nejvyšší rychlost činící v průměru 279 řádků za 1s. Proti první variantě tedy přibližně 30 násobné zrychlení. Veškeré zdrojové kódy jsou ke stažení zde.

Trocha matematiky

V nejrychlejší variantě bylo přenášeno řádově 300kB/s, neboli data byla posílána do cloudu rychlostí 3Mb/s. To není úplně špatný výsledek. V případě 50GB tabulky bychom museli tedy čekat asi 46 hodin, tedy nějaké 2 dny. 50GB je jinými slovy 10 jednostranných DVD disků. Přenést je za dva dny po internetu je docela slušné.

Místa pro další zrychlení

Když jsme dnes ráno rozebírali tyto výsledky, říkali jsme si, jak to ještě zrychlit. Napadl nás následující postup, také ilustrovaný níže na scanu z mého bloku. Data na lokálním počítači serializovat a následně ještě komprimovat (.NET Framework obsahuje ZIP algoritmus). Takto vytvořená data přes stream nahrát do Azure blobu (1). Do Azure fronty umístit zprávu s odkazem na položku ve blob storage (2). Worker role čekající na frontě zprávu vyzvedne (3) a data z blobu dekomprimuje a deserializuje do Azure tabulky (4). Jde o koncept, který jsme zatím nerealizovali. Pokud se do něj pustíte, napište nám a my vaše výsledky rádi pro ostatní zveřejníme. Uvedenou myšlenku, shodou okolností, mi během dopoledne poslal i pan Štefan Baboš, kterému tímto velice děkuji. Bohužel jej postihnul stejný osud jako Járu Cimrmana ve filmu Ležící spící J.

clip_image001

Dalibor a Michael