Te poroporoaki 25TB ma te whakamahi i te AWK me te R

Te poroporoaki 25TB ma te whakamahi i te AWK me te R
Me pehea te panui i tenei tuhinga: E mihi ana ahau mo te roa o te tuhinga me te rangirua. Hei whakaora i to wa, ka timata ahau i ia upoko ki te kupu whakataki "He aha taku i ako", e whakapoto ana i te mauri o te upoko ki roto i te kotahi, e rua ranei nga rerenga korero.

"Whakakitea mai ki ahau te otinga!" Mena kei te pirangi koe ki te kite i hea ahau i ahu mai ai, katahi ka peke atu ki te upoko "Te Whakanuia Nga Mahi," engari ki taku whakaaro he pai ake, he pai ake te panui mo te kore.

No tata nei ahau i mahi ki te whakarite i tetahi tukanga mo te tukatuka i te nui o nga raupapa DNA mata (he maramara SNP hangarau). Ko te hiahia kia tere te tiki raraunga mo tetahi waahi ira (e kiia ana ko te SNP) mo te whakatauira ka whai ake me etahi atu mahi. Ma te whakamahi i te R me te AWK, i taea e au te horoi me te whakarite i nga raraunga i runga i te tikanga maori, he tere ake te tukatuka patai. Ehara tenei i te mea ngawari ki ahau, me te maha o nga huringa. Ma tenei tuhinga ka awhina koe ki te karo i etahi o aku he ka whakaatu ki a koe he aha taku i mutu ai.

Tuatahi, etahi whakamarama whakataki.

raraunga

Ko ta matou pokapū tukatuka korero ira whare wananga i whakawhiwhia ki a matou he raraunga i te ahua o te 25 TB TSV. I whakawhiwhia e au kua wehewehea ki nga kohinga 5 Gzip-compressed, kei roto i ia waahanga 240 wha-kipaita nga konae. Kei ia rarangi he raraunga mo te SNP kotahi mai i te tangata kotahi. I te katoa, ko nga raraunga mo ~ 2,5 miriona SNP me ~ 60 mano nga tangata i tukuna. I tua atu i nga korero SNP, he maha nga pou kei roto i nga konae me nga nama e whakaatu ana i nga ahuatanga rereke, penei i te kaha o te panui, te auau o nga momo alleles, aha atu. I te katoa he 30 nga pou me nga uara ahurei.

Whāinga

Pērā i te kaupapa whakahaere raraunga, ko te mea nui ko te whakatau me pehea te whakamahi i nga raraunga. I tenei take ka tohua e matou nga tauira me nga rerenga mahi mo te SNP i runga i te SNP. Arā, ka hiahia noa matou i nga raraunga i runga i te SNP kotahi i te wa. Me ako ahau me pehea te tiki i nga rekoata katoa e pa ana ki tetahi o nga 2,5 miriona SNP i runga i te ngawari, te tere me te utu iti.

Me pehea e kore ai e mahi i tenei

Ki te whakahua i tetahi cliché tika:

Kare au i taka kotahi mano nga wa, kua kitea e au kotahi mano nga huarahi hei karo i te poroporo i te huinga raraunga i roto i te whakatakotoranga ratarata-uiui.

Ngana tuatahi

He aha taku i ako ai: Karekau he huarahi iti ki te tarai i te 25 TB i te wa kotahi.

I te whai i te akoranga "Nga Tikanga Ake mo te Tukatuka Raraunga Nui" i te Whare Wananga o Vanderbilt, i tino mohio ahau kei roto te tinihanga i te putea. Ka roa pea te haora, e rua ranei ki te whakarite i te tūmau Hive ki te whakahaere i nga raraunga katoa me te whakaatu i te hua. Mai i te mea kei te rongoa o maatau raraunga ki AWS S3, i whakamahia e ahau te ratonga Athena, ka taea e koe te tono Uiui Hive SQL ki nga raraunga S3. Kaore koe e hiahia ki te whakarite/whakaara i te kahui Hive, ka utu ano koe mo nga raraunga e rapu ana koe.

I muri i taku whakaatu ki a Athena aku raraunga me tona whakatakotoranga, i whakahaerehia e au etahi whakamatautau me nga patai penei:

select * from intensityData limit 10;

Na ka hohoro te whiwhi i nga hua pai-hanganga. Kua reri.

Tae noa ki te ngana ki te whakamahi i nga raraunga i roto i a maatau mahi...

I tonoa ahau kia unuhia nga korero SNP katoa hei whakamatautau i te tauira. I whakahaerehia e ahau te patai:


select * from intensityData 
where snp = 'rs123456';

... ka timata ki te tatari. I muri i te waru meneti me te neke atu i te 4 TB o nga raraunga i tonohia, ka whiwhi ahau i te hua. Ka utu a Athena i te nui o nga raraunga i kitea, $5 mo ia terabyte. Na tenei tono kotahi $20 me te waru meneti tatari. Hei whakahaere i te tauira mo nga raraunga katoa, me tatari matou mo nga tau 38 me te utu i te $50 miriona.

I tika te whakamahi i te Parquet...

He aha taku i ako ai: Kia tupato ki te rahi o au konae Parquet me o raatau whakahaere.

I ngana tuatahi ahau ki te whakatika i te ahuatanga ma te huri i nga TSV katoa ki Ngā kōnae parquet. He watea mo te mahi me nga huinga raraunga nui na te mea kei te rongoa nga korero kei roto i te ahua o te poupou: kei ia pou kei roto i tana ake waahanga mahara/kopae, he rereke ki nga konae tuhinga, kei roto i nga rarangi nga waahanga o ia pou. A, ki te hiahia koe ki te kimi i tetahi mea, katahi ka panuihia te pou e hiahiatia ana. I tua atu, ka penapenahia e ia konae nga momo uara i roto i te pou, na mena kaore te uara e rapuhia ana e koe i roto i te awhe o te pou, kaore a Spark e moumou taima ki te matawai i te konae katoa.

I whakahaere ahau i tetahi mahi ngawari KAPI AWS ki te huri i a maatau TSV ki Parquet ka tukuna nga konae hou ki Athena. E 5 haora pea te roa. Engari i taku whakahaerenga i te tono, he rite tonu te wa me te iti o te moni hei whakaoti. Ko te meka ko Spark, e ngana ana ki te arotau i te mahi, ka wetewete noa i tetahi tiihi TSV ka tuu ki roto i tana ake tiihi Parquet. A, i te mea he nui te rahi o ia wahanga ki te pupuri i nga rekoata katoa o te tini tangata, kei ia konae nga SNP katoa, na reira me whakatuwhera e Spark nga konae katoa hei tango i nga korero e hiahiatia ana.

Ko te mea whakamere, ko te momo kopeketanga taunoa (me te tūtohu) a Parquet, he tere, kaore e taea te wehe. Na reira, i mau tonu ia kaikokoti ki te wetewete me te tango i te katoa o te 3,5 GB huingararaunga.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R

Kia mohio tatou ki te raruraru

He aha taku i ako ai: He uaua te whakariterite, ina koa ka tohatohahia nga raraunga.

Ko te ahua ki ahau inaianei kua mohio ahau ki te ngako o te raruraru. Me kōmaka noa e au ngā raraunga mā te tīwae SNP, kaua mā te tangata. Na he maha nga SNP ka penapena i roto i tetahi waahanga raraunga motuhake, katahi ka "whakatuwhera" te mahi "atamai" a Parquet "mehemea kei te awhe te uara" ka whakaatu i tona kororia katoa. Ko te mea pouri, he mahi uaua te tohatoha i nga piriona rarangi e marara ana puta noa i tetahi tautau.

Kare rawa a AWS e hiahia ki te tuku moni whakahoki na runga i te take "He akonga raruraru ahau". Whai muri i taku oma ki te kōmaka i runga i te Amazon Glue, ka oma mo nga ra e 2 ka hinga.

Me pehea te wehewehe?

He aha taku i ako ai: Me taurite nga wehewehenga o Spark.

Na ka puta mai te whakaaro ki te wehewehe i nga raraunga i roto i nga chromosomes. E 23 o ratou (me etahi atu ki te whai whakaaro koe ki te DNA mitochondrial me nga rohe kaore i maataki).
Ma tenei ka taea e koe te wehewehe i nga raraunga ki nga waahanga iti ake. Mena ka tapiritia e koe tetahi raina ki te mahinga kaweake Spark i roto i te tuhinga Whakapiri partition_by = "chr", katahi ka wehewehea nga raraunga ki nga peere.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R
He maha nga wahanga o te genome e kiia nei he chromosomes.

Kia aroha mai, karekau i whai hua. He rereke nga rahi o nga Chromosomes, he rereke nga korero. Ko te tikanga ko nga mahi i tukuna e Spark ki nga kaimahi karekau i taurite me te ata oti na te mea kua oti moata etahi pona, kua mangere. Heoi, kua oti nga mahi. Engari i te tono mo tetahi SNP, ka raru ano te koretake. Ko te utu mo te tukatuka i nga SNP i runga i nga chromosomes nui ake (ara, e hiahia ana matou ki te tiki raraunga) kua heke noa ma te 10 tauwehe. He nui, engari kaore i te nui.

