Ho hlahisa 25TB ho sebelisa AWK le R

Ho hlahisa 25TB ho sebelisa AWK le R
Mokhoa oa ho bala sehlooho sena: Ke kopa tšoarelo bakeng sa mongolo o molelele hakana le moferefere. E le ho u bolokela nako, ke qala khaolo e ’ngoe le e ’ngoe ka kenyelletso ea “Seo ke Ithutileng,” e akaretsang moelelo oa khaolo ka polelo e le ’ngoe kapa tse peli.

“Mpontše tharollo feela!” Haeba u batla feela ho bona hore na ke tsoa hokae, fetela khaolong e reng "Ho ba Moqapi haholoanyane," empa ke nahana hore hoa thahasellisa ebile ho molemo ho bala ka ho hloleha.

Ke sa tsoa fuoa mosebetsi oa ho theha ts'ebetso ea ho sebetsana le palo e kholo ea tatellano ea DNA e tala (ka theknoloji ea SNP chip). Tlhokahalo e ne e le ho fumana kapele lintlha mabapi le sebaka se fanoeng sa liphatsa tsa lefutso (se bitsoang SNP) bakeng sa mohlala o latelang le mesebetsi e meng. Ke sebelisa R le AWK, ke khonne ho hloekisa le ho hlophisa lintlha ka tsela ea tlhaho, ka potlakisa haholo ho sebetsana le lipotso. Sena se ne se se bonolo ho 'na mme se ne se hloka hore ke phete hangata. Sehlooho sena se tla u thusa ho qoba tse ling tsa liphoso tsa ka le ho u bontša hore na ke qetetse ka eng.

Taba ea pele, litlhaloso tse ling tsa selelekela.

ya data

Setsi sa rona sa univesithi se sebetsanang le litaba tsa liphatsa tsa lefutso se re file lintlha ka mokhoa oa 25 TB TSV. Ke li amohetse li arotsoe ka liphutheloana tsa 5 Gzip-compressed, e 'ngoe le e' ngoe e na le lifaele tse ka bang 240 tsa li-gigabyte tse 'nè. Mola o mong le o mong o ne o na le data bakeng sa SNP e le 'ngoe ho tsoa ho motho a le mong. Ka kakaretso, lintlha tse mabapi le ~ 2,5 milione SNPs le ~ 60 batho ba likete tse likete li ile tsa fetisoa. Ntle le tlhaiso-leseling ea SNP, lifaele li ne li na le likholomo tse ngata tse nang le linomoro tse bonts'ang litšobotsi tse fapaneng, joalo ka matla a ho bala, khafetsa ea li-alleles tse fapaneng, jj. Ka kakaretso ho ne ho e-na le litšiea tse ka bang 30 tse nang le litekanyetso tse ikhethang.

Sepheo

Joalo ka projeke efe kapa efe ea taolo ea data, ntho ea bohlokoahali e ne e le ho tseba hore na data e tla sebelisoa joang. Boemong bona re tla khetha boholo ba mehlala le phallo ea mosebetsi bakeng sa SNP e ipapisitseng le SNP. Ke hore, re tla hloka feela data ho SNP e le 'ngoe ka nako. Ke ile ka tlameha ho ithuta ho fumana lirekoto tsohle tse amanang le e 'ngoe ea li-SNP tse limilione tse 2,5 habonolo, ka potlako le ka theko e tlaase kamoo ho ka khonehang.

Joang ho se etse sena

Ho qotsa cliché e loketseng:

Ha kea hloleha makhetlo a sekete, ke sa tsoa fumana litsela tse sekete tsa ho qoba ho arola bongata ba data ka mokhoa o bonolo oa ho botsa.

Pele leka

Ke ithutile eng: Ha ho na mokhoa o theko e tlaase oa ho hlalosa 25 TB ka nako.

Kaha ke ne ke nkile thupelo ea "Mekhoa e Tsoetseng Pele ea Ts'ebetso e Khōlō ea Boitsebiso" Univesithing ea Vanderbilt, ke ne ke kholisehile hore leqheka le ne le le ka mokotleng. Mohlomong ho tla nka hora kapa tse peli ho theha seva sa Hive ho tsamaisa data eohle le ho tlaleha sephetho. Kaha data ea rona e bolokiloe ho AWS S3, ke sebelisitse tšebeletso Athena, e u lumellang hore u sebelise lipotso tsa Hive SQL ho data ea S3. Ha ho hlokahale hore u thehe / u phahamise sehlopha sa Hive, hape u lefella feela data eo u e batlang.

Kamora hore ke bonts'e Athena data ea ka le sebopeho sa eona, ke ile ka etsa liteko ka lipotso tse kang tsena:

select * from intensityData limit 10;

'Me kapele o ile a fumana liphetho tse hlophisitsoeng hantle. E lokile.

Ho fihlela re leka ho sebelisa data mosebetsing oa rona ...

Ke ile ka kōptjoa ho ntša tlhahisoleseding eohle ea SNP ho hlahloba mohlala ho. Ke ile ka botsa:


select * from intensityData 
where snp = 'rs123456';

