Baarista 25TB iyadoo la adeegsanayo AWK iyo R

Baarista 25TB iyadoo la adeegsanayo AWK iyo R
Sida loo akhriyo maqaalkan: Waxaan ka cudur daaranayaa qoraalka oo aad u dheer oo fowdo ah. Si aan wakhti kuu lumin, waxa aan cutub kasta ku bilaabayaa horudhac β€œWaxa aan bartay”, kaas oo nuxurka cutubka ku soo koobaya hal ama laba weedho.

"I tus xalka!" Haddii aad rabto inaad aragto meesha aan ka imid, ka dibna u gudub cutubka "Noqoshada Hal-abuur badan," laakiin waxaan u maleynayaa inay aad u xiiso badan tahay oo faa'iido u leedahay in la akhriyo guuldarada.

Dhawaan waxa la ii xilsaaray in aan dejiyo hab lagu farsameeyo tiro badan oo taxane DNA ceeriin ah (farsamo ahaan SNP chip). Baahidu waxay ahayd in si degdeg ah loo helo xogta ku saabsan goobta hidde-sidaha la bixiyay (oo loo yaqaan SNP) qaabaynta xiga iyo hawlaha kale. Isticmaalka R iyo AWK, waxaan awooday inaan nadiifiyo oo habeeyo xogta si dabiici ah, si aad ah u dedejiya habsocodka weydiinta. Tani iimay fududayn oo waxay u baahnayd ku celcelin badan. Maqaalkani wuxuu kaa caawinayaa inaad iska ilaaliso qaar ka mid ah khaladaadkayga oo ku tusi doona wixii aan ku dambeeyay.

Marka hore, qaar ka mid ah sharraxaadaha hordhaca ah.

data

Xaruntayada xogta hidaha ee jaamacaddayadu waxay na siisay xogta qaabka 25 TB TSV. Waxaan helay iyaga oo u qaybsan 5 baakidh, oo ay isku dhufatay Gzip, kuwaas oo mid walba ka kooban yahay 240 fayl afar-gigabyte ah. Saf kastaa waxa uu ka koobnaa xogta hal SNP ee hal qof. Wadar ahaan, xogta ~2,5 milyan SNPs iyo ~ 60 kun oo qof ayaa la gudbiyay. Marka lagu daro macluumaadka SNP, faylalku waxa ay ka koobnaan tiirar badan oo leh tirooyin ka tarjumaya sifooyin kala duwan, sida xoojinta akhriska, inta jeer ee alleles kala duwan, iwm. Wadar ahaan waxaa jiray ilaa 30 tiir oo leh qiyam gaar ah.

Goolka

Sida mashruuc kasta oo maareynta xogta ah, waxa ugu muhiimsan ayaa ahaa in la go'aamiyo sida xogta loo isticmaali doono. Kiiskan waxaanu inta badan dooran doonaa moodooyinka iyo socodka shaqada ee SNP iyadoo lagu salaynayo SNP. Taasi waa, waxaan u baahan doonaa oo kaliya xogta hal SNP markiiba. Waxay ahayd inaan barto sida loo soo ceshado dhammaan diiwaannada la xidhiidha mid ka mid ah 2,5 milyan SNPs sida ugu fudud, dhaqso iyo raqiis ah ee suurtogalka ah.

Sida aan tan loo samayn

Si aad u soo xigato clichΓ© ku habboon:

Kun jeer kuma guuldareysan, kaliya waxaan ogaaday kun siyaabood oo aan uga fogaan karo kala saarida farabadan xogta qaab su'aal-saaxiibtinimo ah.

Marka hore isku day

Maxaan bartay: Ma jirto hab raqiis ah oo lagu kala saari karo 25 TB markiiba.

Ka dib markii aan qaatay koorsada "Habab Horumarineed ee Habaynta Xogta Weyn" ee Jaamacadda Vanderbilt, waxaan hubiyay in khiyaamada ay ku jirto boorsada. Waxay u badan tahay inay qaadato saacad ama laba in la dejiyo server-ka Hive si uu u dhex maro dhammaan xogta oo uu u sheego natiijada. Maadaama xogtayadu ku kaydsan tahay AWS S3, waxaan isticmaalay adeegga Athena, kaas oo kuu ogolaanaya inaad ku dabaqdo su'aalaha Hive SQL xogta S3. Uma baahnid inaad dejiso/kor u qaaddo kutlada Hive, oo sidoo kale waxaad bixinaysaa kaliya xogta aad raadinayso.

Kadib markii aan tusay Athena xogtayda iyo qaabkeeda, waxa aan sameeyay imtixaano wata su'aalo sidan oo kale ah:

select * from intensityData limit 10;

Oo si degdeg ah u helay natiijooyin si fiican u habaysan. Diyaar.

Ilaa aan isku daynay inaan xogta u isticmaalno shaqadayada...

Waxaa la i waydiistay inaan soo saaro dhammaan macluumaadka SNP si aan u tijaabiyo moodeelka. Waxaan ku orday su'aashii:


select * from intensityData 
where snp = 'rs123456';

...oo bilaabay inuu sugo. Ka dib sideed daqiiqo iyo in ka badan 4 TB oo ah xogta la codsaday, waxaan helay natiijada. Athena waxay ku dalacaysaa mugga xogta la helay, $5 terabyte kasta. Markaa codsigan kaliya wuxuu ku kacay $20 iyo siddeed daqiiqo oo sugitaan ah. Si aan u socodsiino moodalka dhammaan xogta, waa inaan sugno 38 sano oo aan bixinno $ 50 milyan. Sida iska cad, tani naguma habboona.

Waa lagama maarmaan in la isticmaalo Parquet ...

Maxaan bartayKa taxaddar cabbirka faylashaada Parquet iyo ururkooda.

