Fizarana 25TB mampiasa AWK sy R

Fizarana 25TB mampiasa AWK sy R
Ahoana ny famakiana ity lahatsoratra ity: Miala tsiny aho fa lava sy mikorontana ny lahatsoratra. Mba hitsitsiana fotoana anao dia atomboko amin'ny teny fampidirana “Ny zavatra nianarako” ny toko tsirairay, izay mamintina ny votoatin'ilay toko ao anatin'ny fehezanteny iray na roa.

“Asehoy ahy fotsiny ny vahaolana!” Raha te-hahita fotsiny hoe avy aiza aho, dia mitsambikina mankany amin'ny toko "Manjary Mamorona bebe kokoa", fa heveriko fa mahaliana sy mahasoa kokoa ny mamaky momba ny tsy fahombiazana.

Vao haingana aho no nasaina nanangana dingana iray amin'ny fanodinana ny filaharan'ny ADN manta betsaka (saika SNP ara-teknika). Ny nilaina dia ny fahazoana angon-drakitra haingana momba ny toerana misy fototarazo (antsoina hoe SNP) ho an'ny modely manaraka sy ny asa hafa. Tamin'ny fampiasana R sy AWK dia afaka nanadio sy nandamina ny angona tamin'ny fomba voajanahary aho, nanafaingana be ny fanodinana fanontaniana. Tsy mora tamiko izany ary nitaky fanavaozana maro. Ity lahatsoratra ity dia hanampy anao hisoroka ny sasany amin'ireo fahadisoako ary hampiseho aminao izay niafarako.

Voalohany, fanazavana fampidirana sasany.

tahirin-kevitra

Ny foibem-pikarakarana ny vaovao momba ny fototarazo ao amin'ny anjerimanontolo dia nanome anay angona amin'ny endrika TSV 25 TB. Noraisiko nizara ho fonosana 5 izy ireo, nopotehin'ny Gzip, izay misy rakitra 240 efatra gigabyte eo ho eo. Ny andalana tsirairay dia misy angona ho an'ny SNP iray avy amin'ny olona iray. Raha atambatra, ny angon-drakitra momba ny ~ 2,5 tapitrisa SNPs ary ~ 60 arivo ny olona nafindra. Ho fanampin'ny fampahalalam-baovao SNP, misy tsanganana maro miaraka amin'ny isa maneho ny toetra isan-karazany ny rakitra, toy ny hamakin'ny famakiana, ny fatran'ny alleles samihafa, sns. Raha atambatra dia nisy tsanganana 30 teo ho eo izay manana sanda miavaka.

tanjona

Tahaka ny amin'ny tetikasa fitantanana data rehetra, ny zava-dehibe indrindra dia ny famaritana ny fomba hampiasana ny data. Raha izany dia hifidy modely sy workflows ho an'ny SNP mifototra amin'ny SNP izahay. Izany hoe, angona amin'ny SNP iray ihany no ilainay. Tsy maintsy nianatra ny fomba fakana ireo rakitsoratra rehetra mifandray amin'ny iray amin'ireo SNP 2,5 tapitrisa amin'ny fomba mora, haingana ary mora araka izay azo atao aho.

Ahoana no tsy hanaovana izany

Hanonona teny cliché mety:

Tsy diso in-arivo aho, vao nahita fomba an'arivony hialana amin'ny fanaparitahana angon-drakitra amin'ny endrika mety amin'ny fanontaniana.

Andrana voalohany

Inona no nianarako: Tsy misy fomba mora ahafahana mamadika 25 TB indray mandeha.

Rehefa avy nandray ny taranja "Fomba mandroso ho an'ny fanodinana angona lehibe" tao amin'ny Oniversite Vanderbilt aho, dia azoko antoka fa tao anaty kitapo ilay fika. Mety haharitra adiny iray na roa ny fametrahana ny mpizara Hive mba hampandehanana ny angon-drakitra rehetra sy hitaterana ny valiny. Koa satria voatahiry ao amin'ny AWS S3 ny angonay, dia nampiasa ny serivisy aho Athena, izay ahafahanao mampihatra ny fangatahana Hive SQL amin'ny angona S3. Tsy mila manangana / manangana cluster Hive ianao, ary mandoa ihany koa ny angona tadiavinao.

Taorian'ny nanehoako an'i Athena ny angonako sy ny endriny, dia nanao fitsapana sasany aho tamin'ny fanontaniana toy izao:

select * from intensityData limit 10;

Ary haingana nahazo vokatra tsara rafitra. Vonona.

Mandra-panandramanay hampiasa ny angona amin'ny asanay...

Nasaina nanala ny fampahalalana SNP rehetra aho mba hitsapana ny modely. Nametraka fanontaniana aho:


select * from intensityData 
where snp = 'rs123456';