... mme a qala ho ema. Kamora metsotso e robeli le ho feta 4 TB ea data e kopiloeng, ke fumane sephetho. Athena e qosa ka bongata ba data e fumanoeng, $5 ka terabyte. Kahoo kopo ena e le 'ngoe e bitsa $20 le metsotso e robeli ea ho ema. Ho tsamaisa mohlala ho data eohle, re ile ra tlameha ho ema lilemo tse 38 mme re lefa $ limilione tse 50. Ho hlakile hore sena se ne se sa re tšoanele.

Ho ne ho hlokahala ho sebelisa Parquet ...

Ke ithutile eng: Ela hloko boholo ba lifaele tsa hau tsa Parquet le mokhatlo oa tsona.

Ke ile ka leka pele ho lokisa boemo ka ho fetolela TSVs tsohle ho Lifaele tsa parquet. Li loketse ho sebetsa ka li-data tse kholo hobane boitsebiso bo ho tsona bo bolokiloe ka mokhoa oa columnar: kholomo e 'ngoe le e' ngoe e sebakeng sa eona sa memori / disk, ho fapana le lifaele tsa mongolo, tseo mela e nang le likarolo tsa kholomo ka 'ngoe. 'Me haeba u hloka ho fumana ntho e itseng, bala feela kholomo e hlokahalang. Ho feta moo, faele e 'ngoe le e' ngoe e boloka mefuta e mengata ea boleng ka har'a kholomo, kahoo haeba boleng boo u bo batlang bo le sieo lethathamong la kholomo, Spark e ke ke ea senya nako ho lekola faele eohle.

Ke ile ka etsa mosebetsi o bonolo Glue ea AWS ho fetolela li-TSV tsa rona ho Parquet le ho lahlela lifaele tse ncha ho Athena. Ho nkile lihora tse ka bang 5. Empa ha ke etsa kopo, ho ile ha nka nako e lekanang le chelete e nyenyane hore ke e phethe. Taba ke hore Spark, ha a leka ho ntlafatsa mosebetsi, o ile a manolla chunk e le 'ngoe ea TSV mme a e beha ka har'a eona ea Parquet chunk. 'Me kaha karolo e' ngoe le e 'ngoe e ne e le khōlō ka ho lekaneng ho kenya litlaleho tsohle tsa batho ba bangata, faele e' ngoe le e 'ngoe e ne e e-na le li-SNP tsohle, kahoo Spark e ne e tlameha ho bula lifaele tsohle ho ntša boitsebiso boo e bo hlokang.

Ho khahlisang, mofuta oa compression oa kamehla oa Parquet (le o khothaletsoang), snappy, ha o arohane. Ka hona, moahloli e mong le e mong o ne a tšoarehile mosebetsing oa ho manolla le ho khoasolla datasete e felletseng ea 3,5 GB.

Ho hlahisa 25TB ho sebelisa AWK le R

Ha re utloisise bothata

Ke ithutile eng: Ho hlopha ho thata, haholo haeba data e ajoa.

Ho 'na ho ne ho bonahala eka joale ke utloisisa moelelo oa bothata. Ke ne ke hloka feela ho hlophisa data ka kholomo ea SNP, eseng ka batho. Joale li-SNP tse 'maloa li tla bolokoa karolong e fapaneng ea data, ebe mosebetsi oa "bohlale" oa Parquet o "bula feela haeba boleng bo le teng" bo tla iponahatsa ka khanya eohle ea eona. Ka bomalimabe, ho hlophisa mela e limilione tse likete e hasaneng har'a sehlopha ho ipakile e le mosebetsi o boima.

Ka sebele AWS ha e batle ho khutlisa chelete ka lebaka la "Ke seithuti se ferekaneng". Kamora hore ke mathe ho hlophisa Amazon Glue, e ile ea nka matsatsi a 2 mme ea soahlamana.

Ho thoe'ng ka ho arola?

Ke ithutile eng: Likarolo tsa Spark li tlameha ho leka-lekana.

Eaba ke tla le mohopolo oa ho arola data ho li-chromosome. Ho na le tse 23 tsa tsona (le tse ling tse 'maloa haeba u ela hloko DNA ea mitochondrial le libaka tse se nang 'mapa).
Sena se tla u lumella ho arola data ka likotoana tse nyane. Haeba o eketsa mohala o le mong feela mosebetsing oa ho romella Spark ho sengoloa sa Glue partition_by = "chr", joale data e lokela ho aroloa ka linkho.

Ho hlahisa 25TB ho sebelisa AWK le R
Genome e na le likaroloana tse ngata tse bitsoang li-chromosome.

Ka bomalimabe, ha ea ka ea sebetsa. Li-chromosome li na le boholo bo sa tšoaneng, e leng se bolelang palo e fapaneng ea boitsebiso. Sena se bolela hore mesebetsi eo Spark a neng a e romela ho basebetsi e ne e sa leka-lekanngoa 'me e phethoa butle hobane li-node tse ling li ile tsa fela kapele 'me li ne li sa sebetse. Leha ho le joalo, mesebetsi e ile ea phethoa. Empa ha u kopa SNP e le 'ngoe, ho se leka-lekane ho ile ha boela ha baka mathata. Litsenyehelo tsa ho sebetsa li-SNP ho li-chromosome tse kholoanyane (ke hore, moo re batlang ho fumana data) li theohile feela ka karolo ea 10. E ngata, empa e sa lekana.