Waxaan marka hore isku dayay inaan hagaajiyo xaalada anigoo u rogaya dhammaan TSV-yada Faylasha Parquet. Waxay ku habboon yihiin inay ku shaqeeyaan xog badan oo xog ah sababtoo ah macluumaadka ku jira waxay ku kaydsan yihiin qaabka columnar: tiir kastaa wuxuu ku yaalaa qaybta xusuusta / diskka, taas oo ka duwan faylasha qoraalka, kuwaas oo safku ka kooban yahay xubno ka mid ah tiir kasta. Oo haddii aad u baahan tahay inaad wax hesho, ka dibna kaliya akhri tiirka loo baahan yahay. Intaa waxaa dheer, fayl kastaa wuxuu ku kaydiyaa qiyam kala duwan oo tiir ah, markaa haddii qiimaha aad raadineyso uusan ku jirin tirada tiirka, Spark ma lumin doonto waqti iskaanka faylka oo dhan.

Waxaan qabtay hawl fudud Xabagta AWS si aan TSV-yadayada ugu beddelno Parquet oo aan u ridno faylasha cusub Athena. Waxay qaadatay ilaa 5 saacadood. Laakiin markii aan codsigaa bixiyay, waxay qaadatay waqti isku mid ah iyo lacag yar in aan dhamaystiro. Xaqiiqdu waxay tahay in Spark, oo isku dayaya in ay wanaajiso hawsha, si fudud u furfurtay hal xabbadood oo TSV ah oo ku rid qaybteeda Parquet. Iyo sababta oo ah jajab kastaa wuxuu ahaa mid weyn oo ku filan inuu ka kooban yahay dhammaan diiwaannada dad badan, fayl kastaa wuxuu ka kooban yahay dhammaan SNP-yada, markaa Spark waa inay furto dhammaan faylasha si ay u soo saarto macluumaadka ay u baahan tahay.

Waxa xiisaha lihi leh, Parquet's default (oo lagu taliyay) nooca riixitaanka, degdega ah, maaha mid la kala qaybin karo. Sidaa darteed, fuliye kastaa wuxuu ku xayiran yahay hawshii furista iyo soo dejinta xogta 3,5 GB oo buuxda.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R

Aan fahanno dhibka jira

Maxaan bartay: Kala soocida way adagtahay, gaar ahaan haddii xogta la qaybiyo.

Waxay ii muuqatay inaan hadda fahmay nuxurka dhibka. Waxa kaliya oo aan u baahday in aan xogta ku kala saaro tiirka SNP, ee ma aha dadka. Kadibna dhowr SNPs ayaa lagu keydin doonaa xog gaar ah, ka dibna Parquet's "smart" function "furan kaliya haddii qiimaha uu ku jiro xadka" wuxuu muujin doonaa sharaftiisa oo dhan. Nasiib darro, kala soocidda balaayiin saf oo ku kala firirsan kooxdu waxay noqotay hawl adag.

AWS xaqiiqdii ma rabto inay bixiso lacag celin sababtoo ah "Waxaan ahay arday mashquulsan" sababta. Kadib markii aan ku orday kala soocida Amazon Glue, waxay socotay 2 maalmood wayna burburtay.

Ka warran qaybinta?

Maxaan bartayQaybaha Spark waa inay ahaadaan kuwo dheellitiran.

Kadib waxaan la imid fikradda qaybinta xogta koromosoomyada. Waxaa jira 23 ka mid ah (iyo kuwo kale oo badan haddii aad xisaabta ku dartid DNA-da mitochondrial iyo gobollada aan khariidad lahayn).
Tani waxay kuu ogolaan doontaa inaad u kala qaybiso xogta qaybo yaryar. Haddii aad ku darto hal xariiq oo kaliya shaqada dhoofinta Spark ee qoraalka xabagta partition_by = "chr", markaas xogta waa in loo qaybiyaa baaldiyo.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R
genome-ku waxa uu ka kooban yahay qaybo badan oo loo yaqaan koromosoomyada.

Nasiib darro, ma shaqayn Chromosomes waxay leeyihiin cabbirro kala duwan, taas oo macnaheedu yahay xaddi macluumaad oo kala duwan. Tani waxay ka dhigan tahay in hawlaha ay Spark u dirtay shaqaaluhu aanay ahayn kuwo isku dheeli tiran oo si tartiib ah loo dhammeeyay sababtoo ah qaar ka mid ah noodhadhka ayaa hore u dhammeeyay oo aan shaqayn. Si kastaba ha ahaatee, hawlihii waa la dhammaystiray. Laakin marka la waydiisto hal SNP, dheelitir la'aanta ayaa mar kale keentay dhibaatooyin. Qiimaha habaynta SNP-yada koromosoomyada waaweyn (taas oo ah, meesha aan rabno inaan xogta ka helno) ayaa kaliya hoos u dhacay qiyaastii 10. Wax badan, laakiin kuma filna.

Ka warran haddaynu u qaybinno qaybo yaryar?

Maxaan bartay: Weligaa ha isku dayin inaad sameyso 2,5 milyan oo qaybood oo dhan.

Waxaan go'aansaday inaan wada baxo oo aan qaybiyo SNP kasta. Tani waxay hubisay in qaybuhu ay yihiin cabbir siman. WAXAY AHAYD FIKIR XUN. Waxaan isticmaalay Xabag oo waxaan ku daray khad aan waxba galabsan partition_by = 'snp'. Hawshii way bilaabatay oo waxay bilowday fulinta. Maalin ka dib ayaan eegay oo waxaan arkay in aanay weli jirin wax loo qoray S3, markaas ayaan hawshii dilay. Waxay u egtahay in Xabaggu uu ku qorayay faylal dhexe meel qarsoon oo ku taal S3, faylal badan, laga yaabee dhowr milyan. Taasi waxay keentay in khaladkaygu uu ku kaco lacag ka badan kun dollar oo aan ka farxin macalinkayga.

Qaybinta + kala soocida

Maxaan bartayKala soocida wali waa adag tahay, si la mid ah hagaajinta Spark.

