A’ parsadh 25TB a’ cleachdadh AWK agus R

A’ parsadh 25TB a’ cleachdadh AWK agus R
Mar a leughas tu an artaigil seo: Tha mi duilich airson an teacsa a bhith cho fada agus chaotic. Gus ùine a shàbhaladh dhut, bidh mi a’ tòiseachadh gach caibideil le ro-ràdh “Na dh’ionnsaich mi”, a bheir geàrr-chunntas air brìgh a’ chaibideil ann an seantans no dhà.

“Dìreach seall dhomh am fuasgladh!” Ma tha thu dìreach airson faicinn cò às a thàinig mi, an uairsin leum chun chaibideil “Becoming More Inventive,” ach tha mi a ’smaoineachadh gu bheil e nas inntinniche agus nas fheumail a bhith a’ leughadh mu dheidhinn fàiligeadh.

Chaidh iarraidh orm o chionn ghoirid pròiseas a stèidheachadh airson a bhith a’ giullachd mòran de shreathan DNA amh (gu teicnigeach chip SNP). Bha feum air dàta fhaighinn gu sgiobalta mu àite ginteil sònraichte (ris an canar SNP) airson modaladh às deidh sin agus gnìomhan eile. A’ cleachdadh R agus AWK, bha e comasach dhomh dàta a ghlanadh agus a chur air dòigh ann an dòigh nàdarrach, a’ luathachadh giullachd cheistean gu mòr. Cha robh seo furasta dhomh agus bha feum air iomadach tionndadh. Cuidichidh an artaigil seo thu gus cuid de na mearachdan agam a sheachnadh agus seallaidh e dhut na rinn mi.

An toiseach, cuid de mhìneachaidhean tòiseachaidh.

dàta

Thug ionad giullachd fiosrachaidh ginteil an oilthigh againn dàta dhuinn ann an cruth TSV 25 TB. Fhuair mi iad air an roinn ann am pasganan 5, air an teannachadh le Gzip, agus bha timcheall air 240 faidhle ceithir-gigabyte anns gach fear dhiubh. Anns gach sreath bha dàta airson aon SNP bho aon neach. Gu h-iomlan, chaidh dàta mu ~2,5 millean SNP agus ~60 mìle neach a ghluasad. A bharrachd air fiosrachadh SNP, bha grunn cholbhan anns na faidhlichean le àireamhan a’ nochdadh diofar fheartan, leithid dian leughaidh, tricead diofar alleles, msaa. Uile gu lèir bha timcheall air 30 colbhan le luachan gun samhail.

Amas

Coltach ri pròiseact stiùireadh dàta sam bith, b 'e an rud as cudromaiche a bhith a' dearbhadh mar a bhiodh an dàta air a chleachdadh. Anns a 'chùis seo bidh sinn mar as trice a’ taghadh mhodalan agus sruthan-obrach airson SNP stèidhichte air SNP. Is e sin, cha bhi feum againn ach air dàta air aon SNP aig aon àm. B’ fheudar dhomh ionnsachadh mar a gheibhinn air ais a h-uile clàr co-cheangailte ri aon de na 2,5 millean SNP cho furasta, cho luath agus cho saor sa ghabhas.

Ciamar nach dèan thu seo

Gus cliché iomchaidh a ghairm:

Cha do dh’ fhàilnich mi mìle uair, lorg mi mìle dòigh gus dòrlach de dhàta a pharsadh ann an cruth ceisteach a sheachnadh.

A ’chiad oidhirp

Dè tha mi air ionnsachadh: Chan eil dòigh saor ann airson 25 TB a pharsadh aig aon àm.

Às deidh dhomh an cùrsa “Modhan Adhartach airson Giullachd Dàta Mòr” a ghabhail aig Oilthigh Vanderbilt, bha mi cinnteach gun robh an cleas anns a’ bhaga. Is dòcha gun toir e uair no dhà gus am frithealaiche Hive a stèidheachadh gus ruith tron ​​​​dàta gu lèir agus aithris a thoirt air an toradh. Leis gu bheil an dàta againn air a stòradh ann an AWS S3, chleachd mi an t-seirbheis Athena, a leigeas leat ceistean Hive SQL a chur an sàs ann an dàta S3. Cha leig thu leas cruinneachadh Hive a stèidheachadh / a thogail, agus cha phàigh thu ach airson an dàta a tha thu a’ sireadh.

Às deidh dhomh an dàta agam agus a chruth a shealltainn dha Athena, ruith mi deuchainnean le ceistean mar seo:

select * from intensityData limit 10;

Agus fhuair iad toraidhean le deagh structar gu sgiobalta. Ready.

Gus an do dh'fheuch sinn ris an dàta a chleachdadh nar n-obair ...

Chaidh iarraidh orm am fiosrachadh gu lèir bhon SNP a tharraing a-mach gus am modail a dhearbhadh. Ruith mi a’ cheist:


select * from intensityData 
where snp = 'rs123456';

... agus thòisich e ri feitheamh. Às deidh ochd mionaidean agus barrachd air 4 TB de dhàta a chaidh iarraidh, fhuair mi an toradh. Cosgaisean Athena a rèir na tha de dhàta air a lorg, $5 gach terabyte. Mar sin chosg an aon iarrtas seo $20 agus ochd mionaidean de dh'fheitheamh. Gus am modail a ruith air an dàta gu lèir, bha againn ri feitheamh 38 bliadhna agus pàigheadh ​​$50 millean.Gu dearbh, cha robh seo freagarrach dhuinn.