Ho thoe'ng haeba re e arola likarolo tse nyenyane le ho feta?

Ke ithutile eng: Le ka mohla u se ke ua leka ho etsa li-partitions tse limilione tse 2,5 ho hang.

Ke ile ka etsa qeto ea ho tsoa 'me ka arola SNP e' ngoe le e 'ngoe. Sena se ne se tiisa hore likaroloana li lekana ka boholo. E NE E LE KHOpolo E MABE. Ke sebelisitse Glue mme ka eketsa mohala o se nang molato partition_by = 'snp'. Mosebetsi o ile oa qala 'me oa qala ho etsoa. Ka mor'a letsatsi ke ile ka hlahloba 'me ka bona hore ho ne ho se letho le ngotsoeng ho S3, kahoo ke ile ka bolaea mosebetsi oo. Ho bonahala eka Sekhomaretsi se ne se ngola lifaele tsa mahareng sebakeng se patiloeng ho S3, lifaele tse ngata, mohlomong limilione tse 'maloa. Ka lebaka leo, phoso ea ka e ile ea bitsa liranta tse fetang sekete ’me ha ea ka ea khahlisa moeletsi oa ka.

Ho arola + ho hlopha

Ke ithutile eng: Ho hlopha ho ntse ho le thata, joalo ka ho lokisa Spark.

Boiteko ba ka ba ho qetela ba ho arola bo ile ba nkama ho arola li-chromosome ebe ke hlophisa karolo ka 'ngoe. Ka khopolo, sena se ne se tla potlakisa potso e 'ngoe le e' ngoe hobane data e lakatsehang ea SNP e ne e tlameha ho ba ka har'a likarolo tse 'maloa tsa Parquet ka har'a mefuta e fanoeng. Ka bomalimabe, ho hlophisa esita le data e arohaneng e bile mosebetsi o boima. Ka lebaka leo, ke ile ka fetohela ho EMR bakeng sa sehlopha sa moetlo mme ka sebelisa maemo a robeli a matla (C5.4xl) le Sparklyr ho theha phallo ea mosebetsi e bonolo haholoanyane ...

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

...leha ho le jwalo, mosebetsi o ne o ntse o eso phethehe. Ke e hlophisitse ka mekhoa e fapaneng: ho eketsa kabo ea mohopolo bakeng sa mohlahlobi e mong le e mong oa lipotso, li-node tse sebelisitsoeng tse nang le mohopolo o mongata, mefuta e fapaneng ea phatlalatso (liphatlalatso tse fapaneng), empa nako le nako ha tsena li fetoha mehato ea halofo, mme butle-butle baphethahatsi ba ile ba qala. ho hloleha ho fihlela tsohle di emisa.

Ke ntse ke iqapela haholoanyane

Ke ithutile eng: Ka linako tse ling data e khethehileng e hloka tharollo e khethehileng.

SNP ka 'ngoe e na le boleng ba boemo. Ena ke nomoro e tsamaellanang le palo ea metheo e haufi le chromosome ea eona. Ena ke tsela e ntle le ea tlhaho ea ho hlophisa lintlha tsa rona. Qalong ke ne ke batla ho arola ka likarolo tsa chromosome ka 'ngoe. Ka mohlala, maemo 1 - 2000, 2001 - 4000, joalo-joalo. Empa bothata ke hore li-SNP ha li ajoa ka ho lekana ho li-chromosome, ka hona, boholo ba sehlopha bo tla fapana haholo.

Ho hlahisa 25TB ho sebelisa AWK le R

Ka lebaka leo, ke ile ka fihla ho arohanngoa ha maemo ka lihlopha (boemo). Ke sebelisa lintlha tse seng li kopitsoe, ke ile ka etsa kopo ea ho fumana lethathamo la li-SNP tse ikhethang, maemo a tsona le li-chromosome. Eaba ke hlophisa lintlha ka har'a chromosome e 'ngoe le e' ngoe 'me ka bokella li-SNP ka lihlopha (bin) tsa boholo bo fanoeng. Ha re re li-SNP tse 1000 ka 'ngoe. Sena se ile sa mpha kamano ea SNP-to-group-per-chromosome.

Qetellong, ke entse lihlopha (bin) tsa 75 SNPs, lebaka le tla hlalosoa ka tlase.

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

Leka pele ka Spark

Ke ithutile eng: Spark aggregation e potlakile, empa ho arola ho ntse ho bitsa chelete e ngata.

Ke ne ke batla ho bala foreimi ena ea data e nyane (2,5 milione) ho Spark, ke e kopanye le data e tala, ebe ke e arola ka kholomo e sa tsoa eketsoa. 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')
  )