Isku daygii ugu dambeeyay ee qaybinta waxay ku lug lahayd inaan qaybiyo koromosoomyada ka dibna kala sooca qayb kasta. Aragti ahaan, tani waxay soo dedejinaysaa waydiin kasta sababtoo ah xogta SNP ee la rabo waa inay ku jirtaa dhawr qaybood oo Parquet ah oo ku dhex jira xadka la bixiyay. Nasiib darro, kala soocidda xitaa xogta la qaybiyay waxay noqotay hawl adag. Natiijo ahaan, waxaan u wareegay EMR koox gaar ah oo waxaan adeegsaday sideed tusaale oo awood leh (C5.4xl) iyo Sparklyr si aan u abuuro qulqul shaqo oo dabacsan.

# Sparklyr snippet to partition by chr and sort w/in partition
# Join the raw data with the snp bins
raw_data
  group_by(chr) %>%
  arrange(Position) %>% 
  Spark_write_Parquet(
    path = DUMP_LOC,
    mode = 'overwrite',
    partition_by = c('chr')
  )

... si kastaba ha ahaatee, hawshii weli lama dhammaystirin. Waxaan u habeeyey siyaabo kala duwan: kordhinta qoondaynta xusuusta ee fuliyaha kasta oo weydiimo ah, loo isticmaalo noodes oo leh qadar badan oo xusuusta ah, waxaan isticmaalay doorsoomayaasha baahinta (doorsoomayaasha baahinta), laakiin mar kasta kuwani waxay noqdeen qiyaas nus ah, si tartiib tartiib ah fulinta ayaa bilaabay. inuu ku guul darreysto ilaa wax walba ay istaagaan.

Waxaan noqonayaa mid aad u hal abuur leh

Maxaan bartay: Mararka qaarkood xogta gaarka ah waxay u baahan tahay xalal gaar ah.

SNP kastaa wuxuu leeyahay qiime boos. Tani waa tiro u dhiganta tirada saldhigyada koromosoomkeeda. Tani waa hab fiican oo dabiici ah oo lagu habeeyo xogtayada. Markii hore waxaan rabay inaan u kala qaybiyo gobollada koromosoom kasta. Tusaale ahaan, jagooyinka 1 - 2000, 2001 - 4000, iwm. Laakiin dhibaatadu waxay tahay in SNP-yada aan si siman loogu qaybin koromosoomyada, markaa tirada kooxuhu aad bay u kala duwanaan doonaan.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R

Natiijo ahaan, waxaan ku imid jagooyin kala qaybsanaan (darajo). Isticmaalka xogta hore loo soo dejiyey, waxaan bilaabay codsi ah inaan helo liiska SNP-yada gaarka ah, boosaskooda iyo koromosoomyada. Kadibna waxaan kala soocay xogta ku jirta koromosoom kasta oo waxaan u ururiyay SNP-yada kooxo (bin) cabbir la bixiyay. Aynu nidhaahno 1000 SNP midkiiba. Tani waxay i siisay SNP-ku-koox-koomosoomyada.

Dhammaadkii, waxaan sameeyay kooxo (bin) ah 75 SNPs, sababta hoos ayaa lagu sharxi doonaa.

snp_to_bin <- unique_snps %>% 
  group_by(chr) %>% 
  arrange(position) %>% 
  mutate(
    rank = 1:n()
    bin = floor(rank/snps_per_bin)
  ) %>% 
  ungroup()

Marka hore ku tijaabi Spark

Maxaan bartayIsku-darka dhimbiiluhu waa dhakhso, laakiin qaybintu wali waa qaali.

Waxa aan rabay in aan akhriyo xogtan yar (2,5 milyan oo saf) oo ku jirta Spark, ku dar xogta ceeriin, ka dibna u qaybiyo tiirka cusub ee lagu daray bin.


# Join the raw data with the snp bins
data_w_bin <- raw_data %>%
  left_join(sdf_broadcast(snp_to_bin), by ='snp_name') %>%
  group_by(chr_bin) %>%
  arrange(Position) %>% 
  Spark_write_Parquet(
    path = DUMP_LOC,
    mode = 'overwrite',
    partition_by = c('chr_bin')
  )

waan isticmaalay sdf_broadcast(), marka Spark waxay ogtahay inay tahay inay u dirto qaab-dhismeedka xogta dhammaan noodyada. Tani waa faa'iido haddii xogtu ay yar tahay cabbirkeeda oo looga baahan yahay dhammaan hawlaha. Haddii kale, Spark waxay isku daydaa inay noqoto mid caqli-gal ah oo u qaybiya xogta sida loogu baahdo, taas oo keeni karta hoos u dhac.

Mar labaad, fikradaydu way shaqayn wayday: hawshu waxay shaqaynaysay in muddo ah, way dhammaatay midawgii, ka dibna, sidii hawl-fuliyeyaasha bilaabay qaybinta, waxay bilaabeen inay fashilmaan.

Ku darida AWK

Maxaan bartay: Ha seexan marka lagu baro waxyaabaha aasaasiga ah. Hubaal qof ayaa mar hore xalliyey dhibaatadaada 1980-meeyadii.

Ilaa hadda, sababta dhammaan guul-darrooyinkayga Spark waxay ahayd isku-dhafka xogta kutlada. Waxaa laga yaabaa in xaaladda lagu hagaajin karo daawaynta ka hor. Waxaan go'aansaday inaan isku dayo inaan u kala qaybiyo xogta qoraalka cayriin ee tiirarka koromosoomyada, sidaa darteed waxaan rajaynayay inaan Spark siiyo xogta "horay loo qaybiyey".

Waxaan ka raadiyay StackOverflow sida loo qaybiyo qiyamka tiirka oo aan helay jawaab aad u fiican. AWK waxaad ku kala qaybin kartaa faylka qoraalka qiimaha tiirka adiga oo ku qoraya qoraal halkii aad natiijooyinka u diri lahayd stdout.

Waxaan qoray qoraal Bash ah si aan u tijaabiyo. Soo dejisay mid ka mid ah TSV-yada baakadaysan, ka dibna ka soo dejisay adiga oo isticmaalaya gzip loona diray awk.