Bha e riatanach parquet a chleachdadh ...

Dè tha mi air ionnsachadh: Bi faiceallach le meud nam faidhlichean Parquet agad agus am buidheann.

Dh'fheuch mi an toiseach ris an t-suidheachadh a rèiteachadh le bhith ag atharrachadh a h-uile TSV gu Faidhlichean parquet. Tha iad goireasach airson obrachadh le seataichean dàta mòra leis gu bheil am fiosrachadh annta air a stòradh ann an cruth colbh: tha gach colbh na laighe anns a’ chuimhne / diosc aige fhèin, an taca ri faidhlichean teacsa, anns a bheil eileamaidean de gach colbh ann an sreathan. Agus ma dh'fheumas tu rudeigin a lorg, dìreach leugh an colbh a tha a dhìth. A bharrachd air an sin, bidh gach faidhle a’ stòradh raon de luachan ann an colbh, mar sin mura h-eil an luach a tha thu a’ sireadh ann an raon a’ cholbh, cha bhith Spark a’ caitheamh ùine a’ sganadh an fhaidhle gu lèir.

Ruith mi obair shìmplidh Glue AWS gus na TSVn againn a thionndadh gu Parquet agus na faidhlichean ùra a leigeil sìos gu Athena. Thug e timcheall air 5 uairean. Ach nuair a ruith mi an t-iarrtas, thug e timcheall air an aon ùine agus beagan nas lugha de airgead airson a chrìochnachadh. Is e an fhìrinn gu bheil Spark, a ’feuchainn ris a’ ghnìomh a mheudachadh, dìreach air aon phìos TSV a dhì-phapadh agus a chuir na phìos Parquet fhèin. Agus leis gu robh gach pìos mòr gu leòr airson clàran iomlan mòran dhaoine a chumail, bha na SNPan gu lèir anns gach faidhle, agus mar sin bha aig Spark ri na faidhlichean uile fhosgladh gus am fiosrachadh a bha a dhìth air a thoirt a-mach.

Gu inntinneach, chan eil an seòrsa teannachaidh àbhaisteach aig Parquet (agus air a mholadh), snappy, air a sgaradh. Mar sin, bha gach neach-tiomnaidh an sàs anns a’ ghnìomh a bhith a’ dì-phapadh agus a’ luchdachadh sìos an làn sheata dàta 3,5 GB.

A’ parsadh 25TB a’ cleachdadh AWK agus R

Tuigidh sinn an duilgheadas

Dè tha mi air ionnsachadh: Tha e duilich a sheòrsachadh, gu sònraichte ma thèid an dàta a sgaoileadh.

Bha e coltach rium gu robh mi a-nis a’ tuigsinn brìgh na trioblaid. Cha robh agam ach an dàta a sheòrsachadh a rèir colbh an SNP, chan ann a rèir dhaoine. An uairsin thèid grunn SNPan a stòradh ann am pìos dàta fa leth, agus an uairsin bidh gnìomh “smart” Parquet “fosgailte a-mhàin ma tha an luach san raon” ga nochdadh fhèin na ghlòir gu lèir. Gu mì-fhortanach, b’ e obair dhoirbh a bh’ ann a bhith a’ rèiteach tro na billeanan de shreathan sgapte thairis air buidheann.

Chan eil AWS gu cinnteach airson ath-dhìoladh a thoirt seachad air sgàth an adhbhar “Tha mi nam oileanach air a bheil dragh orm”. Às deidh dhomh ruith air Amazon Glue, ruith e airson 2 latha agus thuit e.

Dè mu dheidhinn sgaradh?

Dè tha mi air ionnsachadh: Feumaidh pàirtean ann an Spark a bhith cothromach.

An uairsin thàinig mi suas leis a 'bheachd a bhith a' sgaradh dàta ann an cromosomes. Tha 23 dhiubh ann (agus grunn eile ma bheir thu aire do DNA mitochondrial agus roinnean gun mhapa).
Leigidh seo leat an dàta a roinn ann am pìosan nas lugha. Ma chuireas tu dìreach aon loidhne ris a’ ghnìomh às-mhalairt Spark anns an sgriobt Glue partition_by = "chr", an uairsin bu chòir an dàta a roinn ann am bucaidean.

A’ parsadh 25TB a’ cleachdadh AWK agus R
Tha an genoma air a dhèanamh suas de ghrunn phìosan ris an canar chromosomes.

Gu mì-fhortanach, cha do dh'obraich e. Tha diofar mheudan aig cromosoman, a tha a’ ciallachadh diofar mheudan fiosrachaidh. Tha seo a’ ciallachadh nach deach na gnìomhan a chuir Spark gu luchd-obrach a chothromachadh agus a chrìochnachadh gu slaodach leis gun do chrìochnaich cuid de nodan tràth agus gun robh iad leisg. Ach, chaidh na gnìomhan a chrìochnachadh. Ach nuair a dh'iarradh aon SNP, dh'adhbhraich an neo-chothromachadh trioblaidean a-rithist. Tha cosgais giullachd SNPan air cromosoman nas motha (is e sin, far a bheil sinn airson dàta fhaighinn) air a dhol sìos dìreach mu dheidhinn factar de 10. Tòrr, ach chan eil gu leòr.

Dè ma tha sinn ga roinn ann am pàirtean eadhon nas lugha?