...ary nanomboka niandry. Rehefa afaka valo minitra sy mihoatra ny 4 TB ny angon-drakitra nangatahana dia azoko ny valiny. Athena dia miampanga amin'ny habetsahan'ny angona hita, $5 isaky ny terabyte. Ka io fangatahana tokana io dia mitentina 20 dolara sy fiandrasana valo minitra. Mba hampandehanana ny maodely amin'ny angon-drakitra rehetra dia tsy maintsy niandry 38 taona izahay ary nandoa $ 50 tapitrisa. Mazava ho azy fa tsy mety aminay izany.

Ilaina ny mampiasa parquet ...

Inona no nianarako: Mitandrema amin'ny haben'ny rakitra Parqueto sy ny fandaminana azy.

Nanandrana nanamboatra ny toe-javatra aho tamin'ny alàlan'ny famadihana ny TSV rehetra ho Parquet rakitra. Izy ireo dia mety amin'ny fiaraha-miasa amin'ny angon-drakitra lehibe satria ny fampahalalana ao anatiny dia voatahiry amin'ny endrika tsanganana: ny tsanganana tsirairay dia mipetraka ao amin'ny sehatra fitadidiana/kapilany manokana, mifanohitra amin'ny rakitra lahatsoratra, izay misy andalana misy singa isaky ny tsanganana. Ary raha mila mitady zavatra ianao, dia vakio fotsiny ny tsanganana ilaina. Fanampin'izany, ny rakitra tsirairay dia mitahiry sanda isan-karazany ao anaty tsanganana, ka raha tsy ao anatin'ny salan'ny tsanganana ny sanda tadiavinao, dia tsy handany fotoana hijerena ny rakitra manontolo ny Spark.

Nanao asa tsotra aho Lakaoly AWS hanova ny TSV-nay ho Parquet ary nandatsaka ireo rakitra vaovao ho Athena. Naharitra 5 ora teo ho eo izany. Saingy rehefa nihazakazaka ny fangatahana aho dia nitovy ny fotoana sy ny vola kely vao vita. Ny zava-misy dia i Spark, miezaka manatsara ny asa, dia nesorina fotsiny ny ampahany TSV iray ary napetrany tao amin'ny parquet manokana. Ary noho ny haben'ny ampahany tsirairay dia ampy ahitana ny firaketana an-tsoratra manontolon'ny olona maro, ny rakitra tsirairay dia nahitana ny SNPs rehetra, ka tsy maintsy nanokatra ny rakitra rehetra i Spark mba haka ny fampahalalana ilainy.

Mahaliana fa tsy azo zaraina ny karazana famandrihan'ny Parquet (sy soso-kevitra), snappy. Noho izany, ny mpanatanteraka tsirairay dia nifikitra tamin'ny asa fanokafana sy fampidinana ny angona feno 3,5 GB.

Fizarana 25TB mampiasa AWK sy R

Andeha hojerentsika ny olana

Inona no nianarako: Sarotra ny fanasokajiana, indrindra raha zaraina ny angona.

Toa takatro izao ny fototry ny olana. Ny angon-drakitra ihany no nila nalahatra tamin'ny tsanganana SNP, fa tsy tamin'ny olona. Avy eo dia SNP maromaro no hotehirizina ao anaty sombin-drakitra misaraka, ary avy eo ny fiasa "smart" an'i Parquet "misokatra raha tsy eo amin'ny sandany" dia hiseho amin'ny voninahiny rehetra. Indrisy anefa fa asa sarotra ny fanasokajiana andalana an'arivo tapitrisany maro miparitaka manerana ny cluster.

Tena tsy te hamoaka tamberim-bidy ny AWS noho ny antony "Mianatra variana aho". Rehefa avy nihazakazaka nanasokajy tao amin'ny Amazon Glue aho dia nandeha nandritra ny 2 andro ary nianjera.

Ahoana ny amin'ny fisarahana?

Inona no nianarako: Tsy maintsy mifandanja ny fisarahana ao amin'ny Spark.

Avy eo dia tonga tamin'ny hevitra momba ny fizarana data amin'ny chromosomes aho. Misy 23 amin'izy ireo (ary maromaro kokoa raha raisinao ny ADN mitochondrial sy ny faritra tsy voatanisa).
Izany dia ahafahanao mizara ny angona ho ampahany kely kokoa. Raha manampy andalana iray monja amin'ny asa fanondranana Spark ao amin'ny script Glue ianao partition_by = "chr", dia tokony hozaraina ho siny ny angona.

Fizarana 25TB mampiasa AWK sy R
Ny génome dia ahitana sombin-javatra maro antsoina hoe chromosomes.

Indrisy anefa fa tsy nety izany. Ny krômôzôma dia manana habe samihafa, izay midika fa isan-karazany ny fampahalalana. Midika izany fa ny asa nalefan'i Spark ho an'ny mpiasa dia tsy voalanjalanja ary vita moramora satria ny node sasany dia vita aloha ary tsy miasa. Vita anefa ny asa. Saingy rehefa nangataka SNP iray dia niteraka olana indray ny tsy fifandanjana. Ny vidin'ny fanodinana SNP amin'ny krômôzôma lehibe kokoa (izany hoe, izay tiantsika hahazoana data) dia nihena 10 teo ho eo. Be dia be fa tsy ampy.