Ke sebelisitse sdf_broadcast(), kahoo Spark oa tseba hore e lokela ho romela setšoantšo sa data ho li-node tsohle. Sena se na le thuso haeba data e le nyane ka boholo mme e hlokahala bakeng sa mesebetsi eohle. Ho seng joalo, Spark e leka ho ba bohlale le ho aba data kamoo ho hlokahalang, e leng se ka bakang ho theoha butle.

Hape, maikutlo a ka ha aa ka a sebetsa: mesebetsi e ile ea sebetsa ka nako e itseng, ea qeta mokhatlo, 'me joale, joaloka baphethahatsi ba qalileng ka ho arola, ba qala ho hlōleha.

Ho eketsa AWK

Ke ithutile eng: U se ke ua robala ha u ntse u rutoa lintho tsa motheo. Ehlile ho na le motho ea seng a rarolotse bothata ba hau morao koana ka bo-1980.

Ho fihlela joale, lebaka la liphoso tsohle tsa ka le Spark e ne e le ho hlaka ha data sehlopheng. Mohlomong boemo bo ka ntlafatsoa ka phekolo ea pele. Ke nkile qeto ea ho leka ho arola lintlha tse tala tsa mongolo ka likholomo tsa li-chromosome, kahoo ke ne ke tšepile ho fa Spark "data e arotsoeng pele".

Ke batlile ho StackOverflow mokhoa oa ho arola ka boleng ba kholomo mme ka e fumana karabo e kholo joalo. Ka AWK o ka arola faele ea mongolo ka boleng ba kholomo ka ho e ngola ka script ho fapana le ho romella liphetho ho. stdout.

Ke ngotse script ea Bash ho e leka. Khoasolla e 'ngoe ea li-TSV tse pakiloeng, ebe oa e phutholla ka ho sebelisa gzip le rometsoe ho awk.

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

E ile ea sebetsa!

Ho tlatsa li-cores

Ke ithutile eng: gnu parallel - ke ntho ea boselamose, bohle ba lokela ho e sebelisa.

Karohano e ne e lieha haholo mme ha ke qala htopho lekola ts'ebeliso ea mohlala o matla (le o theko e boima) oa EC2, ho ile ha fumaneha hore ke ne ke sebelisa konokono e le 'ngoe feela le memori e ka bang 200 MB. Ho rarolla bothata le ho se lahleheloe ke chelete e ngata, re ile ra tlameha ho fumana mokhoa oa ho bapisa mosebetsi. Ka lehlohonolo, bukeng e hlollang ka ho feletseng Saense ea data ho Command Line Ke fumane khaolo ea Jeron Janssens mabapi le parallelization. Ho eona ke ithutile ka gnu parallel, mokhoa o bonolo haholo oa ho kenya tšebetsong multithreading ho Unix.

Ho hlahisa 25TB ho sebelisa AWK le R
Ha ke qala karohano ke sebelisa ts'ebetso e ncha, ntho e 'ngoe le e' ngoe e ne e le hantle, empa ho ne ho ntse ho e-na le bothata - ho khoasolla lintho tsa S3 ho disk ho ne ho sa potlake haholo ebile ho sa bapisoa ka botlalo. Ho lokisa sena, ke entse sena:

  1. Ke fumane hore hoa khoneha ho kenya ts'ebetsong ea S3 download sethaleng ka ho toba phapeng, ho felisa ka ho feletseng polokelo ea mahareng ho disk. Sena se bolela hore nka qoba ho ngola lintlha tse tala ho disk le ho sebelisa tse nyane, ka hona li theko e tlase, polokelo ho AWS.
  2. sehlopha aws configure set default.s3.max_concurrent_requests 50 e ekelitse haholo palo ea likhoele tseo AWS CLI e li sebelisang (ka ho sa feleng ho na le 10).
  3. Ke fetohetse ho mohlala oa EC2 o ntlafalitsoeng bakeng sa lebelo la marang-rang, ka tlhaku n ka lebitso. Ke fumane hore tahlehelo ea matla a ho sebetsa ha o sebelisa n-maemo a feta ho lefshoa ke ho eketseha ha lebelo la ho laela. Bakeng sa mesebetsi e mengata ke ne ke sebelisa c5n.4xl.
  4. Fetohile gzip mabapi le pigz, sena ke sesebelisoa sa gzip se ka etsang lintho tse pholileng ho bapisa mosebetsi oa pele o sa bapisoang oa ho fokotsa lifaele (sena se thusitse hanyane).

# 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

Mehato ena e kopantsoe hammoho ho etsa hore ntho e 'ngoe le e' ngoe e sebetse ka potlako haholo. Ka ho eketsa lebelo la ho jarolla le ho felisa ho ngola ha disk, joale ke ne ke khona ho sebetsana le sephutheloana sa 5 terabyte ka lihora tse 'maloa feela.

Tweet ena e tlameha ebe e boletse 'TSV'. Ijoo.

Ho sebelisa data e sa tsoa aroloa

Ke ithutile eng: Spark e rata data e sa hatelletsoeng mme ha e rate ho kopanya likarolo.