He aha mena ka wehewehea ki nga waahanga iti ake?

He aha taku i ako ai: Kaua rawa e ngana ki te mahi 2,5 miriona wehewehenga.

I whakatau ahau ki te haere katoa ki waho ka wehewehe i ia SNP. Na tenei i whakarite kia rite te rahi o nga wehewehenga. HE WHAKAARO KINO. I whakamahia e ahau te Whakapiri me te taapiri i tetahi raina harakore partition_by = 'snp'. I timata te mahi ka timata te mahi. He ra i muri mai ka tirohia e au karekau he mea i tuhia ki a S3, no reira ka mate ahau i te mahi. Ko te ahua kei te tuhi a Glue i nga konae takawaenga ki tetahi waahi huna i S3, he maha nga konae, he rua miriona pea. Ko te mutunga mai, neke atu i te kotahi mano taara te utu o taku hapa, kaore i pai ki taku kaiawhina.

Wehewehe + wehewehe

He aha taku i ako ai: He uaua tonu te whakatakotoranga, me te whakakoi i a Spark.

Ko taku nganatanga whakamutunga ki te wehewehe, ko taku wehewehe i nga chromosomes katahi ka tohatoha i ia wahanga. I roto i te ariā, ka tere ake ia patai na te mea ko nga raraunga SNP e hiahiatia ana me uru ki roto i etahi wahanga Parquet i roto i te awhe kua whakaritea. Kia aroha mai, ko te tohatoha i nga raraunga kua wehewehea he mahi uaua. Ko te mutunga mai, ka huri ahau ki te EMR mo te roopu ritenga me te whakamahi e waru nga wa kaha (C5.4xl) me Sparklyr ki te hanga rerengamahi ngawari ake...

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

...heoi, kaore ano kia oti te mahi. I whirihorahia e au i roto i nga huarahi rereke: i whakapiki ake i te tohatoha mahara mo ia kaikohiko patai, i whakamahia nga pona me te nui o te mahara, i whakamahia nga taurangi haapurororaa (nga taurangi whakapaoho), engari ia wa ka puta enei ki te haurua ine, a ka timata nga kaiwhakahaere. ki te hinga kia mutu ra ano nga mea katoa.

Kei te kaha ake taku mahi auaha

He aha taku i ako ai: I etahi wa ka hiahiatia e nga raraunga motuhake etahi otinga motuhake.

He uara tūnga kei ia SNP. He tau tenei e rite ana ki te maha o nga turanga i te taha o tona chromosome. He huarahi pai, he tikanga maori tenei ki te whakarite i o maatau raraunga. I te tuatahi ka hiahia ahau ki te wehewehe i nga rohe o ia chromosome. Hei tauira, nga turanga 1 - 2000, 2001 - 4000, etc. Engari ko te raru ko nga SNP kaore i te tohatoha noa puta noa i nga chromosomes, na reira ka rereke te rahi o nga roopu.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R

Ko te mutunga mai, ka wehe au i nga tuunga ki nga waahanga (rangatira). Ma te whakamahi i nga raraunga kua oti te tango, ka tono ahau kia whiwhi rarangi o nga SNP ahurei, o ratou tuunga me o ratou chromosomes. Kātahi ka kōmakahia e au ngā raraunga i roto i ia chromosome ka kohia ngā SNP ki roto i ngā rōpū (pupu) o te rahi. Me kii tatou 1000 SNPs ia. Na tenei i homai te hononga SNP-ki-rōpū-ia-chromosome.

I te mutunga, i hanga e au nga roopu (bin) o nga SNP 75, ka whakamaramahia te take i raro nei.

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

Ko te whakamatautau tuatahi me Spark

He aha taku i ako ai: He tere te whakahiato korakora, engari he utu tonu te wehewehe.

I pirangi ahau ki te panui i tenei anga raraunga iti (2,5 miriona rarangi) ki roto i te Spark, whakakotahi ki nga raraunga mata, katahi ka wehewehea e te poupou hou 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')
  )

I whakamahia e ahau sdf_broadcast(), no reira ka mohio a Spark me tuku te anga raraunga ki nga pona katoa. Ka whai hua tenei mena he iti te rahi o nga raraunga me te hiahia mo nga mahi katoa. Ki te kore, ka ngana a Spark ki te mohio me te tohatoha i nga raraunga ina hiahiatia, tera pea ka paheke.