Ahoana raha zaraina ho ampahany kely kokoa izy io?

Inona no nianarako: Aza manandrana manao partitions 2,5 tapitrisa mihitsy.

Nanapa-kevitra ny handeha aho ary hizara ny SNP tsirairay. Izany dia niantoka fa mitovy habe ny partitions. HEVITRA RATSY IO. Nampiasa Glue aho ary nanampy tsipika tsy manan-tsiny partition_by = 'snp'. Nanomboka ny asa ary nanomboka ny fanatanterahana. Indray andro taty aoriana dia nijery aho ary hitako fa mbola tsy nisy na inona na inona voasoratra ho an'ny S3, ka dia novonoiny ilay asa. Toa nanoratra rakitra mpanelanelana amin'ny toerana miafina ao amin'ny S3 i Glue, rakitra be dia be, mety ho roa tapitrisa. Vokatr'izany dia nitentina arivo dolara mahery ny fahadisoako ary tsy nahafaly ny mpanoro hevitra ahy.

Fizarana + fanasokajiana

Inona no nianarako: Mbola sarotra ny fanasokajiana, toy ny fanamafisam-peo Spark.

Ny ezaka farany nataoko tamin'ny fizarazarana dia ny fizarana ny krômôzôma ary avy eo ny fizarana tsirairay. Amin'ny teoria dia hanafaingana ny fangatahana tsirairay izany satria ny angon-drakitra SNP tadiavina dia tsy maintsy ao anatin'ny tapa-parquet vitsivitsy ao anatin'ny faritra iray. Indrisy anefa fa sarotra ny manara-maso na dia ny angon-drakitra voazara aza. Vokatr'izany dia nifindra tany amin'ny EMR ho an'ny cluster manokana aho ary nampiasa tranga mahery valo (C5.4xl) sy Sparklyr mba hamoronana workflow mora kokoa...

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

...mbola tsy vita anefa ny asa. Namboariko tamin'ny fomba samihafa izy io: nampitombo ny fizarana fahatsiarovana ho an'ny mpanatanteraka fanontaniana tsirairay, nampiasa nodes misy fahatsiarovana be dia be, nampiasa fari-pahalalana fampielezam-peo (varimbazaha fampielezam-peo), saingy isaky ny nivadika ho antsasaky ny fepetra izany, ary nanomboka tsikelikely ny mpanatanteraka. tsy hahomby mandra-pahatongan'ny zava-drehetra.

Lasa mamorona kokoa aho

Inona no nianarako: Indraindray ny angona manokana dia mitaky vahaolana manokana.

Ny SNP tsirairay dia manana sanda toerana. Izany dia isa mifanitsy amin'ny isan'ny fototra manaraka ny chromosome. Ity dia fomba tsara sy voajanahary handaminana ny angonay. Tamin'ny voalohany dia te-hizara amin'ny faritry ny krômôzôma tsirairay aho. Ohatra, toerana 1 - 2000, 2001 - 4000, sns. Saingy ny olana dia ny SNP dia tsy mizara mitovy amin'ny chromosomes, noho izany dia hiovaova be ny haben'ny vondrona.

Fizarana 25TB mampiasa AWK sy R

Vokatr'izany dia nizarazara ny toerana aho ho sokajy (laharana). Tamin'ny fampiasana ny angon-drakitra efa nalaina dia nanao fangatahana aho mba hahazoana lisitr'ireo SNP tsy manam-paharoa, ny toerany ary ny krômôzôma. Avy eo dia nalahatra ny angon-drakitra tao anatin'ny krômôzôma tsirairay aho ary nanangona SNP ho vondrona (biby) misy habe iray. Aoka hatao hoe 1000 SNPs tsirairay avy. Izany dia nanome ahy ny fifandraisana SNP-to-group-per-chromosome.

Tamin'ny farany dia nanao vondrona (bin) misy SNP 75 aho, hazavaina eto ambany ny antony.

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

Andrana voalohany amin'ny Spark

Inona no nianarako: Haingana ny fivondronan'ny spark, fa mbola lafo ny fisarahana.

Te hamaky ity rafitra angona kely (2,5 tapitrisa andalana) ity ao amin'ny Spark aho, ampifandraiso amin'ny angon-drakitra manta, ary zarao amin'ny tsanganana vao nampidirina. 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')
  )

nampiasako sdf_broadcast(), noho izany dia fantatr'i Spark fa tokony handefa ny rafitra angon-drakitra amin'ny nodes rehetra. Tena ilaina izany raha kely ny haben'ny angona ary ilaina amin'ny asa rehetra. Raha tsy izany, miezaka ny ho hendry i Spark ary mizara angon-drakitra araka izay ilaina, izay mety hiteraka fihemorana.

Ary indray, tsy nahomby ny hevitro: niasa nandritra ny fotoana kelikely ny asa, nahavita ny sendikà, ary avy eo, toy ny mpanatanteraka natomboka tamin'ny fisarahana, dia nanomboka tsy nahomby izy ireo.