Hona joale data e ne e le S3 ka mokhoa o sa phutholohang (bala: o arolelanoa) le mokhoa o hlophisitsoeng, 'me nka khutlela ho Spark hape. Ntho e makatsang e ne e nkemetse: Ke ile ka boela ka hlōleha ho finyella seo ke neng ke se batla! Ho ne ho le thata haholo ho bolella Spark hantle hore na data e arotsoe joang. 'Me le ha ke etsa sena, ho ile ha fumaneha hore ho na le likarolo tse ngata haholo (likete tse 95),' me ha ke sebelisa coalesce e fokolitse palo ea tsona ho isa tekanyong e utloahalang, sena se ile sa senya karohano ea ka. Ke na le bonnete ba hore sena se ka lokisoa, empa kamora matsatsi a 'maloa ke ntse ke batla ha kea ka ka fumana tharollo. Qetellong ke ile ka qeta mesebetsi eohle ea Spark, le hoja ho ile ha nka nakoana 'me lifaele tsa ka tse arohaneng tsa Parquet li ne li se nyenyane haholo (~ 200 KB). Leha ho le joalo, data e ne e le moo e neng e hlokahala.

Ho hlahisa 25TB ho sebelisa AWK le R
E nyane haholo ebile ha e lekane, e babatseha!

E etsa liteko tsa lipotso tsa lehae tsa Spark

Ke ithutile eng: Spark e na le chelete e ngata haholo ha e rarolla mathata a bonolo.

Ka ho khoasolla data ka mokhoa o bohlale, ke khonne ho lekola lebelo. Theha mongolo oa R ho tsamaisa seva sa lehae sa Spark, ebe o kenya data ea Spark ho tsoa sebakeng sa polokelo ea sehlopha sa Parquet (bin). Ke lekile ho kenya data kaofela empa ha ke a khona ho etsa hore Sparklyr e lemohe karohano.

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)

Ho bolaoa ho ile ha nka metsotsoana e 29,415. Ho betere haholo, empa ha e ntle haholo bakeng sa tlhahlobo ea bongata ba eng kapa eng. Ho feta moo, ke ne ke sa khone ho potlakisa lintho ka caching hobane ha ke leka ho boloka foreimi ea data mohopolong, Spark e ne e lula e soahlamana, leha ke ne ke abela memori e fetang 50 GB ho dataset e boima bo ka tlase ho 15.

Khutlela ho AWK

Ke ithutile eng: Li-associative arrays ho AWK li sebetsa hantle haholo.

Ke ile ka hlokomela hore nka finyella lebelo le holimo. Ke ile ka hopola seo ka tsela e makatsang Thuto ea AWK ka Bruce Barnett Ke balile ka karolo e monate e bitsoang "lihlopha tse kopanetsoeng" Ha e le hantle, tsena ke li-pair tsa bohlokoa, tseo ka mabaka a mang li neng li bitsoa ka tsela e fapaneng ho AWK, kahoo ka tsela e itseng ke ne ke sa nahane haholo ka tsona. Roman Cheplyaka hopola hore lentsoe "associative arrays" le khale haholo ho feta lentsoe "key-value pair". Leha u sheba bohlokoa ba bohlokoa ho Google Ngram, u ke ke ua bona lentsoe lena moo, empa u tla fumana li-associative arrays! Ntle le moo, "key-value pair" hangata e amahanngoa le database, kahoo hoa utloahala ho e bapisa le hashmap. Ke ile ka hlokomela hore nka sebelisa li-associative arrays ho amahanya li-SNP tsa ka le tafole ea bin le data e tala ntle le ho sebelisa Spark.

Ho etsa sena, ho script ea AWK ke sebelisitse block BEGIN. Ena ke karolo ea khoutu e etsoang pele mola oa pele oa data o fetisetsoa karolong e ka sehloohong ea 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"
}

sehlopha while(getline...) e laetse mela eohle ho tsoa sehlopheng sa CSV (bin), beha kholomo ea pele (lebitso la SNP) e le senotlolo sa sehlopha sa asociative. bin le boleng ba bobeli (sehlopha) e le boleng. Ebe ka bolokong { }, e etsoang meleng eohle ea faele e kholo, mola o mong le o mong o romelloa faeleng ea tlhahiso, e amohelang lebitso le ikhethang ho latela sehlopha sa eona (bin): ..._bin_"bin[$1]"_....

Mefuta e fapaneng batch_num и chunk_id e tsamaellana le data e fanoeng ke phaephe, ho qoba maemo a lebelo, 'me khoele e' ngoe le e 'ngoe ea polao e ntse e sebetsa parallel, e ile ea ngolla faele ea eona e ikhethang.