Dè tha mi air ionnsachadh: Na feuch ri 2,5 millean sgaradh a dhèanamh idir.

Cho-dhùin mi a dhol a-mach agus roinn gach SNP. Rinn seo cinnteach gu robh na pàirtean den aon mheud. B' e droch bheachd a bh' ann. Chleachd mi Glue agus chuir mi loidhne neo-chiontach ris partition_by = 'snp'. Thòisich an obair agus thòisich e air a chur an gnìomh. Latha às deidh sin rinn mi sgrùdadh agus chunnaic mi nach robh dad fhathast sgrìobhte gu S3, agus mar sin mharbh mi an obair. Tha e coltach gun robh Glue a’ sgrìobhadh fhaidhlichean eadar-mheadhanach gu àite falaichte ann an S3, tòrr fhaidhlichean, ’s dòcha millean no dhà. Mar thoradh air an sin, chosg mo mhearachd còrr air mìle dolar agus cha do chòrd e ris an neach-comhairle agam.

Roinneadh + seòrsachadh

Dè tha mi air ionnsachadh: Tha rèiteachadh fhathast duilich, mar a tha gleusadh Spark.

Thug an oidhirp mu dheireadh agam air sgaradh a-steach mi a’ sgaradh nan cromosoman agus an uairsin a’ rèiteach gach sgaradh. Ann an teòiridh, chuireadh seo luathachadh air gach ceist oir dh'fheumadh an dàta SNP a bha a dhìth a bhith taobh a-staigh beagan pìosan Parquet taobh a-staigh raon sònraichte. Gu mì-fhortanach, b’ e obair dhoirbh a bh’ ann a bhith a’ rèiteach eadhon dàta air a sgaradh. Mar thoradh air an sin, thionndaidh mi gu EMR airson cruinneachadh àbhaisteach agus chleachd mi ochd suidheachaidhean cumhachdach (C5.4xl) agus Sparklyr gus sruth-obrach nas sùbailte a chruthachadh ...

# 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')
  )

...ach, cha deach an obair a chrìochnachadh fhathast. Rèitich mi e ann an diofar dhòighean: mheudaich an riarachadh cuimhne airson gach neach-tiomnaidh ceiste, chleachd mi nodan le tòrr cuimhne, chleachd mi caochladairean craolaidh (caochladairean craolaidh), ach gach uair thionndaidh iad sin gu bhith nan leth-cheumannan, agus mean air mhean thòisich an luchd-tiomnaidh fàiligeadh gus an sguir a h-uile càil.

Tha mi a’ fàs nas cruthachail

Dè tha mi air ionnsachadh: Uaireannan feumaidh dàta sònraichte fuasglaidhean sònraichte.

Tha luach suidheachaidh aig gach SNP. Is e seo àireamh a fhreagras ris an àireamh de bhunaitean air a chromosome. Is e dòigh snog is nàdarra a tha seo airson ar dàta a chuir air dòigh. An toiseach bha mi airson sgaradh a rèir roinnean de gach cromosome. Mar eisimpleir, dreuchdan 1 - 2000, 2001 - 4000, msaa. Ach is e an duilgheadas nach eil SNPan air an sgaoileadh gu cothromach thairis air na cromosoman, agus mar sin bidh meudan bhuidhnean ag atharrachadh gu mòr.

A’ parsadh 25TB a’ cleachdadh AWK agus R

Mar thoradh air an sin, thàinig mi gu briseadh sìos de dhreuchdan ann an roinnean (rang). A’ cleachdadh an dàta a chaidh a luchdachadh sìos mu thràth, ruith mi iarrtas airson liosta fhaighinn de SNPan sònraichte, an suidheachadh agus na cromosoman. An uairsin rèitich mi an dàta taobh a-staigh gach cromosome agus chruinnich mi SNPan ann am buidhnean (bin) de mheud sònraichte. Canaidh sinn 1000 SNP gach fear. Thug seo dhomh an dàimh SNP-gu-buidhne-per-chromosome.

Aig a’ cheann thall, rinn mi buidhnean (bin) de 75 SNP, thèid an adhbhar a mhìneachadh gu h-ìosal.

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

Feuch an toiseach le Spark

Dè tha mi air ionnsachadh: Tha cruinneachadh sradag luath, ach tha sgaradh fhathast daor.

Bha mi airson am frèam dàta beag seo (2,5 millean sreath) a leughadh a-steach do Spark, a chur còmhla ris an dàta amh, agus an uairsin a sgaradh leis a’ cholbh ùr 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')
  )

Chleachd mi sdf_broadcast(), agus mar sin tha fios aig Spark gum bu chòir dha am frèam dàta a chuir chun a h-uile nod. Tha seo feumail ma tha an dàta beag ann am meud agus riatanach airson a h-uile gnìomh. Rud eile, bidh Spark a’ feuchainn ri bhith glic agus a’ cuairteachadh dàta mar a dh’ fheumar, a dh’ fhaodadh slaodachadh adhbhrachadh.

Agus a-rithist, cha do dh'obraich mo bheachd: bha na gnìomhan ag obair airson ùine, chuir iad crìoch air an aonadh, agus an uairsin, mar an luchd-tiomnaidh a chaidh a chuir air bhog le sgaradh, thòisich iad a 'fàilligeadh.

A' cur AWK ris

Dè tha mi air ionnsachadh: Na bi a’ cadal nuair a thathas a’ teagasg na bunaitean dhut. Gu cinnteach tha cuideigin air do dhuilgheadas fhuasgladh mu thràth anns na 1980n.