gzip -dc path/to/chunk/file.gz |
awk -F 't' 
'{print $1",..."$30">"chunked/"$chr"_chr"$15".csv"}'

Way shaqeysay!

Buuxinta Xudunta

Maxaan bartay: gnu parallel - waa shay sixir ah, qof kastaa waa inuu isticmaalo.

Kala soocida ayaa ahayd mid gaabis ah iyo markii aan bilaabay htopsi loo hubiyo isticmaalka tusaale xoog leh (oo qaali ah) EC2, waxa ii soo baxday in aan isticmaalayey hal xudun oo kaliya iyo ilaa 200 MB oo xusuusta ah. Si loo xaliyo dhibaatada oo aan lumin lacag badan, waxay ahayd inaan ogaano sida loo barbar dhigo shaqada. Nasiib wanaag, buug la yaab leh Sayniska Xogta ee khadka Taliska Waxaan helay cutub uu qoray Jeron Janssens oo ku saabsan isbarbardhigga. Waxa aan ka bartay gnu parallel, hab aad u dabacsan oo lagu hirgelinayo isku-dhufashada Unix.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R
Markii aan bilaabay qaybinta anigoo isticmaalaya habka cusub, wax walba way fiicnaayeen, laakiin wali waxaa jiray cidhiidhi - soo dejinta walxaha S3 ee saxanka ma ahayn mid aad u dhakhso badan oo aan si buuxda isku mid ahayn. Si tan loo hagaajiyo, waxaan sameeyay sidan:

  1. Waxaan ogaaday in ay suurtagal tahay in la hirgeliyo marxaladda soo dejinta S3 si toos ah dhuumaha, si buuxda u baabi'inta kaydinta dhexdhexaadka ah ee diskka. Tani waxay ka dhigan tahay inaan ka fogaan karo inaan ku qoro xogta cayriin diskka oo aan isticmaalo xitaa ka yar, oo sidaas darteed ka jaban, kaydinta AWS.
  2. kooxda aws configure set default.s3.max_concurrent_requests 50 waxay si weyn u kordhisay tirada dunta ay AWS CLI isticmaasho (sida caadiga ah waxaa jira 10).
  3. Waxaan u wareegay tusaale EC2 loo hagaajiyay xawaaraha shabakada, iyadoo xarafka n uu ku qoran yahay magaca. Waxaan ogaaday in luminta awoodda wax-qabadka marka la isticmaalayo n-tusaalooyinka ay ka badan tahay magdhowga kororka xawaaraha rarka. Inta badan hawlaha waxaan isticmaalay c5n.4xl.
  4. bedelay gzip on pigz, Kani waa qalab gzip ah oo samayn kara waxyaabo qabow si uu u barbar dhigo hawsha bilawga ah ee aan la barbar dhigi karin ee kala-baxa faylasha (tani waxay caawisay kuwa ugu yar).

# Let S3 use as many threads as it wants
aws configure set default.s3.max_concurrent_requests 50