Na ano, kaore taku whakaaro i pai: i mahi nga mahi mo etahi wa, kua oti te uniana, katahi ano, ka rite ki nga kaikokoti i whakarewahia ma te wehewehe, ka timata te kore.

Te taapiri AWK

He aha taku i ako ai: Kaua e moe i te wa e akona ana koe ki nga kaupapa matua. He pono kua whakatauhia e tetahi to raru i nga tau 1980.

Tae noa mai ki tenei wa, ko te take o aku rahunga katoa ki a Spark ko te tukituki o nga raraunga i roto i te tautau. Ka taea pea te whakapai ake te ahuatanga ma te maimoatanga o mua. I whakatau ahau ki te ngana ki te wehewehe i nga raraunga kuputuhi mata ki nga pou o nga chromosomes i runga i te tumanako ka tukuna e Spark nga raraunga "i mua i te wehewehe".

I rapu ahau i runga i StackOverflow me pehea te wehewehe i nga uara pou ka kitea he whakautu tino pai. Ma te AWK ka taea e koe te wehewehe i tetahi konae tuhinga ki nga uara pou ma te tuhi i roto i te tuhinga kaore i te tuku i nga hua ki stdout.

I tuhia e ahau he tuhinga Bash hei whakamatau. I tikiakehia tetahi o nga TSV kua taia, ka wetewete ma te whakamahi gzip ka tukuna ki awk.

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

I mahi!

Te whakakī i nga Core

He aha taku i ako ai: gnu parallel - he mea makutu, ma te katoa e whakamahi.

He tino puhoi te wehenga me te wa i timata ahau htopki te tirotiro i te whakamahinga o te tauira kaha (me te utu nui) EC2, i puta mai i te mea kotahi anake taku matua me te 200 MB o te mahara. Hei whakaoti i te raruraru kia kore ai e ngaro te moni nui, me whakaaro me pehea te whakarara i te mahi. Waimarie, i roto i te pukapuka tino whakamiharo Pūtaiao Raraunga i te Raina Whakahau I kitea e ahau tetahi upoko na Jeron Janssens mo te whakarara. Na reira i ako ahau mo gnu parallel, he tikanga tino ngawari mo te whakatinana i te miro maha i Unix.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R
I te wa i timata ahau ki te wehewehe ma te whakamahi i te tikanga hou, he pai nga mea katoa, engari kei te noho tonu te kohanga - ko te tango i nga mea S3 ki te kōpae kaore i tino tere, kaore ano kia tino whakarara. Hei whakatika i tenei, i mahia e ahau tenei:

  1. I kitea e ahau ka taea te whakatinana i te waahi tango S3 tika i roto i te paipa, ka whakakorea te rokiroki takawaenga i runga i te kōpae. Ko te tikanga ka taea e au te karo i te tuhi raraunga mata ki te kōpae me te whakamahi i te iti ake, na reira he iti ake te utu, te rokiroki i runga i te AWS.
  2. kapa aws configure set default.s3.max_concurrent_requests 50 i nui ake te maha o nga miro ka whakamahia e AWS CLI (ma te taunoa he 10).
  3. I huri ahau ki tetahi tauira EC2 kua arotauhia mo te tere whatunga, me te reta n te ingoa. Kua kitea e au ko te ngaro o te mana tukatuka i te wa e whakamahi ana i nga n-take he nui ake te utu i te pikinga o te tere uta. Mo te nuinga o nga mahi i whakamahia e ahau c5n.4xl.
  4. Hurihia gzip i runga i pigz, he taputapu gzip tenei ka taea te mahi hauhautanga ki te whakarara i te mahi i te tuatahi kare-whakariterite o te whakakore i nga konae (he iti rawa tenei i awhina).

# 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

Ka honoa enei hikoi ki a raatau ano kia tere ai nga mahi katoa. Ma te whakanui ake i nga tere tango me te whakakore i nga tuhi kōpae, ka taea e au te whakahaere i tetahi kete 5 terabyte i roto i etahi haora.

Me korero tenei tweet 'TSV'. Aue.

Ma te whakamahi i nga raraunga hou kua tohatohahia

He aha taku i ako ai: He pai ki a Spark nga raraunga karekau e pai ki te whakakotahi i nga wehewehenga.