Gu ruige seo, b ’e an adhbhar airson na fàilligidhean agam le Spark an cruinneachadh de dhàta anns a’ bhuidheann. Is dòcha gun tèid an suidheachadh a leasachadh le ro-làimhseachadh. Cho-dhùin mi feuchainn ris an dàta teacsa amh a roinn ann an colbhan de chromosomes, agus mar sin bha mi an dòchas dàta “ro-phàirteach” a thoirt dha Spark.

Rannsaich mi air StackOverflow airson mar a roinneadh tu a rèir luachan colbh agus lorg mi freagairt cho math. Le AWK faodaidh tu faidhle teacsa a roinn le luachan colbh le bhith ga sgrìobhadh ann an sgriobt seach a bhith a’ cur nan toraidhean gu stdout.

Sgrìobh mi sgriobt Bash airson feuchainn air. Luchdaich sìos aon de na TSVan pacaichte, agus an uairsin dì-phacaich e le bhith a’ cleachdadh gzip agus chuir gu awk.

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

Dh'obraich e!

A 'lìonadh na cores

Dè tha mi air ionnsachadh: gnu parallel - is e rud draoidheil a th 'ann, bu chòir dha a h-uile duine a chleachdadh.

Bha an dealachadh gu math slaodach agus nuair a thòisich mi htopgus sgrùdadh a dhèanamh air cleachdadh eisimpleir EC2 cumhachdach (agus daor), thionndaidh e a-mach nach robh mi a’ cleachdadh ach aon chridhe agus timcheall air 200 MB de chuimhne. Gus an duilgheadas fhuasgladh agus gun a bhith a 'call mòran airgid, dh'fheumadh sinn a-mach ciamar a dhèanadh sinn an obair co-shìnte. Gu fortanach, ann an leabhar gu tur iongantach Saidheans dàta aig an loidhne-àithne Lorg mi caibideil le Jeron Janssens air co-shìnteadh. Bhon seo dh’ ionnsaich mi mu dheidhinn gnu parallel, dòigh gu math sùbailte airson multithreading a chuir an gnìomh ann an Unix.

A’ parsadh 25TB a’ cleachdadh AWK agus R
Nuair a thòisich mi air an sgaradh a’ cleachdadh a’ phròiseas ùr, bha a h-uile dad gu math, ach bha cnap-starra ann fhathast - cha robh luchdachadh sìos stuthan S3 gu diosc glè luath agus cha robh e làn cho-shìnte. Gus seo a cheartachadh, rinn mi seo:

  1. Fhuair mi a-mach gu bheil e comasach ìre luchdachadh sìos S3 a chuir an gnìomh gu dìreach san loidhne-phìoban, a ’cur às gu tur stòradh eadar-mheadhanach air diosc. Tha seo a’ ciallachadh gun urrainn dhomh dàta amh a sheachnadh gu diosc agus stòradh eadhon nas lugha, agus mar sin nas saoire, a chleachdadh air AWS.
  2. sgioba aws configure set default.s3.max_concurrent_requests 50 mheudaich e gu mòr an àireamh de snàithleanan a bhios AWS CLI a’ cleachdadh (gu gnàthach tha 10).
  3. Ghluais mi gu eisimpleir EC2 air a mheudachadh airson astar lìonra, leis an litir n san ainm. Tha mi air faighinn a-mach gu bheil call cumhachd giollachd nuair a bhios tu a’ cleachdadh n-instances air a dhìoladh nas motha leis an àrdachadh ann an astar luchdachadh. Airson a’ mhòr-chuid de ghnìomhan chleachd mi c5n.4xl.
  4. Air atharrachadh gzip air pigz, is e inneal gzip a tha seo as urrainn rudan fionnar a dhèanamh gus an obair neo-cho-shìnte an toiseach a thaobh dì-dhùmhlachadh fhaidhlichean a cho-thaobhadh (chuidich seo an ìre as lugha).

# 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

Tha na ceumannan sin air an cur còmhla ri chèile gus toirt air a h-uile càil obrachadh gu math luath. Le bhith ag àrdachadh astar luchdachadh sìos agus a’ cuir às do sgrìobhaidhean diosc, b’ urrainn dhomh a-nis pasgan 5 terabyte a phròiseasadh ann am beagan uairean a thìde.

Bu chòir gun tug an tweet seo iomradh air ‘TSV’. Och.

A’ cleachdadh dàta air a pharsadh às ùr

Dè tha mi air ionnsachadh: Is toil le Spark dàta neo-bhrùichte agus cha toil leis a bhith a’ cothlamadh sgaraidhean.

A-nis bha an dàta ann an S3 ann an cruth gun phacaid (leugh: co-roinnte) agus leth-òrdaichte, agus b’ urrainn dhomh tilleadh gu Spark a-rithist. Bha iongnadh a’ feitheamh rium: cha do shoirbhich leam a-rithist na bha mi ag iarraidh a choileanadh! Bha e gu math duilich innse dha Spark dìreach mar a chaidh an dàta a roinn. Agus eadhon nuair a rinn mi seo, thionndaidh e a-mach gu robh cus sgaradh ann (95 mìle), agus nuair a chleachd mi coalesce lughdaich seo an àireamh gu crìochan reusanta, sgrios seo mo sgaradh. Tha mi cinnteach gun gabh seo a chàradh, ach às deidh latha no dhà de rannsachadh cha b’ urrainn dhomh fuasgladh a lorg. Mu dheireadh chuir mi crìoch air a h-uile gnìomh ann an Spark, ged a thug e greis agus cha robh na faidhlichean Parquet roinnte agam glè bheag (~ 200 KB). Ach, bha an dàta far an robh feum air.