for chunk_file in $(aws s3 ls $DATA_LOC | awk '{print $4}' | grep 'chr'$DESIRED_CHR'.csv') ; do

        aws s3 cp s3://$batch_loc$chunk_file - |
        pigz -dc |
        parallel --block 100M --pipe  
        "awk -F 't' '{print $1",..."$30">"chunked/{#}_chr"$15".csv"}'"

       # Combine all the parallel process chunks to single files
        ls chunked/ |
        cut -d '_' -f 2 |
        sort -u |
        parallel 'cat chunked/*_{} | sort -k5 -n -S 80% -t, | aws s3 cp - '$s3_dest'/batch_'$batch_num'_{}'
        
         # Clean up intermediate data
       rm chunked/*
done

Tallaabooyinkan ayaa la isku daraa midba midka kale si ay wax walba u shaqeeyaan si dhakhso leh. Anoo kordhinaya xawaaraha soo dejinta iyo baabi'inta qoraallada diskooga, waxaan hadda ku shaqeyn karaa xirmo 5 terabyte ah dhowr saacadood gudahood.

Tweet-kan waa in lagu xuso 'TSV'. Hoogay

Isticmaalka xogta cusub ee la soo saaray

Maxaan bartaySpark wuxuu jecel yahay xogta aan la cabin mana jecla isku darka qaybaha

Hadda xogtu waxay ku jirtay S3 iyada oo aan xidhxidhnayn (akhri: la wadaago) iyo qaab badh-dalban, waxaana mar kale ku soo laaban karaa Spark. Yaab ayaa i sugayey: Waxaan mar kale ku guul darreystay inaan gaaro wixii aan rabay! Aad bay u adkeyd in Spark loo sheego sida saxda ah ee xogta loo qaybiyay. Oo xitaa markii aan tan sameeyay, waxaa ii soo baxday in ay jiraan qaybo aad u badan (95 kun), iyo markii aan isticmaalay coalesce waxay hoos u dhigtay tiradooda ilaa xad macquul ah, tani waxay burburisay qaybintaydii. Waan hubaa in tan la hagaajin karo, laakiin dhowr maalmood oo baadi goob ah ka dib maan helin xal. Ugu dambayntii waxaan dhammeeyay dhammaan hawlihii Spark, in kasta oo ay qaadatay muddo iyo faylalkayga Parquet-ka ee aan kala qaybsamay aad u yarayn (~ 200 KB). Si kastaba ha ahaatee, xogtu waxay ahayd meeshii loo baahnaa.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R
Aad u yar oo aan sinnayn, cajiib ah!

Tijaabinta weydiimaha Spark maxaliga ah

Maxaan bartay: Spark waxay leedahay madax badan marka la xalinayo dhibaatooyinka fudud.

Anoo soo dejinaya xogta qaab xariif ah, waxaan awooday inaan tijaabiyo xawaaraha. Deji qoraalka R si aad u socodsiiso server-ka Spark maxalli ah, ka dibna ka soo rartay xogta Spark ee kaydinta kooxda Parquet ee la cayimay. Waxaan isku dayay inaan ku shubo dhammaan xogta laakiin ma helin Sparklyr inuu aqoonsado qaybinta.

sc <- Spark_connect(master = "local")

desired_snp <- 'rs34771739'

# Start a timer
start_time <- Sys.time()

# Load the desired bin into Spark
intensity_data <- sc %>% 
  Spark_read_Parquet(
    name = 'intensity_data', 
    path = get_snp_location(desired_snp),
    memory = FALSE )

# Subset bin to snp and then collect to local
test_subset <- intensity_data %>% 
  filter(SNP_Name == desired_snp) %>% 
  collect()

print(Sys.time() - start_time)

Fulintu waxay qaadatay 29,415 ilbiriqsi. Si aad u fiican, laakiin aan aad ugu fiicnayn tijaabinta tirada badan ee wax kasta. Intaa waxaa dheer, wax aan ku dadajin kari waayay kaydinta sababtoo ah markii aan isku dayay in aan kaydiyo kaydka xogta ee xusuusta, Spark had iyo jeer waa shil, xitaa markii aan u qoondeeyay in ka badan 50 GB ee xusuusta xog-ururinta oo miisaankeedu ka yar yahay 15.

Ku noqo AWK

Maxaan bartay: Associative arrays ee AWK waa kuwo aad waxtar u leh.

Waxaan gartay in aan gaari karo xawaare sare. Waxaan taas ku xasuustay si cajiib ah Tababarka AWK ee Bruce Barnett Waxaan akhriyay muuqaal wanaagsan oo la yiraahdo "urursanaan" Asal ahaan, kuwani waa lammaane-qiimo muhiim ah, kuwaas oo sababa qaar loogu yeedhay si kala duwan AWK, sidaa darteed si uun ugama fikirin iyaga. Roman Cheplyaka waxa la xasuustaa in ereyga "arrays associative" uu aad uga da'weyn yahay ereyga "lammaanaha qiimaha muhiimka ah". Xitaa haddii aad ka eeg qiimaha muhiimka ah ee Google Ngram, kuma arki doontid ereygan meeshaas, laakiin waxaad ka heli doontaa hannaan la wadaago! Intaa waxaa dheer, "lammaanaha-qiimaha muhiimka ah" ayaa inta badan lala xiriiriyaa xog-ururinta, sidaas darteed waxay macno badan samaynaysaa in la barbar dhigo khariidad. Waxaan xaqiiqsaday in aan isticmaali karo ururradan associative si aan SNP-yada ugu xidho miis bin iyo xog cayriin ah aniga oo aan isticmaalin Spark.

Si tan loo sameeyo, qoraalka AWK waxaan isticmaalay block BEGIN. Kani waa qayb kood ah oo la fuliyo ka hor inta aan khadka kowaad ee xogta loo gudbin qaybta ugu muhiimsan ee qoraalka.

join_data.awk
BEGIN {
  FS=",";
  batch_num=substr(chunk,7,1);
  chunk_id=substr(chunk,15,2);
  while(getline < "snp_to_bin.csv") {bin[$1] = $2}
}
{
  print $0 > "chunked/chr_"chr"_bin_"bin[$1]"_"batch_num"_"chunk_id".csv"
}

kooxda while(getline...) laga soo raray dhammaan safafka kooxda CSV (bin), dhig tiirka kowaad (magaca SNP) furaha isku xidhka associative bin iyo qiimaha labaad (kooxda) sida qiimaha. Kadibna blockka { }, kaas oo lagu fuliyo dhammaan khadadka faylka ugu weyn, xariiq kasta waxaa loo diraa faylka wax soo saarka, kaas oo helaya magac gaar ah oo ku xiran kooxdooda (bin): ..._bin_"bin[$1]"_....

Kala duwanaansho batch_num ΠΈ chunk_id waafaqay xogta ay bixisay dhuumaha, isaga oo ka fogaanaya xaalad jinsiyadeed, iyo dun fulin kasta oo socota parallel, u qoray fayl u gaar ah.

Maaddaama aan ku kala firdhiyey dhammaan xogta ceeriin ee ku jirta galka koromosoomyada ee ka haray tijaabadii hore ee AWK, hadda waxaan qori karaa qoraal kale oo Bash ah si aan u farsameeyo hal koromosoom markiiba oo aan u diro xog qoto dheer oo qaybsan S3.

DESIRED_CHR='13'

# Download chromosome data from s3 and split into bins
aws s3 ls $DATA_LOC |
awk '{print $4}' |
grep 'chr'$DESIRED_CHR'.csv' |
parallel "echo 'reading {}'; aws s3 cp "$DATA_LOC"{} - | awk -v chr=""$DESIRED_CHR"" -v chunk="{}" -f split_on_chr_bin.awk"

# Combine all the parallel process chunks to single files and upload to rds using R
ls chunked/ |
cut -d '_' -f 4 |
sort -u |
parallel "echo 'zipping bin {}'; cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R '$S3_DEST'/chr_'$DESIRED_CHR'_bin_{}.rds"
rm chunked/*

Qoraalku wuxuu leeyahay laba qaybood parallel.

Qaybta hore, xogta waxaa laga akhriyaa dhammaan faylasha ay ku jiraan macluumaadka koromosoomyada la rabo, ka dibna xogtan waxaa loo qaybiyaa dunta, kuwaas oo u qaybiya faylasha kooxaha ku habboon (bin). Si looga fogaado xaaladaha jinsiyadda marka taxane badan ay ku qoraan isla fayl, AWK waxay gudbisaa magacyada faylka si ay ugu qorto xogta meelo kala duwan, tusaale. chr_10_bin_52_batch_2_aa.csv. Natiijo ahaan, faylal yar yar oo badan ayaa lagu abuuray saxanka (taasi waxaan adeegsaday mugga terabyte EBS).

Soo wareejinta qaybta labaad parallel dhex mara kooxaha (bin) oo isku daraa faylalkooda gaarka ah CSV c catka dibna u dira dhoofin.

Baahinta R?

Maxaan bartay: Waad la xiriiri kartaa stdin ΠΈ stdout laga bilaabo qoraalka R, oo sidaas darteed u isticmaal dhuumaha.

Waxaa laga yaabaa inaad ku aragtay xariiqan qoraalkaaga Bash: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... Waxay u tarjumeysaa dhammaan faylasha kooxda (bin) ee qoraalka R ee hoose. {} waa farsamo gaar ah parallel, kaas oo gelinaya xog kasta oo ay u dirto qulqulka la cayimay si toos ah amarka laftiisa. Ikhtiyaarka {#} wuxuu bixiyaa ID dun gaar ah, iyo {%} waxay ka dhigan tahay lambarka booska shaqada (ku soo noqnoqda, laakiin marna isku mar). Liiska dhammaan xulashooyinka ayaa laga heli karaa dukumeenti

#!/usr/bin/env Rscript
library(readr)
library(aws.s3)

# Read first command line argument
data_destination <- commandArgs(trailingOnly = TRUE)[1]

data_cols <- list(SNP_Name = 'c', ...)

s3saveRDS(
  read_csv(
        file("stdin"), 
        col_names = names(data_cols),
        col_types = data_cols 
    ),
  object = data_destination
)

Marka doorsoome file("stdin") loo kala qaado readr::read_csv, xogta lagu turjumay qoraalka R waxaa lagu shubaa qaab, ka dibna qaabka .rds-fayl isticmaalaya aws.s3 si toos ah loogu qoray S3.

RDS waa shay la mid ah nooca yar ee Parquet, iyada oo aan lahayn kaydinta hadalka.

Kadib markii aan dhameeyay qoraalka Bash waxaan helay xidhmo .rdsFaylasha ku yaal S3, taas oo ii ogolaatay inaan isticmaalo isku-buufin hufan iyo noocyo ku dhex jira.

In kasta oo la isticmaalo bareegga R, wax walba si dhakhso leh ayay u shaqeeyeen. La yaab ma leh, qaybaha R ee akhrinta iyo qorista xogta ayaa aad loo hagaajiyay. Ka dib markii lagu tijaabiyey hal koromosoom oo dhexdhexaad ah, shaqadu waxay ku dhammaatay tusaale C5n.4xl qiyaastii laba saacadood.

S3 Xaddidaadaha

Maxaan bartayWaad ku mahadsan tahay hirgelinta wadada smart, S3 waxay xamili kartaa faylal badan.

Waxaan ka walwalsanahay in S3 ay awood u yeelan doonto inay xakameyso faylalka badan ee lagu wareejiyay. Waxaan ka dhigi karaa magacyada faylka macno, laakiin sidee S3 u raadin lahaa iyaga?

Baarista 25TB iyadoo la adeegsanayo AWK iyo R
Faylasha ku yaal S3 waa uun bandhig, runtii nidaamku ma xiiseeyo astaanta /. Laga bilaabo bogga S3 FAQ.

Waxay u muuqataa in S3 ay u taagan tahay dariiqa loo maro fayl gaar ah sida furaha fudud ee nooc ka mid ah miiska xashiishka ama kaydka dukumeenti ku salaysan. Baaldi waxaa loo malayn karaa inuu yahay miis, faylasha waxaa loo tixgelin karaa diiwaannada miiskaas.

Maadaama xawaaraha iyo hufnaanta ay muhiim u yihiin in faa'iido laga sameeyo Amazon, maahan wax la yaab leh in nidaamkan furaha-sida-faylka-jidka ah uu yahay mid la hagaajiyay. Waxaan isku dayay inaan helo dheelitirnaan: si aanan u helin codsiyo badan, laakiin codsiyada si dhakhso ah ayaa loo fuliyay. Waxaa soo baxday in ay ugu wanaagsan tahay in la sameeyo ilaa 20 kun oo faylal biin ah. Waxaan u maleynayaa haddii aan sii wadno hagaajinta, waxaan ku guuleysan karnaa kororka xawaaraha (tusaale ahaan, samaynta baaldi gaar ah oo kaliya xogta, sidaas darteed hoos u dhigista cabbirka miiska raadinta). Laakiin ma jirin wakhti ama lacag tijaabooyin dheeraad ah.

Ka waran iswaafajinta isdhaafsiga?

Waxa aan bartay: Sababta koowaad ee wakhtiga luminta ayaa ah hagaajinta habka kaydintaada wakhti hore.

Halkaa marka ay marayso, waxa aad muhiim u ah in aad naftaada waydiiso: "Maxaad u isticmaashaa qaabka faylka gaarka ah?" Sababtu waxay ku jirtaa xawliga rarida (faylalka CSV ee gzipped ayaa qaatay 7 jeer in ka badan in la shubo) iyo waafaqsanaanta socodka shaqadeena. Waxa laga yaabaa inaan dib u eego haddii R uu si fudud ugu shubi karo feylasha Parquet (ama falaarta) iyada oo aan la hayn culayska Spark. Qof kasta oo ku jira shaybaadhkayaga ayaa isticmaala R, oo haddii aan u baahdo inaan u beddelo xogta qaab kale, weli waxaan haystaa xogta qoraalka asalka ah, markaa waxaan mar kale wadi karaa dhuumaha.

Qaybta shaqada

Maxaan bartayHa isku dayin inaad gacanta ku hagaajiso shaqooyinka, u ogolow kumbiyuutarku inuu sameeyo.

Waxaan ka saaray socodka shaqada hal koromosoom, hadda waxaan u baahanahay inaan ka shaqeeyo dhammaan xogta kale.
Waxaan rabay inaan kor u qaado dhowr xaaladood oo EC2 ah oo beddelaad ah, laakiin isla markaa waxaan ka baqay inaan helo culeys aad u dheelitiran oo ku saabsan shaqooyinka habaynta ee kala duwan (sidoo kale Spark ayaa ka soo gaartay qaybo aan dheellitirnayn). Intaa waxaa dheer, ma xiisayneynin inaan kor u qaado hal tusaale koromosoomkiiba, sababtoo ah xisaabaadka AWS waxaa jira xaddidaad caadi ah oo ah 10 xaaladood.

Kadib waxaan go'aansaday inaan ku qoro qoraal R ah si aan u wanaajiyo shaqooyinka habaynta.

Marka hore, waxaan waydiistay S3 inay xisaabiso inta ay le'eg tahay kaydinta kaydinta koromosoom kasta.

library(aws.s3)
library(tidyverse)

chr_sizes <- get_bucket_df(
  bucket = '...', prefix = '...', max = Inf
) %>% 
  mutate(Size = as.numeric(Size)) %>% 
  filter(Size != 0) %>% 
  mutate(
    # Extract chromosome from the file name 
    chr = str_extract(Key, 'chr.{1,4}.csv') %>%
             str_remove_all('chr|.csv')
  ) %>% 
  group_by(chr) %>% 
  summarise(total_size = sum(Size)/1e+9) # Divide to get value in GB



# A tibble: 27 x 2
   chr   total_size
   <chr>      <dbl>
 1 0           163.
 2 1           967.
 3 10          541.
 4 11          611.
 5 12          542.
 6 13          364.
 7 14          375.
 8 15          372.
 9 16          434.
10 17          443.
# … with 17 more rows

Dabadeed waxaan qoray hawl qaadata wadarta cabbirka, isku shaandhaynta nidaamka koromosoomyada, u kala qaybiyaa kooxo. num_jobs wuxuuna kuu sheegayaa sida ay u kala duwan yihiin cabbirrada dhammaan shaqooyinka habaynta.

num_jobs <- 7
# How big would each job be if perfectly split?
job_size <- sum(chr_sizes$total_size)/7

shuffle_job <- function(i){
  chr_sizes %>%
    sample_frac() %>% 
    mutate(
      cum_size = cumsum(total_size),
      job_num = ceiling(cum_size/job_size)
    ) %>% 
    group_by(job_num) %>% 
    summarise(
      job_chrs = paste(chr, collapse = ','),
      total_job_size = sum(total_size)
    ) %>% 
    mutate(sd = sd(total_job_size)) %>% 
    nest(-sd)
}

shuffle_job(1)



# A tibble: 1 x 2
     sd data            
  <dbl> <list>          
1  153. <tibble [7 Γ— 3]>

Kadib waxaan ku dhex orday kun isku shaandheyn anigoo isticmaalaya purrr oo waxaan doortay kii ugu fiicnaa.

1:1000 %>% 
  map_df(shuffle_job) %>% 
  filter(sd == min(sd)) %>% 
  pull(data) %>% 
  pluck(1)

Markaa waxa aan ku soo afmeeray hawlo shaqo oo aad isu eg. Dabadeed waxa hadhay oo dhami waxay ahayd inaan qoraalkii hore ee Bash ku duubo wareeg weyn for. Hagaajintani waxay qaadatay ilaa 10 daqiiqo in la qoro. Waxayna tani aad uga yar tahay intii aan ku bixin lahaa gacanta abuurista hawlaha hadday dheelli-tirnayn. Sidaa darteed, waxaan u maleynayaa inaan ku saxsanaa hagaajintan hordhaca ah.

for DESIRED_CHR in "16" "9" "7" "21" "MT"
do
# Code for processing a single chromosome
fi

Dhamaadka waxaan ku daraa amarka xiritaanka:

sudo shutdown -h now

... wax walbana way shaqeeyeen! Isticmaalka AWS CLI, waxaan kor u qaaday tusaalooyin aniga oo isticmaalaya ikhtiyaarka user_data wuxuu siiyey qoraallo Bash ah oo ku saabsan hawlahooda shaqo. Way ordeen oo si otomaatig ah ayay u xidheen, markaa anigu ma bixinayn kharashka wax qabad ee dheeraadka ah.

aws ec2 run-instances ...
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=<<job_name>>}]" 
--user-data file://<<job_script_loc>>

Aan xirxirno!

Maxaan bartay: API waa in uu ahaado mid fudud si loo fududeeyo iyo dabacsanaanta isticmaalka.

Ugu dambeyntii waxaan helay xogta meesha saxda ah iyo foomka. Waxa hadhay oo dhan waxay ahayd in la fududeeyo habka isticmaalka xogta intii suurtagal ah si aan ugu fududeeyo asxaabtayda. Waxaan rabay in aan sameeyo API fudud ee codsiyada abuurista. Haddii mustaqbalka aan go'aansado inaan ka beddelo .rds Faylasha Parquet, markaa tani waa inay dhib igu noqotaa aniga, maahan asxaabtayda. Taas awgeed waxaan go'aansaday inaan sameeyo xirmo R gudaha ah.

Dhis oo dukumeenti xidhmo aad u fudud oo ka kooban dhawr hawlood oo helitaan xog ah oo lagu habeeyey hawl get_snp. Waxaan sidoo kale u sameeyay asxaabteyda shabakad pkgdown, si ay si fudud u arki karaan tusaalooyin iyo dukumentiyo.

Baarista 25TB iyadoo la adeegsanayo AWK iyo R

kaydinta smart

Maxaan bartay: Haddii xogtaada si wanaagsan loo diyaariyey, kaydintu way fududaan doontaa!

Maadaama mid ka mid ah qulqulka shaqada ee ugu muhiimsan uu ku dabaqay isla qaabka falanqaynta ee xirmada SNP, waxaan go'aansaday inaan isticmaalo bining si aan faa'iido u helo. Marka xogta lagu gudbinayo SNP, dhammaan macluumaadka kooxda (bin) waxay ku dheggan yihiin shayga la soo celiyay. Taasi waa, weydiimihii hore (aragti ahaan) waxay dedejin karaan habaynta weydiimaha cusub.

# Part of get_snp()
...
  # Test if our current snp data has the desired snp.
  already_have_snp <- desired_snp %in% prev_snp_results$snps_in_bin

  if(!already_have_snp){
    # Grab info on the bin of the desired snp
    snp_results <- get_snp_bin(desired_snp)

    # Download the snp's bin data
    snp_results$bin_data <- aws.s3::s3readRDS(object = snp_results$data_loc)
  } else {
    # The previous snp data contained the right bin so just use it
    snp_results <- prev_snp_results
  }
...

Markii la dhisayo xirmada, waxaan ku orday bartilmaameedyo badan si aan u barbardhigo xawaaraha marka la isticmaalayo habab kala duwan. Waxaan ku talinayaa inaanan dayacin tan, sababtoo ah mararka qaarkood natiijadu waa lama filaan. Tusaale ahaan, dplyr::filter aad ayuu uga dhakhso badnaa qabashada safafka iyadoo la isticmaalayo shaandhaynta ku salaysan tusmaynta, iyo soo saarista hal tiir oo ka mid ah qaab-dhismeedka xogta la sifeeyay aad ayay uga dhaqso badan tahay adeegsiga tusmaynta qoraalka.

Fadlan la soco in shayga prev_snp_results ka kooban yahay furaha snps_in_bin. Kani waa noocyo kala duwan oo ah dhammaan SNP-yada gaarka ah ee koox (bin), taasoo kuu oggolaanaysa inaad si dhakhso ah u hubiso haddii aad hore u haysatid xogta weydiimo hore. Waxa kale oo ay fududaynaysaa in la dhex maro dhammaan SNP-yada koox ahaan (bin) oo leh koodkan:

# Get bin-mates
snps_in_bin <- my_snp_results$snps_in_bin

for(current_snp in snps_in_bin){
  my_snp_results <- get_snp(current_snp, my_snp_results)
  # Do something with results 
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Hadda waxaan awoodnaa (oo aan bilownay inaan si dhab ah u wadno) moodooyinka iyo xaaladaha aan markii hore aan la heli karin. Waxa ugu fiican ayaa ah in asxaabteyda shaybaadhka aanay ahayn inay ka fikiraan dhibaato kasta. Waxay leeyihiin uun shaqo shaqaynaysa.

In kasta oo xirmadu ay u tudho faahfaahinta, waxaan isku dayay inaan ka dhigo qaabka xogta mid fudud oo ku filan oo ay ogaan karaan haddii aan si lama filaan ah berri u lumo ...

Xawaaraha ayaa si muuqata u kordhay. Caadi ahaan waxaan iska-baarnaa jajabyada genome-ga oo shaqeynaya. Markii hore, ma sameyn karno tan (waxay u muuqatay mid aad u qaali ah), laakiin hadda, Thanks to kooxda (bin) qaab dhismeedka iyo kaydinta, codsiga hal SNP wuxuu qaataa celcelis ahaan wax ka yar 0,1 ilbiriqsi, isticmaalka xogta waa sidaas. hooseeyo in kharashka S3 yahay lawska.

gunaanad

Maqaalkani ma aha hage haba yaraatee. Xalku wuxuu noqday mid shakhsi ah, oo runtii maaha mid wanaagsan. Laakiin, waa sheeko socdaal. Waxaan rabaa in dadka kale ay fahmaan in go'aamadan oo kale aysan si buuxda ugu muuqan madaxa, waxay yihiin natiijada tijaabo iyo qalad. Sidoo kale, haddii aad raadinayso saynisyahan xog, maskaxda ku hay in isticmaalka qalabkan si wax ku ool ah uu u baahan yahay khibrad, khibradna waa lacag. Waan ku faraxsanahay in aan haysto wax aan wax ku bixiyo, laakiin qaar badan oo kale oo qaban kara isla shaqadayda si ka fiican waligood ma heli doonaan fursad lacag la'aan darteed xitaa isku dayaan.

Aaladaha xogta waaweyni waa kuwo kala duwan. Haddii aad haysato wakhti, waxaad hubaal ahaan u qori kartaa xal degdeg ah adigoo isticmaalaya xogta nadiifinta, kaydinta, iyo farsamooyinka soo saarista. Ugu dambeyntii waxay ku soo degtaa falanqaynta kharashka-faa'iidada.

Waxa aan bartay:

  • ma jirto hab raqiis ah oo lagu kala saari karo 25 TB markiiba;
  • ka taxaddar cabbirka faylashaada Parquet iyo ururkooda;
  • Qaybaha Spark waa inay ahaadaan kuwo dheellitiran;
  • Guud ahaan, waligaa ha isku dayin inaad sameyso 2,5 milyan oo qaybood;
  • Kala soocida wali waa adag tahay, sida dejinta Spark;
  • mararka qaarkood xogta gaarka ah waxay u baahan tahay xalal gaar ah;
  • Isku-darka dhimbiilku waa dhakhso, laakiin qaybintu wali waa qaali;
  • Ha seexan marka ay ku baraan waxyaabaha aasaasiga ah, qof ayaa laga yaabaa inuu hore u xaliyay dhibaatadaada 1980-meeyadii;
  • gnu parallel - tani waa shay sixir ah, qof kastaa waa inuu isticmaalo;
  • Spark wuxuu jecel yahay xogta aan la adkeyn mana jecla isku-darka qaybaha;
  • Spark waxay leedahay madax aad u badan marka la xalinayo dhibaatooyinka fudud;
  • AWK's associative arts waa mid aad waxtar u leh;
  • waad la xiriiri kartaa stdin ΠΈ stdout laga bilaabo qoraalka R, oo sidaas darteed u isticmaal dhuumaha;
  • Waad ku mahadsan tahay hirgelinta wadada caqliga leh, S3 waxay farsameyn kartaa faylal badan;
  • Sababta ugu weyn ee waqtiga luminaysa ayaa ah in si degdeg ah loo wanaajiyo habka kaydintaada;
  • Ha isku dayin inaad gacanta ku hagaajiso hawlaha, u daa kumbiyuutarku inuu sameeyo;
  • API-gu waa inuu ahaadaa mid fudud iyadoo loo eegayo fududaynta iyo dabacsanaanta isticmaalka;
  • Haddii xogtaada si wanaagsan loo diyaariyey, kaydintu way fududaan doontaa!

Source: www.habr.com

Add a comment