Manampy AWK

Inona no nianarako: Aza matory rehefa ampianarina ny fototra. Azo antoka fa efa nisy namaha ny olanao tamin'ny taona 1980.

Hatramin'io fotoana io, ny anton'ny tsy fahombiazan'ny Spark dia ny fikorontanan'ny angon-drakitra ao amin'ny cluster. Angamba azo hatsaraina amin'ny fitsaboana mialoha ny toe-javatra. Nanapa-kevitra ny hanandrana hanasaraka ny angona lahatsoratra manta ho tsanganana misy krômôzôma aho, ka nanantena ny hanome an'i Spark miaraka amin'ny angon-drakitra "nozaraina mialoha".

Nikaroka tao amin'ny StackOverflow aho momba ny fomba fisarahana amin'ny sandan'ny tsanganana ary hita valiny lehibe toy izany. Miaraka amin'ny AWK ianao dia afaka mizara rakitra lahatsoratra amin'ny sandan'ny tsanganana amin'ny fanoratana azy amin'ny script fa tsy mandefa ny valiny any stdout.

Nanoratra script Bash aho hanandrana azy. Nalaina ny iray amin'ireo TSV voafono, avy eo novahany tamin'ny fampiasana gzip ary nalefa tany awk.

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

Nandaitra!

Famenoana ny cores

Inona no nianarako: gnu parallel - zavatra mahagaga izany, tokony hampiasa izany ny rehetra.

Tena niadana ny fisarahana ary rehefa nanomboka aho htopraha hijery ny fampiasana ohatra EC2 mahery (sy lafo) dia hita fa tsy nampiasa afa-tsy fototra iray aho ary fahatsiarovana 200 MB eo ho eo. Mba hamahana ny olana sy tsy ho very vola be dia tsy maintsy nieritreritra ny fomba hampitoviana ny asa. Soa ihany fa ao anaty boky tena mahagaga Data Science ao amin'ny Command Line Nahita toko iray nosoratan'i Jeron Janssens momba ny fampitoviana aho. Avy amin'izany no nianarako gnu parallel, fomba tena mora azo amin'ny fampiharana multithreading ao amin'ny Unix.

Fizarana 25TB mampiasa AWK sy R
Rehefa nanomboka ny fisarahana tamin'ny fampiasana ny dingana vaovao aho, dia tsara daholo ny zava-drehetra, saingy mbola nisy ny bottleneck - ny fampidinana ny zavatra S3 amin'ny kapila dia tsy dia haingana ary tsy mifanaraka tanteraka. Mba hamahana izany dia nanao izao aho:

  1. Hitako fa azo atao ny mampihatra mivantana ny dingana fampidinana S3 amin'ny fantsona, manafoana tanteraka ny fitahirizana mpanelanelana amin'ny kapila. Midika izany fa afaka misoroka ny fanoratana angona manta amin'ny kapila aho ary mampiasa fitahirizana kely kokoa, ary noho izany dia mora kokoa amin'ny AWS.
  2. ekipa aws configure set default.s3.max_concurrent_requests 50 nampitombo be ny isan'ny kofehy ampiasain'ny AWS CLI (amin'ny alàlan'ny default dia misy 10).
  3. Nifindra tamina ohatra EC2 natao ho an'ny hafainganan'ny tambajotra aho, miaraka amin'ny litera n amin'ny anarana. Hitako fa ny fahaverezan'ny herin'ny fanodinana rehefa mampiasa n-instance dia mihoatra noho ny fanonerana ny fitomboan'ny hafainganam-pandeha. Ho an'ny ankamaroan'ny asa dia nampiasa c5n.4xl aho.
  4. nanova gzip amin'ny pigz, ity dia fitaovana gzip afaka manao zavatra mangatsiatsiaka mba hampitoviana ny asa tsy mitovy amin'ny voalohany amin'ny famongorana ny rakitra (nampiana kely indrindra izany).

# 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

Ireo dingana ireo dia mifamatotra mba hahatonga ny zava-drehetra ho haingana dia haingana. Amin'ny fampitomboana ny hafainganan'ny fampidinana sy ny fanafoanana ny fanoratana kapila, afaka manodina fonosana 5 terabyte aho ao anatin'ny ora vitsivitsy.

Tokony ho niresaka 'TSV' ity sioka ity. Indrisy.

Mampiasa angona vao nozaraina

Inona no nianarako: Tian'i Spark ny angona tsy voatsindry ary tsy tia manambatra fizarazarana.