A’ parsadh 25TB a’ cleachdadh AWK agus R
Ro bheag agus neo-chòmhnard, iongantach!

A’ dèanamh deuchainn air ceistean ionadail Spark

Dè tha mi air ionnsachadh: Tha cus os cionn aig Spark nuair a bhios e a’ fuasgladh cheistean sìmplidh.

Le bhith a’ luchdachadh sìos an dàta ann an cruth ciallach, bha e comasach dhomh an astar a dhearbhadh. Stèidhich sgriobt R gus frithealaiche Spark ionadail a ruith, agus an uairsin luchdaich sìos frèam dàta Spark bhon stòradh buidheann Parquet ainmichte (bin). Dh’ fheuch mi ris an dàta gu lèir a luchdachadh ach cha b’ urrainn dhomh Sparklyr aithneachadh an sgaradh.

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)

Thug an cur gu bàs 29,415 diogan. Gu math nas fheàrr, ach chan eil e ro mhath airson mòr-dheuchainn air rud sam bith. A bharrachd air an sin, cha b’ urrainn dhomh cùisean a luathachadh le tasgadan oir nuair a dh ’fheuch mi ri frèam dàta a thasgadh mar chuimhneachan, bha Spark an-còmhnaidh a’ tuiteam às a chèile, eadhon nuair a thug mi seachad barrachd air 50 GB de chuimhne gu stòr-dàta anns an robh cuideam nas lugha na 15.

Fill ar ais go AWK

Dè tha mi air ionnsachadh: Tha arrays ceangail ann an AWK gu math èifeachdach.

Thuig mi gum b’ urrainn dhomh astaran nas àirde a choileanadh. Chuimhnich mi sin ann an dòigh iongantach Oideachadh AWK le Bruce Barnett Leugh mi mu dheidhinn feart fionnar ris an canar “arrays co-cheangailte" Gu bunaiteach, is e paidhrichean prìomh luach a tha seo, a bha airson adhbhar air choireigin air an ainmeachadh ann an dòigh eadar-dhealaichte ann an AWK, agus mar sin dòigh air choireigin cha do smaoinich mi mòran mun deidhinn. Cheplyaka Ròmanach Chuimhnich sinn gu bheil am facal “arrays associative” tòrr nas sine na am facal “paidhir prìomh luach”. Fiù ma tha thu coimhead suas an luach iuchrach ann an Google Ngram, chan fhaic thu an teirm seo ann, ach gheibh thu arrays co-cheangail! A bharrachd air an sin, mar as trice bidh am “paidhir prìomh luach” co-cheangailte ri stòran-dàta, agus mar sin tha e tòrr nas ciallaiche coimeas a dhèanamh eadar e agus hashmap. Thuig mi gum b’ urrainn dhomh na h-innealan ceangail sin a chleachdadh gus na SNPan agam a cheangal ri clàr biona agus dàta amh gun a bhith a’ cleachdadh Spark.

Gus seo a dhèanamh, ann an sgriobt AWK chleachd mi am bloca BEGIN. Is e seo pìos còd a thèid a chuir gu bàs mus tèid a’ chiad loidhne de dhàta a chuir gu prìomh bhuidheann an sgriobt.

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"
}

sgioba while(getline...) luchdaich a h-uile sreath bhon bhuidheann CSV (bin), suidhich a’ chiad cholbh (ainm SNP) mar an iuchair airson an t-sreath ceangail bin agus an dàrna luach (buidheann) mar an luach. An uairsin anns a 'bhloc { }, a thèid a chuir gu bàs air a h-uile loidhne den phrìomh fhaidhle, thèid gach loidhne a chuir chun fhaidhle toraidh, a gheibh ainm sònraichte a rèir a bhuidheann (bin): ..._bin_"bin[$1]"_....

Caochlaidhean batch_num и chunk_id maids an dàta a thug an loidhne-phìoban seachad, a’ seachnadh suidheachadh rèis, agus gach snàithlean cur gu bàs a’ ruith parallel, sgrìobh e dhan fhaidhle shònraichte aige fhèin.