Kaha ke hasantse lintlha tsohle tse tala ka har'a li-folders tsa li-chromosome tse setseng tekong ea ka ea pele ea AWK, joale nka ngola mongolo o mong oa Bash ho sebetsana le chromosome e le 'ngoe ka nako le ho romela lintlha tse tebileng tse arohaneng ho 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/*

Script e na le likarolo tse peli parallel.

Karolong ea pele, data e baloa ho tsoa lifaeleng tsohle tse nang le tlhaiso-leseling e mabapi le chromosome e lakatsehang, ebe data ena e ajoa ho likhoele, tse tsamaisang lifaele ka lihlopha tse loketseng (bin). Ho qoba maemo a morabe ha likhoele tse ngata li ngolla faeleng e le 'ngoe, AWK e fetisa mabitso a lifaele ho ngola lintlha libakeng tse fapaneng, mohlala. chr_10_bin_52_batch_2_aa.csv. Ka lebaka leo, lifaele tse ngata tse nyane li entsoe ka disk (bakeng sa sena ke sebelisitse li-volume tsa terabyte EBS).

Conveyor ho tloha karolong ea bobeli parallel e feta har'a lihlopha (bin) ebe e kopanya lifaele tsa bona ka bomong ho CSV e tloaelehileng c catebe o li romela kantle ho naha.

Khaso ea R?

Ke ithutile eng: U ka ikopanya stdin и stdout ho tsoa ho R script, 'me ka hona e sebelise ka phaepheng.

E kanna eaba u hlokometse mola ona ho script ea hau ea Bash: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... E fetolela lifaele tsohle tsa sehlopha tse kopantsoeng (bin) ho sengoloa sa R ​​se ka tlase. {} ke mokhoa o khethehileng parallel, e kenyang data leha e le efe eo e e romelang ho molapo o boletsoeng ka ho toba taelong ka boeona. Khetho {#} e fana ka ID e ikhethang ea khoele, le {%} e emela nomoro ea sekotjana sa mosebetsi (e phetoa, empa ha ho mohla ka nako e le 'ngoe). Lethathamo la likhetho tsohle li ka fumanoa ho litokomane.

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

Ha ho fetoha file("stdin") fetisoa ho readr::read_csv, data e fetoletsoeng ho R script e kenngoa ka foreiming, eo joale e leng sebopeho .rds-faele e sebelisoa aws.s3 e ngotsoe ka kotloloho ho S3.

RDS ke ntho e kang mofuta o monyane oa Parquet, ntle le mabenyane a polokelo ea libui.

Kamora ho qeta sengoloa sa Bash ke ile ka fumana bongata .rds-lifaele tse fumanehang ho S3, tse ileng tsa ntumella ho sebelisa khatello e sebetsang hantle le mefuta e hahiloeng.

Ho sa tsotellehe tšebeliso ea brake R, ntho e 'ngoe le e' ngoe e ile ea sebetsa ka potlako haholo. Ha ho makatse hore ebe likarolo tsa R tse balang le ho ngola data li ntlafalitsoe haholo. Ka mor'a ho hlahloba chromosome e le 'ngoe ea boholo bo bohareng, mosebetsi o ile oa phethoa ka mohlala oa C5n.4xl ka lihora tse ka bang peli.

Meeli ea S3

Ke ithutile eng: Ka lebaka la ts'ebetso e bohlale ea tsela, S3 e khona ho sebetsana le lifaele tse ngata.

Ke ne ke tšoenyehile hore na S3 e tla khona ho sebetsana le lifaele tse ngata tse fetiselitsoeng ho eona. Nka etsa hore mabitso a lifaele a be le moelelo, empa S3 e ne e tla a batla joang?

Ho hlahisa 25TB ho sebelisa AWK le R
Li-folders ho S3 ke tsa pontšo feela, ha e le hantle tsamaiso ha e thahaselle letšoao /. Ho tsoa leqepheng la S3 FAQ.

Ho bonahala eka S3 e emela tsela ea faele e itseng e le senotlolo se bonolo mofuteng oa tafole ea hash kapa database e thehiloeng litokomaneng. Bakete e ka nkoa e le tafole, 'me lifaele li ka nkoa e le lirekoto tafoleng eo.

Kaha lebelo le katleho li bohlokoa ho etsa phaello Amazon, ha ho makatse hore ebe sistimi ena ea key-as-a-file-path e ntlafalitse haholo. Ke ile ka leka ho fumana tekanyo: e le hore ke se ke ka etsa likōpo tse ngata tsa ho fumana, empa hore likōpo li phethiloe kapele. Ho ile ha fumaneha hore ho molemo ho etsa lifaele tse ka bang likete tse 20 tsa li-bin. Ke nahana hore haeba re tsoela pele ho ntlafatsa, re ka finyella keketseho ea lebelo (mohlala, ho etsa nkho e khethehileng bakeng sa data feela, kahoo re fokotsa boholo ba tafole ea ho sheba). Empa ho ne ho se na nako kapa chelete bakeng sa liteko tse eketsehileng.

Ho thoe'ng ka ho lumellana ha sefapano?

Seo ke Ithutileng sona: Lebaka la pele la ho senya nako ke ho ntlafatsa mokhoa oa hau oa ho boloka pele ho nako.

Mothating ona, ho bohlokoa haholo ho ipotsa: "Hobaneng u sebelisa mofuta oa faele ea proprietary?" Lebaka le teng ka lebelo la ho jarolla (lifaele tsa CSV tsa gzipped li nkile nako e telele ea 7 ho kenya) le ho tsamaellana le phallo ea rona ea mosebetsi. Nka nahana hape haeba R e ka kenya lifaele tsa Parquet (kapa Arrow) habonolo ntle le Spark load. Motho e mong le e mong ka laboratoring ea rona o sebelisa R, 'me haeba ke hloka ho fetolela data ho sebopeho se seng, ke ntse ke e-na le data ea pele ea mongolo, kahoo nka khona ho tsamaisa lipeipi hape.

Karohano ya mosebetsi

Ke ithutile eng: Se ke oa leka ho ntlafatsa mesebetsi ka letsoho, lumella komporo ho e etsa.

Ke tlositse phallo ea mosebetsi ho chromosome e le 'ngoe, joale ke hloka ho sebetsana le lintlha tse ling kaofela.
Ke ne ke batla ho hlahisa maemo a 'maloa a EC2 bakeng sa phetoho, empa ka nako e ts'oanang ke ne ke tšaba ho fumana mojaro o sa leka-lekaneng mesebetsing e fapaneng ea ts'ebetso (joalo ka ha Spark a ne a tšoeroe ke likarolo tse sa leka-lekaneng). Ntle le moo, ke ne ke sa thahaselle ho phahamisa mohlala o le mong ka chromosome, hobane bakeng sa liakhaonto tsa AWS ho na le moeli oa maemo a 10.

Eaba ke etsa qeto ea ho ngola script ho R ho ntlafatsa mesebetsi ea ho sebetsa.

Taba ea pele, ke ile ka kopa S3 ho bala hore na chromosome ka 'ngoe e nkile sebaka se kae sa polokelo.

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

Eaba ke ngola mosebetsi o nkang boholo bohle, o kopanya tatellano ea li-chromosome, o li arola ka lihlopha. num_jobs mme e o bolella hore na boholo ba mesebetsi yohle ya ho sebetsa bo fapane jwang.

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

Eaba ke matha ka har'a li-shuffles tse sekete ke sebelisa purrr mme ka khetha tse ntle ka ho fetisisa.

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

Kahoo ke ile ka qetella ke e-na le sehlopha sa mesebetsi e neng e lekana ka boholo. Joale ho neng ho setse feela e ne e le ho thatela mongolo oa ka oa pele oa Bash ka loop e kholo for. Ntlafatso ena e nkile metsotso e ka bang 10 ho ngola. 'Me sena se tlase haholo ho feta seo ke neng ke tla se sebelisa ho iketsetsa mesebetsi haeba e ne e sa leka-lekanngoa. Ka hona, ke nahana hore ke ne ke nepile ka ntlafatso ena ea pele.

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

Qetellong ke eketsa taelo ea ho koala:

sudo shutdown -h now

... mme tsohle tsa sebetsa! Ke sebelisa AWS CLI, ke hlahisitse maemo ke sebelisa khetho user_data a ba fa mangolo a Bash a mesebetsi ea bona hore a e sebetse. Ba ile ba matha 'me ba koala ka boeona, kahoo ke ne ke sa lefelle matla a eketsehileng a ho sebetsa.

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

Ha re phutheng!

Ke ithutile eng: API e lokela ho ba bonolo molemong oa boiketlo le bonolo ba tšebeliso.

Qetellong ke fumane data sebakeng se nepahetseng le foromo. Sohle se neng se setse e ne e le ho nolofatsa mokhoa oa ho sebelisa data ka hohle kamoo ho ka khonehang ho nolofalletsa basebetsi-'moho le 'na. Ke ne ke batla ho etsa API e bonolo bakeng sa ho etsa likopo. Haeba nakong e tlang ke etsa qeto ea ho tloha .rds ho lifaele tsa Parquet, joale sena e lokela ho ba bothata ho 'na, eseng ho basebetsi-'moho le 'na. Bakeng sa sena ke ile ka etsa qeto ea ho etsa sephutheloana sa ka hare sa R.

Theha le ho ngola sephutheloana se bonolo haholo se nang le lits'ebetso tse 'maloa feela tsa phihlello ea data tse hlophisitsoeng ho potoloha tšebetso get_snp. Ke boetse ke etselitse basebetsi-'moho le 'na websaete pkgdown, kahoo ba ka bona mehlala le litokomane habonolo.

Ho hlahisa 25TB ho sebelisa AWK le R

Smart caching

Ke ithutile eng: Haeba data ea hau e lokisitsoe hantle, ho boloka caching ho tla ba bonolo!

Kaha e 'ngoe ea li-workflows tsa mantlha e sebelisitse mohlala o ts'oanang oa tlhahlobo ho sephutheloana sa SNP, ke nkile qeto ea ho sebelisa binning molemong oa ka. Ha o fetisetsa data ka SNP, tlhahisoleseding eohle e tsoang ho sehlopha (bin) e khomaretsoe nthong e khutlisitsoeng. Ke hore, lipotso tsa khale li ka (ka khopolo) li ka potlakisa ts'ebetso ea lipotso tse ncha.

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

Ha ke ntse ke haha ​​​​sephutheloana, ke ile ka sebelisa li-benchmarks tse ngata ho bapisa lebelo ha ke sebelisa mekhoa e fapaneng. Ke khothaletsa hore u se ke ua hlokomoloha sena, hobane ka linako tse ling liphello li sa lebelloa. Ka mohlala, dplyr::filter ho ne ho potlakile ho feta ho hapa mela ka ho sebelisa indexing-based filtering, 'me ho khutlisa kholomo e le' ngoe ho tsoa foreimi ea data e tlhotliloeng ho ne ho potlakile ho feta ho sebelisa syntax ea indexing.

Ka kopo hlokomela hore ntho eo prev_snp_results e na le senotlolo snps_in_bin. Ena ke letoto la li-SNP tsohle tse ikhethang sehlopheng (bin), e u lumellang hore u hlahlobe kapele hore na u se u ntse u e-na le data ho tsoa potsong e fetileng. E boetse e etsa hore ho be bonolo ho hokahanya li-SNP tsohle ka sehlopha (bin) ka khoutu ena:

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

Liphetho

Hona joale re khona (mme re se re qalile ho sebetsa ka botebo) ho tsamaisa mehlala le maemo ao pele re neng re sa khone ho a fihlela. Ntho e ntle ke hore basebetsi-'moho le 'na ha baa tlameha ho nahana ka mathata afe kapa afe. Li na le ts'ebetso e sebetsang feela.

'Me leha sephutheloana se ba qenehela lintlha, ke lekile ho etsa hore sebopeho sa data se be bonolo hoo ba ka se utloisisang haeba ke nyamela ka tšohanyetso hosane ...

Lebelo le eketsehile haholo. Hangata re hlahloba likaroloana tsa bohlokoa tsa genome. Nakong e fetileng, re ne re sitoa ho etsa sena (ho ile ha bonahala e le theko e boima haholo), empa hona joale, ka lebaka la sebopeho sa sehlopha (bin) le caching, kopo ea SNP e le 'ngoe e nka ka karolelano metsotsoana e ka tlaase ho 0,1,' me tšebeliso ea data e joalo. tlase hore litšenyehelo tsa S3 ke matokomane.

fihlela qeto e

Sengoliloeng sena ha se tataiso ho hang. Tharollo e ile ea e-ba motho ka mong, 'me ka sebele e ne e se e nepahetseng. Ho e-na le hoo, ke travelogue. Ke batla hore ba bang ba utloisise hore liqeto tse joalo ha li bonahale li entsoe ka botlalo hloohong, ke phello ea teko le phoso. Hape, haeba u batla rasaense oa data, hopola hore ho sebelisa lisebelisoa tsena ka katleho ho hloka phihlelo, 'me phihlelo e hloka chelete. Ke thabetse hore ebe ke bile le mokhoa oa ho lefa, empa ba bang ba bangata ba ka etsang mosebetsi o tšoanang hantle ho mpheta ba ke ke ba ba le monyetla ka lebaka la ho hloka chelete le ho leka.

Lisebelisoa tse kholo tsa data li na le mefuta e mengata. Haeba u na le nako, ka sebele u ka ngola tharollo e potlakileng u sebelisa mekhoa e bohlale ea ho hloekisa, ho boloka le ho ntša data. Qetellong e tla ho tlhahlobo ea litšenyehelo tsa melemo.

Seo ke ithutileng sona:

  • ha ho na mokhoa o theko e tlaase oa ho hlalosa 25 TB ka nako;
  • ela hloko boholo ba lifaele tsa hau tsa Parquet le mokhatlo oa tsona;
  • Likarolo tsa Spark li tlameha ho leka-lekana;
  • Ka kakaretso, le ka mohla u se ke ua leka ho etsa li-partitions tse limilione tse 2,5;
  • Ho hlopha ho ntse ho le thata, joalo ka ho theha Spark;
  • ka linako tse ling data e khethehileng e hloka tharollo e khethehileng;
  • Spark aggregation e potlakile, empa ho arola ho ntse ho bitsa chelete e ngata;
  • u se ke ua robala ha ba u ruta lintho tsa motheo, mohlomong motho e mong o se a rarolotse bothata ba hao morao koana lilemong tsa bo-1980;
  • gnu parallel - ena ke ntho ea boselamose, e mong le e mong o lokela ho e sebelisa;
  • Spark e rata data e sa hatelletsoeng mme ha e rate ho kopanya likarolo;
  • Spark e na le ts'ebetso e ngata haholo ha e rarolla mathata a bonolo;
  • AWK's associative arrays e sebetsa hantle haholo;
  • o ka ikopanya stdin и stdout ho tsoa ho R script, 'me ka hona e sebelise liphaepheng;
  • Ka lebaka la ts'ebetsong ea tsela e bohlale, S3 e khona ho sebetsana le lifaele tse ngata;
  • Lebaka le ka sehloohong la ho senya nako ke ho ntlafatsa mokhoa oa hau oa polokelo pele ho nako;
  • u se ke ua leka ho ntlafatsa mesebetsi ka letsoho, lumella k'homphieutha ho e etsa;
  • API e lokela ho ba bonolo molemong oa boiketlo le bonolo ba tšebeliso;
  • Haeba data ea hau e lokisitsoe hantle, caching e tla ba bonolo!

Source: www.habr.com

Eketsa ka tlhaloso