Inaianei kei te S3 nga raraunga i roto i te whakatakotoranga kua wetewetehia (panuihia: tiritahi) me te ahua-whakaritea, ka hoki ano ahau ki Spark. He ohorere e tatari ana ki ahau: I rahua ano e au te whakatutuki i taku i hiahia ai! He tino uaua ki te korero ki a Spark me pehea te wehewehenga o nga raraunga. A ahakoa i mahia e au tenei, ka kitea he maha rawa nga wehewehenga (95 mano), i te wa i whakamahia e au coalesce i whakaitihia to raatau nama ki nga rohe whaitake, i pakaru taku wehewehenga. E mohio ana ahau ka taea tenei te whakatika, engari i muri i nga ra e rua o te rapunga kaore au i kitea he otinga. I te mutunga ka oti i ahau nga mahi katoa i Spark, ahakoa he wa poto, karekau he iti rawa aku konae Parquet wehewehe (~200 KB). Heoi, ko nga raraunga i te waahi e hiahiatia ana.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R
He iti rawa, he koretake, he mea whakamiharo!

Te whakamatautau i nga patai Spark rohe

He aha taku i ako ai: He nui rawa te korakora ki te whakaoti rapanga ngawari.

Na te tango i nga raraunga i roto i te whakatakotoranga mohio, i taea e au te whakamatautau i te tere. Whakaturia he tuhinga R hei whakahaere i te tūmau Spark paetata, ka utaina he anga raraunga Spark mai i te rokiroki roopu Parquet kua tohua. I ngana ahau ki te uta i nga raraunga katoa engari kaore i taea e Sparklyr te mohio ki te wehewehe.

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)

He 29,415 hēkona te mahi. He pai ake, engari kaore i te pai mo te whakamatautau papatipu o tetahi mea. I tua atu, kare e taea e au te tere ake me te keteroki na te mea i taku ngana ki te keteroki i tetahi anga raraunga i roto i te mahara, ka pakaru tonu a Spark, ahakoa i toha ahau neke atu i te 50 GB o te mahara ki tetahi huingararaunga iti iho i te 15 te taumaha.

Hoki ki AWK

He aha taku i ako ai: He tino pai nga huinga honohono i AWK.

I mohio ahau ka taea e au te eke i nga tere teitei ake. I mahara ahau ki tera i roto i tetahi mea whakamiharo Akoranga AWK na Bruce Barnett I panui ahau mo tetahi ahuatanga pai e kiia nei ko "huānga hono" Ko te tikanga, he takirua uara matua enei, na etahi take i kiia he rereke i roto i te AWK, na reira kaore au i whakaaro nui ki a raatau. Roman Cheplyaka i maumahara ko te kupu "hoahoa hono" he tawhito ake i te kupu "matua-uara takirua". Ahakoa ko koe tirohia te uara-matua i Google Ngram, e kore koe e kite i tenei kupu ki reira, engari ka kitea e koe nga huinga hononga! I tua atu, ko te "matua-uara takirua" te nuinga o te wa e hono ana ki nga papaa raraunga, na reira ka nui ake te mohio ki te whakataurite ki te mahere tohu. I mohio ahau ka taea e au te whakamahi i enei huinga hononga ki te hono i aku SNP ki te ripanga ipu me nga raraunga mata me te kore e whakamahi i te Spark.

Ki te mahi i tenei, i roto i te tuhinga AWK i whakamahia e ahau te poraka BEGIN. He waahanga waehere tenei ka mahia i mua i te tukunga o te rarangi tuatahi o nga raraunga ki te tinana matua o te tuhinga.

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

rōpū while(getline...) i utaina nga rarangi katoa mai i te roopu CSV (pupu), tautuhia te tiwae tuatahi (ingoa SNP) hei matua mo te huinga hono bin me te uara tuarua (rōpū) hei uara. Na i roto i te poraka { }, ka mahia ki nga rarangi katoa o te konae matua, ka tukuna ia raina ki te konae whakaputa, ka whiwhi ingoa ahurei i runga i tana roopu (bin): ..._bin_"bin[$1]"_....

Ngā rerekētanga batch_num и chunk_id i rite ki nga raraunga i whakaratohia e te paipa, te karo i te ahuatanga o te iwi, me te rere o ia miro mahi parallel, i tuhi ki tana ake konae motuhake.