Leis gun do sgap mi an dàta amh gu lèir a-steach do phasganan air cromosoman a bha air fhàgail bhon deuchainn a rinn mi roimhe le AWK, a-nis b’ urrainn dhomh sgriobt Bash eile a sgrìobhadh gus aon chromosome a phròiseasadh aig aon àm agus dàta dealaichte nas doimhne a chuir gu 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/*

Tha dà earrann anns an sgriobt parallel.

Anns a 'chiad earrainn, tha dàta air a leughadh bho gach faidhle anns a bheil fiosrachadh mun chromosome a tha thu ag iarraidh, agus an uairsin tha an dàta seo air a sgaoileadh thairis air snàithleanan, a bhios a' sgaoileadh na faidhlichean gu na buidhnean iomchaidh (bin). Gus suidheachadh rèis a sheachnadh nuair a sgrìobhas ioma-snàthainn chun an aon fhaidhle, bidh AWK a’ dol seachad air ainmean nam faidhlichean gus dàta a sgrìobhadh gu diofar àiteachan, m.e. chr_10_bin_52_batch_2_aa.csv. Mar thoradh air an sin, tha mòran fhaidhlichean beaga air an cruthachadh air an diosg (airson seo chleachd mi leabhraichean terabyte EBS).

Conveyor bhon dàrna earrann parallel a’ dol tro na buidhnean (bin) agus a’ cothlamadh na faidhlichean fa leth aca gu CSV c catagus an uairsin gan cur airson às-mhalairt.

Craoladh ann an R?

Dè tha mi air ionnsachadh: Faodaidh tu fios a chur stdin и stdout bho sgriobt R, agus mar sin cleachd e san loidhne-phìoban.

Is dòcha gun do mhothaich thu an loidhne seo anns an sgriobt Bash agad: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... Bidh e ag eadar-theangachadh a h-uile faidhle buidhne concatenated (bin) a-steach don sgriobt R gu h-ìosal. {} tha e na theicneòlas sònraichte parallel, a chuireas a-steach dàta sam bith a chuireas e chun t-sruth ainmichte gu dìreach a-steach don àithne fhèin. Roghainn {#} a’ toirt seachad ID snàthainn sònraichte, agus {%} a’ riochdachadh àireamh sliotan na h-obrach (air ath-aithris, ach gun a bhith aig an aon àm). Gheibhear liosta de na roghainnean uile ann an sgrìobhainnean.

#!/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
)

Nuair a bhios caochlaideach file("stdin") air a tharruing gu readr::read_csv, tha an dàta a chaidh eadar-theangachadh gu sgriobt R air a luchdachadh a-steach do fhrèam, a tha an uairsin san fhoirm .rds- faidhle a 'cleachdadh aws.s3 sgrìobhte gu dìreach gu S3.

Tha RDS rudeigin mar dhreach òigridh de Parquet, às aonais stòradh luchd-labhairt.

Às deidh dhomh an sgriobt Bash a chrìochnachadh fhuair mi pasgan .rds-files suidhichte ann an S3, a leig leam cleachdadh teannachaidh èifeachdach agus seòrsachan togte.

A dh'aindeoin cleachdadh breic R, dh'obraich a h-uile dad gu math luath. Chan eil e na iongnadh gu bheil na pàirtean de R a bhios a’ leughadh agus a’ sgrìobhadh dàta air an ùrachadh gu mòr. Às deidh deuchainn a dhèanamh air aon chromosome meadhanach mòr, chrìochnaich an obair air eisimpleir C5n.4xl ann an timcheall air dà uair a thìde.

S3 Crìochan

Dè tha mi air ionnsachadh: Taing gu buileachadh slighe glic, faodaidh S3 iomadh faidhle a làimhseachadh.

Bha dragh orm am biodh S3 comasach air an iomadh faidhle a chaidh a ghluasad thuige a làimhseachadh. B’ urrainn dhomh ainmean nam faidhle a dhèanamh ciallach, ach ciamar a bhiodh S3 a’ coimhead air an son?

A’ parsadh 25TB a’ cleachdadh AWK agus R
Tha pasganan ann an S3 dìreach airson an taisbeanadh, gu dearbh chan eil ùidh aig an t-siostam anns an t-samhla /. Bhon duilleag Ceistean Cumanta S3.

Tha e coltach gu bheil S3 a’ riochdachadh na slighe gu faidhle sònraichte mar iuchair shìmplidh ann an seòrsa de bhòrd hash no stòr-dàta stèidhichte air sgrìobhainnean. Faodar smaoineachadh air bucaid mar chlàr, agus faodar beachdachadh air faidhlichean mar chlàran sa chlàr sin.

Leis gu bheil astar agus èifeachdas cudromach airson prothaid a dhèanamh aig Amazon, chan eil e na iongnadh gu bheil an siostam slighe-iuchrach-mar-a-faidhle seo a’ freaking optimized. Dh'fheuch mi ri cothromachadh a lorg: gus nach fheumadh mi mòran iarrtasan fhaighinn, ach gun deach na h-iarrtasan a chuir gu bàs gu sgiobalta. Thionndaidh e a-mach gu bheil e nas fheàrr mu 20 mìle faidhle bin a dhèanamh. Tha mi a 'smaoineachadh ma chumas sinn oirnn a' dèanamh an fheum as fheàrr, is urrainn dhuinn àrdachadh ann an astar a choileanadh (mar eisimpleir, a 'dèanamh bucaid sònraichte dìreach airson dàta, agus mar sin a' lùghdachadh meud a 'chlàr sgrùdaidh). Ach cha robh ùine no airgead ann airson tuilleadh dheuchainnean.

Dè mu dheidhinn tar-fhreagarrachd?

Na dh ’ionnsaich mi: Is e prìomh adhbhar caitheamh ùine a bhith a’ dèanamh an fheum as fheàrr den dòigh stòraidh agad ro-ùine.

Aig an ìre seo, tha e glè chudromach faighneachd dhut fhèin: "Carson a chleachdas tu cruth faidhle seilbh?" Tha an adhbhar na laighe ann an astar luchdachadh (thug faidhlichean CSV gzipped 7 tursan nas fhaide airson an luchdachadh) agus co-chòrdalachd leis na sruthan obrach againn. Is dòcha gun dèan mi ath-bheachdachadh an urrainn dha R faidhlichean Parquet (no Arrow) a luchdachadh gu furasta às aonais an luchd Spark. Bidh a h-uile duine san obair-lann againn a’ cleachdadh R, agus ma dh’ fheumas mi an dàta a thionndadh gu cruth eile, tha an dàta teacsa tùsail agam fhathast, gus an urrainn dhomh an loidhne-phìoban a ruith a-rithist.

Roinn na h-obrach

Dè tha mi air ionnsachadh: Na feuch ri obraichean a bharrachadh le làimh, leig leis a’ choimpiutair a dhèanamh.

Tha mi air an sruth-obrach air aon chromosome a dhì-cheadachadh, a-nis feumaidh mi an dàta eile gu lèir a phròiseasadh.
Bha mi airson grunn shuidheachaidhean EC2 a thogail airson tionndadh, ach aig an aon àm bha eagal orm a bhith a 'faighinn luchd gu math mì-chothromach thairis air diofar obraichean giullachd (dìreach mar a dh'fhuiling Spark bho sgaradh neo-chothromach). A bharrachd air an sin, cha robh ùidh agam ann a bhith ag àrdachadh aon eisimpleir airson gach cromosome, oir airson cunntasan AWS tha crìoch bunaiteach de 10 cùisean.

An uairsin chuir mi romhpa sgriobt a sgrìobhadh ann an R gus obraichean giullachd a bharrachadh.

An toiseach, dh’ iarr mi air S3 obrachadh a-mach cia mheud àite stòraidh a bha anns gach cromosome.

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

An uairsin sgrìobh mi gnìomh a bheir am meud iomlan, a ghluaiseas òrdugh nan cromosoma, gan roinn ann am buidhnean num_jobs agus ag innse dhut cho eadar-dhealaichte 'sa tha meudan obraichean giullachd.

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]>

An uairsin ruith mi tro mhìle shuffles a’ cleachdadh purrr agus thagh mi an fheadhainn as fheàrr.

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

Mar sin chrìochnaich mi le seata de ghnìomhan a bha glè choltach ann am meud. An uairsin cha robh air fhàgail ach an sgriobt Bash a bh’ agam roimhe a phasgadh ann an lùb mhòr for. Thug an optimization seo timcheall air 10 mionaidean airson sgrìobhadh. Agus tha seo tòrr nas lugha na bhithinn a’ cosg air gnìomhan a chruthachadh le làimh nam biodh iad mì-chothromach. Mar sin, tha mi a’ smaoineachadh gu robh mi ceart leis an optimization tòiseachaidh seo.

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

Aig an deireadh cuiridh mi an òrdugh dùnadh:

sudo shutdown -h now

... agus dh'obraich a h-uile càil a-mach! A’ cleachdadh an AWS CLI, thog mi eisimpleirean a’ cleachdadh an roghainn user_data thug e dhaibh sgriobtaichean Bash de na gnìomhan aca airson an giullachd. Ruith iad agus dhùin iad gu fèin-ghluasadach, agus mar sin cha robh mi a 'pàigheadh ​​​​airson cumhachd giollachd a bharrachd.

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

Pacaidh sinn!

Dè tha mi air ionnsachadh: Bu chòir don API a bhith sìmplidh airson adhbhar furasta agus sùbailteachd cleachdaidh.

Mu dheireadh fhuair mi an dàta san àite cheart agus san fhoirm cheart. Cha robh air fhàgail ach am pròiseas cleachdadh dàta a dhèanamh nas sìmplidhe cho mòr 'sa ghabhas gus a dhèanamh nas fhasa dha mo cho-obraichean. Bha mi airson API sìmplidh a dhèanamh airson iarrtasan a chruthachadh. Ma cho-dhùnas mi san àm ri teachd gluasad bho .rds gu faidhlichean Parquet, an uairsin bu chòir seo a bhith na dhuilgheadas dhomh, chan ann dha mo cho-obraichean. Airson seo cho-dhùin mi pasgan R a-staigh a dhèanamh.

Tog agus clàraich pasgan gu math sìmplidh anns a bheil dìreach beagan ghnìomhan ruigsinneachd dàta air an eagrachadh timcheall air gnìomh get_snp. Rinn mi làrach-lìn cuideachd dha mo cho-obraichean pkg sìos, gus am faic iad eisimpleirean agus sgrìobhainnean gu furasta.

A’ parsadh 25TB a’ cleachdadh AWK agus R

Tasgadh glic

Dè tha mi air ionnsachadh: Ma tha an dàta agad air ullachadh gu math, bidh e furasta caching!

Leis gun do chuir aon de na prìomh shruthan-obrach an aon mhodail sgrùdaidh an sàs ann am pasgan SNP, chuir mi romham binning a chleachdadh airson mo bhuannachd. Nuair a bhios tu a’ sgaoileadh dàta tro SNP, tha a h-uile fiosrachadh bhon bhuidheann (bin) ceangailte ris an nì a chaidh a thilleadh. Is e sin, faodaidh seann cheistean (ann an teòiridh) pròiseas cheistean ùra a luathachadh.

# 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
  }
...

Nuair a bha mi a’ togail a’ phacaid, ruith mi mòran shlatan-tomhais gus coimeas a dhèanamh eadar astar nuair a bha mi a’ cleachdadh diofar dhòighean. Tha mi a 'moladh gun a bhith a' dearmad seo, oir uaireannan tha na toraidhean ris nach robh dùil. Mar eisimpleir, dplyr::filter bha e fada nas luaithe na bhith a’ glacadh sreathan a’ cleachdadh sìoladh stèidhichte air clàr-amais, agus bha e a’ faighinn aon cholbh air ais bho fhrèam dàta sìoltachaidh fada nas luaithe na bhith a’ cleachdadh co-chòrdadh clàr-amais.

Thoir an aire gu bheil an nì prev_snp_results tha an iuchair ann snps_in_bin. Seo taghadh de gach SNP sònraichte ann am buidheann (bin), a’ toirt cothrom dhut dearbhadh gu sgiobalta a bheil dàta agad bho cheist roimhe seo. Tha e cuideachd ga dhèanamh furasta a dhol tro na SNPan gu lèir ann am buidheann (bin) leis a’ chòd seo:

# 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 
}

Toraidhean

A-nis is urrainn dhuinn (agus tha sinn air tòiseachadh gu mòr) modalan agus suidheachaidhean a ruith nach robh ruigsinneach dhuinn roimhe seo. Is e an rud as fheàrr nach fheum mo cho-obraichean obair-lann smaoineachadh air duilgheadasan sam bith. Tha dìreach gnìomh aca a tha ag obair.

Agus ged a tha am pasgan a’ toirt seachad am mion-fhiosrachadh dhaibh, dh’ fheuch mi ri cruth an dàta a dhèanamh sìmplidh gu leòr gus am b’ urrainn dhaibh obrachadh a-mach nan fhalbh mi gu h-obann a-màireach...

Tha an astar air àrdachadh gu mòr. Mar as trice bidh sinn a’ sganadh mìrean genoma a tha cudromach gu gnìomh. Roimhe sin, cha b 'urrainn dhuinn seo a dhèanamh (bha e ro dhaor), ach a-nis, le taing don structar buidhne (bin) agus an tasgadh, bidh iarrtas airson aon SNP a' toirt nas lugha na 0,1 diogan gu cuibheasach, agus tha cleachdadh an dàta mar sin. ìosal gu bheil na cosgaisean airson S3 nan cnòthan.

co-dhùnadh

Chan eil an artaigil seo na stiùireadh idir. Thàinig am fuasgladh gu bhith na neach fa leth, agus cha mhòr gu cinnteach cha robh e cho math. An àite sin, is e turas-siubhail a th’ ann. Tha mi airson gum bi daoine eile a 'tuigsinn nach eil co-dhùnaidhean mar sin a' nochdadh gu h-iomlan anns a 'cheann, tha iad mar thoradh air deuchainn agus mearachd. Cuideachd, ma tha thu a’ coimhead airson neach-saidheans dàta, cumaibh cuimhne gu bheil feum air eòlas air na h-innealan sin gu h-èifeachdach, agus gu bheil eòlas a’ cosg airgead. Tha mi toilichte gun robh na dòighean agam pàigheadh, ach cha bhi cothrom aig mòran eile as urrainn an aon obair a dhèanamh nas fheàrr na mise air sgàth dìth airgid eadhon feuchainn.

Tha innealan dàta mòr sùbailte. Ma tha an ùine agad, cha mhòr gu cinnteach faodaidh tu fuasgladh nas luaithe a sgrìobhadh a’ cleachdadh dòighean glanadh dàta, stòradh agus às-tharraing. Aig a’ cheann thall thig e sìos gu mion-sgrùdadh cosgais-buannachd.

Na dh'ionnsaich mi:

  • chan eil dòigh saor ann airson 25 TB a pharsadh aig an aon àm;
  • bi faiceallach le meud nam faidhlichean Parquet agad agus am buidheann;
  • Feumaidh pàirtean ann an Spark a bhith cothromach;
  • San fharsaingeachd, na feuch ri 2,5 millean sgaradh a dhèanamh;
  • Tha an rèiteachadh fhathast duilich, mar a tha stèidheachadh Spark;
  • uaireannan feumaidh dàta sònraichte fuasglaidhean sònraichte;
  • Tha cruinneachadh sradag luath, ach tha sgaradh fhathast daor;
  • na bi a’ cadal nuair a bhios iad a’ teagasg na bunaitean dhut, is dòcha gu bheil cuideigin air do dhuilgheadas fhuasgladh air ais anns na 1980n;
  • gnu parallel - is e rud draoidheil a tha seo, bu chòir dha a h-uile duine a chleachdadh;
  • Is toil le Spark dàta neo-bhrùichte agus cha toil leis a bhith a’ cothlamadh sgaraidhean còmhla;
  • Tha cus os cionn aig Spark nuair a bhios e a’ fuasgladh cheistean sìmplidh;
  • Tha arrays co-cheangail AWK glè èifeachdach;
  • faodaidh tu fios a chuir stdin и stdout bho sgriobt R, agus mar sin cleachd e san loidhne-phìoban;
  • Taing do bhuileachadh slighe snasail, faodaidh S3 mòran fhaidhlichean a phròiseasadh;
  • Is e am prìomh adhbhar airson a bhith a’ caitheamh ùine ro-luath an dòigh stòraidh agad a bharrachadh;
  • na feuch ris na gnìomhan as fheàrr a dhèanamh le làimh, leig leis a’ choimpiutair a dhèanamh;
  • Bu chòir don API a bhith sìmplidh airson a bhith furasta agus sùbailteachd cleachdaidh;
  • Ma tha an dàta agad air ullachadh gu math, bidh e furasta tasgadh a dhèanamh!

Source: www.habr.com

Cuir beachd ann