Ankehitriny ny angon-drakitra dia ao amin'ny S3 amin'ny endrika tsy voafono (vakio: zaraina) ary semi-baiko, ary afaka niverina tany Spark indray aho. Nisy tsy ampoizina niandry ahy: tsy nahatanteraka izay niriko indray aho! Sarotra be ny nilaza tamin'i Spark ny fomba nizarana ny angon-drakitra. Ary na dia nanao izany aza aho dia hita fa be loatra ny partitions (95 arivo), ary rehefa nampiasa aho coalesce nampihena ny isan'izy ireo ho amin'ny fetra ara-drariny, nanimba ny fisarahanako izany. Azoko antoka fa azo amboarina izany, saingy taorian'ny roa andro nikarohana dia tsy nahita vahaolana aho. Vitako tamin'ny farany ny asa rehetra tao amin'ny Spark, na dia elaela aza ary tsy dia kely loatra ny rakitra Parquet (~200 KB). Na izany aza, ny angon-drakitra dia tany amin'ny toerana nilaina azy.

Fizarana 25TB mampiasa AWK sy R
Kely loatra sy tsy mitovy, mahafinaritra!

Fanandramana fanontaniana Spark eo an-toerana

Inona no nianarako: Be dia be ny Spark rehefa mamaha olana tsotra.

Tamin'ny alàlan'ny fampidinana ny angon-drakitra amin'ny endrika marani-tsaina dia afaka nanandrana ny hafainganam-pandeha aho. Manangana script R mba hampandehanana mpizara Spark eo an-toerana, ary ampidiro ny rafitra angon-drakitra Spark avy amin'ny fitahirizana vondrona Parquet voatondro (bin). Niezaka nampiditra ny angon-drakitra rehetra aho fa tsy azon'i Sparklyr hamantatra ny fisarahana.

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)

Naharitra 29,415 segondra ny famonoana. Tsara kokoa, saingy tsy dia tsara loatra amin'ny fitiliana faobe na inona na inona. Fanampin'izay, tsy afaka nanafaingana ny zava-drehetra aho tamin'ny caching satria rehefa nanandrana nanangona rafitra angon-drakitra tao amin'ny fitadidiana aho, dia nianjera foana i Spark, na dia nanome fahatsiarovana mihoatra ny 50 GB aza aho ho an'ny angona iray izay milanja latsaky ny 15.

Hiverina any amin'ny AWK

Inona no nianarako: Tena mahomby ny laharan'ny associative ao amin'ny AWK.

Tsapako fa afaka mahazo hafainganam-pandeha ambony kokoa aho. Tsaroako izany tamin'ny mahafinaritra Tutorial AWK nataon'i Bruce Barnett Namaky momba ny endri-javatra mahafinaritra iray antsoina hoe “arrays mifandray" Amin'ny ankapobeny, ireo dia mpivady manan-danja, izay noho ny antony hafa dia nantsoina tamin'ny fomba hafa tao amin'ny AWK, ary noho izany dia tsy nieritreritra firy momba azy ireo aho. Roman Cheplyaka Nampahatsiahy fa ny teny hoe "arrays associative" dia tranainy lavitra noho ny teny hoe "pair key-value". Na ianao aza jereo ny sanda fototra ao amin'ny Google Ngram, tsy ho hitanao eo io teny io, fa hahita array mifandray ianao! Fanampin'izany, ny "paoron'ny sanda manan-danja" dia matetika mifandray amin'ny angon-drakitra, noho izany dia misy dikany kokoa ny mampitaha azy amin'ny hashmap. Tsapako fa azoko ampiasaina ireo arrays associative ireo mba hampifandray ny SNP-ko amin'ny latabatra bin sy data manta tsy mampiasa Spark.

Mba hanaovana izany, tao amin'ny script AWK no nampiasako ilay sakana BEGIN. Ity dia sombin-kaody izay tanterahina alohan'ny handefasana ny andalana voalohany amin'ny angon-drakitra amin'ny vatan'ny script.

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

ekipa while(getline...) nampiditra ny andalana rehetra avy amin'ny vondrona CSV (bin), apetraho ny tsanganana voalohany (anaran'ny SNP) ho fanalahidin'ny laharan'ny associative. bin ary ny sanda faharoa (vondrona) ho sandany. Avy eo amin'ny sakana { }, izay tanterahina amin'ny andalana rehetra amin'ny rakitra lehibe, ny andalana tsirairay dia alefa any amin'ny rakitra mivoaka, izay mahazo anarana tokana miankina amin'ny vondrona misy azy (bin): ..._bin_"bin[$1]"_....

hiovaova batch_num и chunk_id nifanaraka tamin'ny angon-drakitra nomen'ny fantsona, misoroka ny fepetran'ny hazakazaka, ary mihazakazaka ny kofehy famonoana tsirairay parallel, nanoratra tamin'ny rakitra manokana.