I te mea i whakamararatia e au nga raraunga mata katoa ki roto i nga kopaki o nga chromosomes i toe mai i taku whakamatautau o mua ki te AWK, inaianei ka taea e au te tuhi i tetahi atu tuhinga Bash ki te tukatuka i tetahi chromosomes i te wa kotahi ka tuku raraunga wehewehenga hohonu atu ki te 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/*

E rua nga waahanga o te tuhinga parallel.

I te waahanga tuatahi, ka panuihia nga raraunga mai i nga konae katoa kei roto nga korero mo te chromosome e hiahiatia ana, ka tohatohahia enei raraunga ki nga miro, ka tohatoha i nga konae ki nga roopu e tika ana (bin). Hei karo i nga tikanga iwi ina tuhi nga miro maha ki te konae kotahi, ka tukuna e AWK nga ingoa konae hei tuhi raraunga ki nga waahi rereke, hei tauira. chr_10_bin_52_batch_2_aa.csv. Ko te mutunga, he maha nga konae iti ka hangaia i runga i te kōpae (mo tenei i whakamahia e ahau nga pukapuka EBS terabyte).

Kaituku mai i te waahanga tuarua parallel ka haere i roto i nga roopu (bin) ka whakakotahi i a raatau ake konae ki te CSV noa c catkatahi ka tukuna kia kaweake.

Whakapāho i R?

He aha taku i ako ai: Ka taea e koe te whakapā atu stdin и stdout mai i te tuhinga R, na reira whakamahia i roto i te paipa.

Kua kite pea koe i tenei rarangi i to tuhinga Bash: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... Ka whakamaoritia nga konae roopu roopu katoa (bin) ki roto i te tuhinga R kei raro nei. {} he tikanga motuhake parallel, ka whakauru i nga raraunga ka tukuna e ia ki te awa kua tohua ki roto i te whakahau ake. Kōwhiringa {#} whakarato i te ID miro ahurei, a {%} e tohu ana i te nama mokamoka mahi (he tukurua, engari kaore i te wa kotahi). Ka kitea he rarangi o nga whiringa katoa i roto tuhinga.

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

Ina he taurangi file("stdin") tuku ki readr::read_csv, ka utaina nga raraunga kua whakamaoritia ki roto i te tuhinga R ki roto i te anga, ka noho ki te ahua .rds-kōnae whakamahi aws.s3 tuhia tika ki S3.

He rite te RDS ki te putanga teina o Parquet, me te kore o te putunga putunga korero.

I muri i te whakaoti i te tuhinga Bash ka whiwhi au i tetahi paihere .rds-Ko nga konae kei roto i te S3, i taea ai e au te whakamahi i nga momo taapiri me nga momo hanga-i roto.

Ahakoa te whakamahi o te frein R, he tere rawa nga mahi katoa. Ehara i te mea miharo, ko nga waahanga o te R e panui ana, e tuhi ana i nga raraunga ka tino arotauhia. Whai muri i te whakamatautau ki tetahi chromosome reo-rahi, ka oti te mahi i runga i te tauira C5n.4xl i roto i te rua haora.

S3 Whakawhāititanga

He aha taku i ako ai: He mihi ki te whakatinanatanga ara atamai, ka taea e S3 te hapai i nga konae maha.

I awangawanga ahau mena ka taea e S3 te whakahaere i nga tini konae kua whakawhitia ki reira. Ka taea e au te whakamaarama i nga ingoa konae, engari me pehea te rapu a S3?

Te poroporoaki 25TB ma te whakamahi i te AWK me te R
Ko nga kōpaki i roto i te S3 he whakaaturanga noa, i te mea kaore te punaha e aro ki te tohu /. Mai i te wharangi S3 FAQ.

Te ahua nei kei te tohu a S3 i te ara ki tetahi konae hei taviri ngawari i roto i te ahua o te ripanga hash, te papaunga tuhinga ranei. Ka taea te whakaaro he peere he ripanga, ka taea te whakaaro ko nga konae he rekoata kei taua ripanga.

I te mea he mea nui te tere me te whai hua ki te whai hua i Amazon, ehara i te mea miharo ko tenei punaha matua-hei-kōnae-ara e tino pai ana. I ngana ahau ki te kimi i te toenga: kia kore ai au e nui te tono tono, engari kia tere te whakatutuki i nga tono. I puta mai he pai ake te hanga mo te 20 mano nga konae bin. Ki taku whakaaro mena ka arotau tonu tatou, ka taea e tatou te piki ake o te tere (hei tauira, te hanga peere motuhake mo nga raraunga anake, na reira ka whakaiti i te rahi o te ripanga rapu). Engari kaore he wa, he moni ranei mo etahi atu whakamatautau.

He aha te hototahi ripeka?

He aha taku i ako: Ko te take tuatahi o te moumou taima ko te arotau i to tikanga rokiroki moata.

I tenei wa, he mea nui ki te patai ki a koe ano: "He aha te whakamahi i te whakatakotoranga konae rangatira?" Ko te take kei runga i te tere uta (ko nga konae CSV gzipped e 7 nga wa roa ki te uta) me te hototahi ki o maatau rerengamahi. Ka whai whakaaro ano ahau mena ka taea e R te uta i nga konae Parquet (Pere ranei) me te kore te uta Spark. Ka whakamahia e nga tangata katoa o to maatau taiwhanga te R, a ki te hiahia au ki te huri i nga raraunga ki tetahi atu whakatakotoranga, kei a au tonu nga raraunga tuhinga taketake, na reira ka taea e au te whakahaere ano i te paipa.

Te wehenga mahi

He aha taku i ako ai: Kaua e ngana ki te arotau i nga mahi a-ringa, ma te rorohiko e mahi.

Kua whakakorehia e au te rerenga mahi i runga i te chromosome kotahi, inaianei me tukatuka e au nga raraunga katoa.
I pirangi ahau ki te whakaara ake i etahi waa EC2 mo te hurihanga, engari i te wa ano i mataku ahau kei whiwhi i te taumahatanga tino koretake puta noa i nga mahi tukatuka rereke (penei i te mamae o Spark i nga wehenga kore taurite). I tua atu, kaore au i te hiahia ki te whakaara i tetahi tauira mo ia chromosome, na te mea mo nga kaute AWS he tepe taunoa o nga wa 10.

Na ka whakatau ahau ki te tuhi i tetahi tuhinga ki te R ki te arotau i nga mahi tukatuka.

Tuatahi, i tono ahau ki a S3 ki te tatau i te nui o te waahi rokiroki e nohoia ana e ia chromosome.

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

Na ka tuhia e au tetahi mahi e tango ana i te rahi katoa, ka riwhi i te raupapa o nga chromosomes, ka wehewehea ki nga roopu. num_jobs me te korero ki a koe he pehea te rereke o nga rahi o nga mahi tukatuka katoa.

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

Na ka oma ahau i roto i te mano riwhi ma te whakamahi i te purrr me te whiriwhiri i te mea pai.

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

Na ka mutu i a au he huinga mahi he rite tonu te rahi. Na ko nga mea katoa i toe ko te takai i taku tuhinga Bash o mua ki roto i te kohanga nui for. Tata ki te 10 meneti te roa o tenei arotautanga ki te tuhi. A he iti ake tenei i taku utu mo te hanga a-ringa i nga mahi mena kaore i taurite. No reira, ki taku whakaaro i tika taku arotautanga tuatahi.

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

I te mutunga ka taapirihia e ahau te whakahau kati:

sudo shutdown -h now

... a ka pai nga mea katoa! Ma te whakamahi i te AWS CLI, i whakaarahia e au nga waa ma te whakamahi i te whiringa user_data i hoatu ki a ratou nga tuhinga a Bash mo o raatau mahi mo te tukatuka. I oma ratou ka tutakina aunoa, na reira kaore au i te utu mo te mana tukatuka taapiri.

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

Kia takai tatou!

He aha taku i ako ai: Me ngawari te API mo te ngawari me te ngawari o te whakamahi.

Ka mutu ka whiwhi au i nga raraunga ki te waahi tika me te ahua. Ko te mea i toe ko te whakangawari ake i te tikanga o te whakamahi i nga raraunga ka taea kia ngawari ake mo aku hoa mahi. I hiahia ahau ki te hanga i tetahi API ngawari mo te hanga tono. Mena kei te heke mai ka whakatau ahau ki te huri mai .rds ki nga konae Parquet, katahi ka raru ahau, kaua mo aku hoa mahi. Mo tenei ka whakatau ahau ki te hanga i tetahi kete R o roto.

Hanga me te tuhi i tetahi kete tino ngawari kei roto he iti noa nga mahi uru raraunga kua whakaritea huri noa i tetahi mahi get_snp. I hanga ano e ahau he paetukutuku mo oku hoa mahi pkg iho, kia ngawari te kite i nga tauira me nga tuhinga.

Te poroporoaki 25TB ma te whakamahi i te AWK me te R

Keteroki atamai

He aha taku i ako ai: Mēnā kua rite rawa ō raraunga, ka māmā te keteroki!

I te mea ko tetahi o nga rerengamahi matua i tono i taua tauira tātaritanga ki te kete SNP, ka whakatau ahau ki te whakamahi binning hei painga moku. Ina tuku raraunga ma te SNP, ko nga korero katoa mai i te roopu (puera) ka piri ki te mea kua whakahokia mai. Arā, ka taea e nga uiui tawhito (i te ariā) te tere ake i te tukatuka o nga patai hou.

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

I te wa e hanga ana i te kete, he maha nga tohu i whakahaerehia e au hei whakataurite i te tere ina whakamahi tikanga rereke. Ka tūtohu ahau kia kaua e warewarehia tenei, no te mea i etahi wa ka puta ohorere nga hua. Hei tauira, dplyr::filter he tere ake i te hopu haupae ma te whakamahi i te tātari-a-tauputanga, me te tiki i te pou kotahi mai i te anga raraunga kua tātarihia he tere ake i te whakamahi i te wetereo tohu.

Kia mahara ko te ahanoa prev_snp_results kei roto te kī snps_in_bin. He huinga tenei o nga SNP ahurei katoa i roto i te roopu (puera), ka taea e koe te tirotiro tere mena kei a koe nga raraunga mai i tetahi patai o mua. He mea ngawari hoki ki te kopikopiko i nga SNP katoa i roto i te roopu (puera) me tenei waehere:

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

Результаты

Inaianei ka taea e matou (a kua timata ki te tino kaha) te whakahaere tauira me nga ahuatanga kaore i taea e matou i mua. Ko te mea pai kia kore oku hoa mahi taiwhanga e whai whakaaro mo nga raruraru. He mahi noa ta raatau mahi.

A, ahakoa e tohungia ana e te kete nga korero, ka ngana ahau ki te whakamaarama i te whakatakotoranga raraunga kia taea ai e ratou te mohio mena ka ngaro ohorere ahau apopo...

Kua tino piki ake te tere. I te nuinga o te wa ka karapahia e matou nga kongakonga ira tino nui. I mua, kaore e taea e matou te mahi i tenei (he nui rawa te utu), engari inaianei, he mihi ki te hanganga o te roopu (bin) me te keteroki, ko te tono mo te SNP kotahi te iti iho i te 0,1 hēkona, me te whakamahi raraunga he pera. he iti te utu mo te S3 he pīnati.

mutunga

Ehara tenei tuhinga i te kaiarahi. Ko te otinga i puta he takitahi, me te mea kaore e tino pai. Engari, he korero haere. E hiahia ana ahau kia mohio etahi atu ko nga whakatau penei kare i tino hanga i roto i te mahunga, he hua o te whakamatautau me te he. Ano, ki te rapu koe mo te kaiputaiao raraunga, kia maumahara ko te whakamahi i enei taputapu e tika ana me whai wheako, me te wheako he utu moni. Kei te harikoa ahau i te mea i whai huarahi au ki te utu, engari he maha etahi ka kaha ake te mahi i taua mahi pai ake i a au e kore rawa e whai waahi na te kore moni ki te whakamatau.

He maha nga taputapu raraunga nui. Mena kei a koe te wa, ka taea e koe te tuhi i tetahi otinga tere ma te whakamahi i nga tikanga horoi raraunga atamai, rokiroki me te tangohanga. I te mutunga ka heke iho ki te tātari utu-painga.

Ko taku i ako:

  • karekau he huarahi iti ki te tarai i te 25 TB i te wa kotahi;
  • kia tupato ki te rahi o nga konae Parquet me o raatau whakahaere;
  • Me taurite nga wehewehenga o te Spark;
  • I te nuinga, kaua rawa e ngana ki te hanga 2,5 miriona nga wehewehenga;
  • He uaua tonu te whakatakotoranga, pera i te whakaturanga Spark;
  • i etahi wa ka hiahia nga raraunga motuhake ki nga otinga motuhake;
  • He tere te whakahiato korakora, engari he utu tonu te wehewehe;
  • kaua e moe ina whakaakona koe i nga kaupapa, tera pea kua whakatauhia e tetahi to raru i nga tau 1980;
  • gnu parallel - he mea makutu tenei, ma te katoa e whakamahi;
  • He pai ki a Spark nga raraunga karekau e pai ki te whakakotahi i nga wehewehenga;
  • He nui rawa te korakora i te wa e whakaoti rapanga ngawari;
  • ассоциативные массивы в AWK очень эффективны;
  • ka taea e koe te whakapā atu stdin и stdout mai i te tuhinga R, na reira whakamahia i roto i te paipa;
  • He mihi ki te whakatinanatanga ara atamai, ka taea e S3 te tukatuka i nga konae maha;
  • Ko te take nui mo te moumou taima ko te arotau wawe i to tikanga rokiroki;
  • kaua e ngana ki te arotau i nga mahi a-ringa, ma te rorohiko e mahi;
  • Me ngawari te API mo te ngawari me te ngawari o te whakamahi;
  • Mena kua rite to raraunga, ka ngawari te keteroki!

Source: will.com

Tāpiri i te kōrero