Koa satria naparitako tao anaty lahatahiry misy krômôzôma sisa tavela tamin'ny fanandramana nataoko tamin'ny AWK teo aloha ny angon-drakitra manta rehetra, dia afaka manoratra script Bash hafa aho mba handrafetana krômôzôma iray amin'ny fotoana iray ary handefa angon-drakitra voazara lalindalina kokoa amin'ny 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/*

Misy fizarana roa ny script parallel.

Ao amin'ny fizarana voalohany, ny angon-drakitra dia vakiana avy amin'ny rakitra rehetra misy fampahalalana momba ny krômôzôma irina, avy eo dia zaraina amin'ny kofehy ity data ity, izay mizara ireo rakitra ao amin'ny vondrona mety (bin). Mba hialana amin'ny toetry ny hazakazaka rehefa manoratra amin'ny rakitra iray ny kofehy maromaro, ny AWK dia mandefa ny anaran'ny rakitra hanoratana angona any amin'ny toerana samihafa, ohatra. chr_10_bin_52_batch_2_aa.csv. Vokatr'izany dia maro ny rakitra kely noforonina ao amin'ny kapila (ho an'izany dia nampiasa ny volume EBS terabyte aho).

Conveyor avy amin'ny fizarana faharoa parallel mandeha amin'ny vondrona (bin) ary manambatra ny rakitra tsirairay ho CSV mahazatra c catary avy eo dia mandefa azy ireo ho aondrana.

Fandefasana amin'ny R?

Inona no nianarako: Afaka mifandray ianao stdin и stdout avy amin'ny script R, ary noho izany dia ampiasao amin'ny fantsona.

Mety ho nahatsikaritra ity andalana ity ianao tao amin'ny script Bash anao: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... Izy io dia mandika ny rakitra vondrona (bin) rehetra mifandray amin'ny script R etsy ambany. {} dia teknika manokana parallel, izay mampiditra ny angona rehetra alefany any amin'ny stream voafaritra mivantana ao amin'ny baiko. SAFIDY {#} manome ID kofehy tokana, ary {%} maneho ny laharan'ny toeran'ny asa (miverimberina, fa tsy miaraka mihitsy). Ny lisitry ny safidy rehetra dia azo jerena ao antontan-taratasy.

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

Rehefa variana file("stdin") ampitaina amin'ny readr::read_csv, ny angon-drakitra voadika amin'ny script R dia ampidirina ao anaty frame, izay avy eo amin'ny endrika .rds- rakitra mampiasa aws.s3 voasoratra mivantana amin'ny S3.

Ny RDS dia toy ny dikan-teny zandriny amin'ny Parquet, tsy misy fitehirizana fanamafisam-peo.

Rehefa vita ny script Bash dia nahazo amboara iray aho .rds-rakitra hita ao amin'ny S3, izay nahafahako nampiasa ny famatrarana mahomby sy ny karazana namboarina.

Na dia teo aza ny fampiasana ny frein R, dia niasa haingana ny zava-drehetra. Tsy mahagaga raha tsara indrindra ny ampahany amin'ny R izay mamaky sy manoratra angona. Taorian'ny fitiliana ny krômôzôma salantsalany iray, dia vita tamin'ny ohatra C5n.4xl ny asa tao anatin'ny adiny roa teo ho eo.

S3 fetra

Inona no nianarako: Noho ny fampiharana lalan-tsaina, ny S3 dia afaka mitantana rakitra maro.

Nanahy aho raha ho afaka mitantana ireo rakitra marobe nafindra tany amin'izany ny S3. Azoko atao ny mampitovy ny anaran'ny rakitra, fa ahoana no hikarohana azy ireo ny S3?

Fizarana 25TB mampiasa AWK sy R
Ny lahatahiry ao amin'ny S3 dia natao ho fampisehoana fotsiny, raha ny marina dia tsy liana amin'ny marika ny rafitra /. Avy amin'ny pejy S3 FAQ.

Hita fa ny S3 dia maneho ny lalana mankany amin'ny rakitra iray ho toy ny fanalahidy tsotra amin'ny karazana latabatra hash na angon-drakitra mifototra amin'ny antontan-taratasy. Ny siny dia azo heverina ho latabatra, ary ny rakitra dia azo raisina ho firaketana ao amin'io latabatra io.

Satria zava-dehibe amin'ny fahazoana tombony amin'ny Amazon ny hafainganam-pandeha sy ny fahombiazany, dia tsy mahagaga raha toa ity rafitra key-as-a-file-path ity dia tena tsara. Niezaka nitady fifandanjana aho: mba tsy nilana fangatahana be dia be, fa natao haingana ny fangatahana. Hita fa tsara kokoa ny manao rakitra bin 20 arivo eo ho eo. Heveriko fa raha manohy manatsara isika, dia afaka manatratra ny fitomboan'ny hafainganam-pandeha (ohatra, manao siny manokana ho an'ny data fotsiny, ka mampihena ny haben'ny latabatra fitadiavana). Saingy tsy nisy fotoana na vola hanaovana fanandramana fanampiny.

Ahoana ny amin'ny fifanarahana mifanandrify?

Ny zavatra nianarako: Ny antony voalohany mahatonga ny fotoana lany dia ny fanatsarana ny fomba fitahirizanao aloha loatra.

Amin'izao fotoana izao, tena zava-dehibe ny manontany tena hoe: "Nahoana no mampiasa format file proprietary?" Ny anton'izany dia ny hafainganam-pandehan'ny entana (naharitra in-7 ny fandefasana ny rakitra CSV gzipped) sy ny fampifanarahana amin'ny rindranasa. Mety handinika indray aho raha afaka mampiditra mora foana ny rakitra Parquet (na Arrow) i R raha tsy misy ny entana Spark. Ny olona rehetra ao amin'ny laboratoara dia mampiasa R, ary raha mila manova ny angona amin'ny endrika hafa aho, dia mbola manana ny angona lahatsoratra tany am-boalohany, ka azoko atao ny mampandeha ny fantsona indray.

Fizarana asa

Inona no nianarako: Aza manandrana manatsara ny asa amin'ny tanana, avelao ny solosaina hanao izany.

Nosoratako tamin'ny krômôzôma iray ny fizotry ny asa, izao dia mila mandrindra ny angona hafa rehetra aho.
Te-hanangana tranga EC2 maromaro ho an'ny fiovam-po aho, saingy tamin'izany fotoana izany dia natahotra ny hahazo enta-mavesatra tsy voalanjalanja amin'ny asa fanodinana samihafa aho (toa an'i Spark nijaly tamin'ny fisarahana tsy voalanjalanja). Ho fanampin'izay, tsy liana amin'ny fampiakarana ohatra iray isaky ny chromosome aho, satria ho an'ny kaonty AWS dia misy fetran'ny tranga 10.

Avy eo dia nanapa-kevitra ny hanoratra script amin'ny R aho mba hanatsarana ny asa fanodinana.

Voalohany, nangataka ny S3 aho mba hanao kajy hoe ohatrinona ny toerana fitehirizana ny krômôzôma tsirairay.

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

Avy eo aho dia nanoratra asa izay maka ny totalin'ny habeny, manodina ny filaharan'ny chromosomes, mizara azy ireo ho vondrona. num_jobs ary milaza aminao ny maha samy hafa ny haben'ny asa fanodinana rehetra.

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

Avy eo dia nihazakazaka namakivaky an'arivony aho tamin'ny fampiasana purrr ary nisafidy ny tsara indrindra.

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

Noho izany dia niafara tamin'ny karazana asa mitovy habe aho. Avy eo ny hany sisa tavela dia ny fametahana ny script Bash teo aloha amin'ny loop lehibe for. Naharitra 10 minitra teo ho eo vao nanoratra ity fanatsarana ity. Ary izany dia kely kokoa noho ny lany amin'ny famoronana asa tanana raha tsy voalanjalanja. Noho izany, heveriko fa marina ny tenako tamin'ity fanatsarana mialoha ity.

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

Amin'ny farany dia ampiako ny baiko fanakatonana:

sudo shutdown -h now

... ary nandeha ny zava-drehetra! Amin'ny fampiasana ny AWS CLI, nanangana tranga aho tamin'ny fampiasana ny safidy user_data nanome azy ireo sora-baventy momba ny asany amin'ny fikarakarana azy ireo. Nihazakazaka izy ireo ary nakatona ho azy, ka tsy nandoa vola fanampiny aho.

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

Aleo mifono entana!

Inona no nianarako: Ny API dia tokony ho tsotra mba ho mora sy mora ampiasaina.

Farany dia azoko tamin'ny toerana sy endrika mety ny angon-drakitra. Ny hany sisa tavela dia ny fanatsorana ny fizotran'ny fampiasana angon-drakitra araka izay azo atao mba hanamora kokoa ny mpiara-miasa amiko. Te hanao API tsotra aho amin'ny famoronana fangatahana. Raha manapa-kevitra ny hifindra amin'ny ho avy aho .rds amin'ny rakitra Parquet, dia tokony ho olana amiko izany fa tsy ho an'ny mpiara-miasa amiko. Noho izany dia nanapa-kevitra ny hanao fonosana R anatiny aho.

Manamboara sy manorata fonosana tena tsotra misy fiasa fidirana angona vitsivitsy voalamina manodidina ny asa iray get_snp. Nanamboatra tranokala ho an'ny mpiara-miasa amiko koa aho pkgdown, mba hahafahan'izy ireo mahita ohatra sy antontan-taratasy mora foana.

Fizarana 25TB mampiasa AWK sy R

Smart caching

Inona no nianarako: Raha voaomana tsara ny angonao dia ho mora ny fanaovana cache!

Satria ny iray amin'ireo workflows lehibe dia nampihatra ny modely famakafakana mitovy amin'ny fonosana SNP, dia nanapa-kevitra ny hampiasa binning ho tombontsoako aho. Rehefa mamindra angona amin'ny alàlan'ny SNP, ny fampahalalana rehetra avy amin'ny vondrona (bin) dia miraikitra amin'ilay zavatra naverina. Izany hoe, ny fanontaniana taloha dia afaka (amin'ny teoria) manafaingana ny fanodinana fanontaniana vaovao.

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

Rehefa manamboatra ilay fonosana aho dia nihazakazaka benchmarks maro mba hampitahana ny hafainganam-pandeha rehefa mampiasa fomba samihafa. Manoro hevitra aho mba tsy hanao tsirambina izany, satria indraindray ny vokatra dia tsy ampoizina. Ohatra, dplyr::filter dia haingana kokoa noho ny fakana andalana amin'ny fampiasana sivana mifototra amin'ny fanondroana, ary ny fakana tsanganana tokana avy amin'ny rafitra angona voasivana dia haingana kokoa noho ny fampiasana syntax fanondroana.

Mariho fa ny zavatra prev_snp_results misy ny fanalahidy snps_in_bin. Ity dia firafitry ny SNP tsy manam-paharoa rehetra ao anaty vondrona (bin), ahafahanao manamarina haingana raha efa manana angona avy amin'ny fangatahana teo aloha ianao. Manamora ny fampandehanana ny SNP rehetra ao anaty vondrona (bin) miaraka amin'ity code ity ihany koa izy:

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

vokatra

Ankehitriny isika dia afaka (ary efa nanomboka matotra) mitantana modely sy toe-javatra izay tsy azo nidirana teo aloha. Ny tsara indrindra dia ny mpiara-miasa amiko amin'ny laboratoara dia tsy mila mieritreritra fahasarotana. Manana fiasa miasa fotsiny izy ireo.

Ary na dia mitsitsy azy ireo aza ny antsipirian'ilay fonosana, dia niezaka aho nanamora ny endrika angon-drakitra mba ho fantatr'izy ireo raha nanjavona tampoka aho rahampitso...

Nitombo be ny hafainganam-pandeha. Matetika isika no mijery ireo sombin-genome manan-danja amin'ny asany. Teo aloha dia tsy afaka nanao izany izahay (nivadika ho lafo loatra), fa ankehitriny, noho ny rafitra sy ny caching vondrona (bin), ny fangatahana SNP iray dia latsaky ny 0,1 segondra eo ho eo, ary ny fampiasana data dia toy izany. ambany fa ny vidin'ny S3 dia voanjo.

famaranana

Tsy mpitari-dalana mihitsy ity lahatsoratra ity. Ny vahaolana dia nivadika ho an'ny tsirairay, ary azo antoka fa tsy tsara indrindra. Izy io kosa dia fitsangatsanganana. Tiako ho takatry ny hafa fa ny fanapahan-kevitra toy izany dia tsy miseho tanteraka ao an-doha, fa vokatry ny fitsapana sy ny fahadisoana. Ary koa, raha mitady mpahay siansa momba ny data ianao, dia tadidio fa ny fampiasana ireo fitaovana ireo dia mitaky traikefa, ary mandany vola ny traikefa. Faly aho fa nanam-bola, nefa maro hafa izay afaka manao asa tsara kokoa noho izaho dia tsy hanana fahafahana mihitsy noho ny tsy fahampian'ny vola mba hanandrana.

Ny fitaovana angona lehibe dia maro samihafa. Raha manam-potoana ianao dia azo antoka fa afaka manoratra vahaolana haingana kokoa amin'ny fampiasana teknika fanadiovana, fitahirizana ary fitrandrahana angon-drakitra. Amin'ny farany dia tonga amin'ny famakafakana ny tombony amin'ny vidiny.

Ny zavatra nianarako:

  • tsy misy fomba mora hamaritana ny 25 TB amin'ny fotoana iray;
  • mitandrema amin'ny haben'ny rakitra Parquet sy ny fandaminana azy;
  • Ny fisarahana ao amin'ny Spark dia tsy maintsy mandanjalanja;
  • Amin'ny ankapobeny, aza manandrana manao partitions 2,5 tapitrisa;
  • Mbola sarotra ny fanasokajiana, toy ny fametrahana Spark;
  • indraindray ny angona manokana dia mitaky vahaolana manokana;
  • Haingana ny fivondronan'ny spark, fa mbola lafo ny fisarahana;
  • aza matory rehefa mampianatra anao ny fototra, mety efa nisy namaha ny olanao tamin'ny taona 1980;
  • gnu parallel - zavatra mahagaga izany, tokony hampiasain'ny rehetra;
  • Tian'i Spark ny angona tsy voatsindry ary tsy tia manambatra fisarahana;
  • Ny Spark dia manana overhead be loatra rehefa mamaha olana tsotra;
  • Tena mahomby ny arrays associative an'ny AWK;
  • afaka mifandray ianao stdin и stdout avy amin'ny script R, ary noho izany dia ampiasao amin'ny fantsona;
  • Noho ny fampiharana lalana marani-tsaina, S3 dia afaka manodina rakitra maro;
  • Ny tena anton'ny fandaniam-potoana dia ny fanatsarana aloha loatra ny fomba fitahirizanao;
  • aza manandrana manatsara ny asa amin'ny tanana, avelao ny solosaina hanao izany;
  • Ny API dia tokony ho tsotra mba ho mora sy mora ampiasaina;
  • Raha voaomana tsara ny angonao dia ho mora ny fanaovana cache!

Source: www.habr.com

Add a comment