Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R
Pehea e heluhelu ai i kēia ʻatikala: Ke kala aku nei au no ka lōʻihi a me ka haunaele o ka kikokikona. No ka mālama ʻana iā ʻoe i ka manawa, hoʻomaka wau i kēlā me kēia mokuna me kahi hoʻolauna "Ka mea aʻu i aʻo ai", e hōʻuluʻulu i ke ʻano o ka mokuna i hoʻokahi a ʻelua paha mau ʻōlelo.

"E hōʻike mai iaʻu i ka hopena!" Inā makemake ʻoe e ʻike i koʻu wahi i hele mai ai, a laila e lele i ka mokuna "E lilo i mea hou aʻe," akā manaʻo wau he mea hoihoi a maikaʻi hoʻi ka heluhelu ʻana e pili ana i ka hemahema.

Ua hana ʻia au i kēia manawa i ka hoʻonohonoho ʻana i kahi kaʻina hana no ka hoʻoponopono ʻana i ka nui o nā kaʻina DNA maka (ma ke ʻano he SNP chip). ʻO ka pono e kiʻi koke i ka ʻikepili e pili ana i kahi wahi genetic i hāʻawi ʻia (i kapa ʻia ʻo SNP) no ka hoʻohālikelike ʻana a me nā hana ʻē aʻe. Me ka hoʻohana ʻana iā R a me AWK, ua hiki iaʻu ke hoʻomaʻemaʻe a hoʻonohonoho i ka ʻikepili ma ke ʻano kūlohelohe, me ka wikiwiki o ka hoʻoili ʻana i nā nīnau. ʻAʻole i maʻalahi kēia iaʻu a makemake i nā ʻike he nui. E kōkua kēia ʻatikala iā ʻoe e pale i kekahi o kaʻu mau hewa a hōʻike iā ʻoe i kaʻu mea i pau ai.

ʻO ka mea mua, kekahi mau wehewehe hoʻolauna.

ʻikepili

Ua hāʻawi mai kā mākou kikowaena hoʻoponopono ʻikepili genetic i ka ʻikepili ma ke ʻano he 25 TB TSV. Ua loaʻa iaʻu i hoʻokaʻawale ʻia i loko o 5 mau pūʻulu i hoʻopili ʻia e Gzip, aia kēlā me kēia ma kahi o 240 mau faila ʻehā-gigabyte. Loaʻa i kēlā me kēia lālani ka ʻikepili no hoʻokahi SNP mai hoʻokahi kanaka. Ma ka huina, ua lawe ʻia nā ʻikepili ma ~ 2,5 miliona SNP a me ~ 60 tausani mau kānaka. Ma waho aʻe o ka ʻike SNP, loaʻa i nā faila nā kolamu he nui me nā helu e hōʻike ana i nā ʻano like ʻole, e like me ka ikaika o ka heluhelu ʻana, ke alapine o nā alleles like ʻole, etc. Ma kahi o 30 mau kolamu me nā waiwai kū hoʻokahi.

Holomua

E like me kekahi papahana hoʻokele ʻikepili, ʻo ka mea nui loa ka hoʻoholo ʻana pehea e hoʻohana ʻia ai ka ʻikepili. Ma keia hihia e koho nui mākou i nā hiʻohiʻona a me nā kahe hana no SNP ma muli o SNP. ʻO ia, pono mākou i ka ʻikepili ma hoʻokahi SNP i ka manawa. Pono wau e aʻo pehea e kiʻi ai i nā moʻolelo āpau e pili ana i kekahi o nā 2,5 miliona SNP me ka maʻalahi, wikiwiki a me ka maʻalahi.

Pehea e hana ʻole ai i kēia

No ka ʻōlelo ʻana i kahi cliché kūpono:

ʻAʻole au i hāʻule i hoʻokahi kaukani manawa, ua ʻike wale au i hoʻokahi kaukani ala e pale aku ai i ka hoʻopaʻa ʻana i kahi pūʻulu ʻikepili ma kahi ʻano hoʻopili pili.

ʻO ka ho'āʻo mua

He aha kaʻu i aʻo ai: ʻAʻohe ala maʻalahi e paʻi i ka 25 TB i ka manawa.

Ma hope o ka lawe ʻana i ka papa "Advanced Methods for Big Data Processing" ma ke Kulanui ʻo Vanderbilt, ua maopopo iaʻu aia ka hana ma ka ʻeke. Hoʻokahi hola a ʻelua paha e hoʻonohonoho i ka server Hive e holo i nā ʻikepili āpau a hōʻike i ka hopena. No ka mea ua mālama ʻia kā mākou ʻikepili ma AWS S3, ua hoʻohana wau i ka lawelawe ʻO Athena, hiki iā ʻoe ke hoʻopili i nā nīnau Hive SQL i ka ʻikepili S3. ʻAʻole pono ʻoe e hoʻonohonoho / hoʻāla i kahi hui Hive, a ke uku wale nei ʻoe no ka ʻikepili āu e ʻimi nei.

Ma hope o koʻu hōʻike ʻana iā Athena i kaʻu ʻikepili a me kona ʻano, ua holo wau i kekahi mau hoʻāʻo me nā nīnau e like me kēia:

select * from intensityData limit 10;

A loaʻa koke nā hopena i hoʻonohonoho pono ʻia. Mākaukau.

A hiki i ko mākou hoʻāʻo ʻana e hoʻohana i ka ʻikepili i kā mākou hana...

Ua noi ʻia au e huki i nā ʻike SNP a pau e hoʻāʻo ai i ke kumu hoʻohālike. Ua holo au i ka nīnau:


select * from intensityData 
where snp = 'rs123456';

... a hoʻomaka e kali. Ma hope o ʻewalu mau minuke a ʻoi aku ma mua o 4 TB o ka ʻikepili i noi ʻia, ua loaʻa iaʻu ka hopena. Hoʻopiʻi ʻo Athena ma ka nui o ka ʻikepili i loaʻa, $5 no kēlā me kēia terabyte. No laila he $20 a me ʻewalu mau minuke o ka kali ʻana i kēia noi hoʻokahi. No ka holo ʻana i ke kumu hoʻohālike ma nā ʻikepili āpau, pono mākou e kali i nā makahiki 38 a uku i $ 50 miliona. ʻIke loa, ʻaʻole kūpono kēia iā mākou.

Pono e hoʻohana i ka Parquet ...

He aha kaʻu i aʻo ai: E akahele i ka nui o kāu mau faila Parquet a me kā lākou hui.

Ua ho'āʻo mua wau e hoʻoponopono i ke kūlana ma ka hoʻololi ʻana i nā TSV āpau i Nā waihona parquet. Maikaʻi lākou no ka hana ʻana me nā pūʻulu ʻikepili nui no ka mea ua mālama ʻia ka ʻike i loko o ia mau mea ma ke ʻano columnar: aia kēlā me kēia kolamu i kona ʻāpana hoʻomanaʻo / disk, ʻokoʻa me nā faila kikokikona, aia nā lālani i nā mea o kēlā me kēia kolamu. A inā pono ʻoe e ʻimi i kahi mea, a laila heluhelu wale i ke kolamu i koi ʻia. Hoʻohui hou, mālama kēlā me kēia faila i ka nui o nā waiwai i loko o kahi kolamu, no laila inā ʻaʻole ka waiwai āu e ʻimi nei i ka pae o ke kolamu, ʻaʻole hoʻopau ʻo Spark i ka manawa e nānā i ka faila holoʻokoʻa.

Ua holo au i kahi hana maʻalahi Kopa AWS e hoʻohuli i kā mākou TSV i Parquet a hoʻokuʻu i nā faila hou i Athena. Ma kahi o 5 mau hola. Akā, i koʻu holo ʻana i ka noi, ua like ka nui o ka manawa a me ka liʻiliʻi liʻiliʻi o ke kālā e hoʻopau ai. ʻO ka ʻoiaʻiʻo ʻo Spark, e hoʻāʻo ana e hoʻokō i ka hana, wehe wale i kahi ʻāpana TSV a hoʻokomo i loko o kāna ʻāpana Parquet ponoʻī. A no ka nui o kēlā me kēia puʻupuʻu e loaʻa ai nā moʻolelo holoʻokoʻa o nā poʻe he nui, aia i kēlā me kēia faila nā SNP a pau, no laila pono ʻo Spark e wehe i nā faila a pau e unuhi i ka ʻike e pono ai.

ʻO ka mea e mahalo ai, ʻaʻole hiki ke hoʻokaʻawale ʻia ke ʻano paʻamau (a ʻōlelo ʻia) ʻo Parquet, snappy. No laila, paʻa kēlā me kēia mea hoʻokō i ka hana o ka wehe ʻana a hoʻoiho i ka ʻikepili piha 3,5 GB.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R

E hoʻomaopopo kākou i ka pilikia

He aha kaʻu i aʻo ai: He paʻakikī ka hoʻokaʻawale ʻana, ʻoi aku ka nui inā e puʻunaue ʻia ka ʻikepili.

Me he mea lā iaʻu i kēia manawa ua maopopo iaʻu ke ʻano o ka pilikia. Pono wau e hoʻokaʻawale i ka ʻikepili ma ke kolamu SNP, ʻaʻole na ka poʻe. A laila e mālama ʻia kekahi mau SNP i kahi ʻāpana ʻikepili ʻokoʻa, a laila ʻo ka hana "akamai" a Parquet "wehe wale inā aia ka waiwai i ka laulā" e hōʻike iā ia iho i kona nani. ʻO ka mea pōʻino, he hana paʻakikī ka hoʻokaʻawale ʻana i nā piliona o nā lālani i hoʻopuehu ʻia ma kahi pūʻulu.

ʻAʻole makemake ʻo AWS e hoʻopuka i kahi hoʻihoʻi ma muli o ke kumu "He haumāna hoʻopilikia wau". Ma hope o koʻu holo ʻana ma ka Amazon Glue, holo ia no 2 mau lā a hāʻule.

Pehea e pili ana i ka mahele?

He aha kaʻu i aʻo ai: Pono e kaulike nā māhele ma Spark.

A laila ua loaʻa iaʻu ka manaʻo e hoʻokaʻawale i ka ʻikepili i nā chromosomes. Aia he 23 o lākou (a he mau mea hou aʻe inā e noʻonoʻo ʻoe i ka DNA mitochondrial a me nā ʻāina i hoʻopaʻa ʻole ʻia).
E ʻae kēia iā ʻoe e hoʻokaʻawale i ka ʻikepili i nā ʻāpana liʻiliʻi. Inā ʻoe e hoʻohui i hoʻokahi laina i ka hana Spark export i loko o ka palapala Glue partition_by = "chr", a laila e māhele ʻia ka ʻikepili i mau bākeke.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R
Aia ka genome i nā ʻāpana he nui i kapa ʻia he chromosomes.

ʻO ka mea pōʻino, ʻaʻole i hana. He ʻokoʻa ka nui o nā Chromosomes, ʻo ia hoʻi ka nui o ka ʻike. ʻO ia hoʻi, ʻaʻole kaulike nā hana a Spark i hoʻouna aku ai i nā limahana a hoʻopau mālie no ka mea ua pau koke kekahi mau node a ua hana ʻole. Eia naʻe, ua pau nā hana. Akā i ka noi ʻana i hoʻokahi SNP, ua hoʻopilikia hou ke kaulike. ʻO ke kumukūʻai o ka hoʻoili ʻana i nā SNP ma nā chromosomes nui (ʻo ia hoʻi, kahi a mākou e makemake ai e kiʻi i ka ʻikepili) ua emi wale ma kahi o 10. Nui, akā ʻaʻole lawa.

He aha inā mākou e puʻunaue i nā ʻāpana liʻiliʻi?

He aha kaʻu i aʻo ai: Mai ho'āʻo e hana i nā ʻāpana 2,5 miliona.

Ua hoʻoholo wau e hele i waho a hoʻokaʻawale i kēlā me kēia SNP. ʻO kēia ka mea i hōʻoia i ka nui like o nā ʻāpana. HE MANAO INO. Ua hoʻohana au iā Glue a hoʻohui i kahi laina hala ʻole partition_by = 'snp'. Hoʻomaka ka hana a hoʻomaka e hoʻokō. I kekahi lā ma hope mai ua nānā au a ʻike ʻaʻohe mea i kākau ʻia iā S3, no laila ua pepehi wau i ka hana. Me he mea lā e kākau ana ʻo Glue i nā faila waena i kahi huna ma S3, nā faila he nui, ʻelua miliona paha. ʻO ka hopena, ʻoi aku ka nui o koʻu kuhi hewa ma mua o hoʻokahi kaukani kālā a ʻaʻole i ʻoluʻolu i koʻu kumu aʻo.

Hoʻokaʻawale + hoʻokaʻawale

He aha kaʻu i aʻo ai: He paʻakikī ka hoʻokaʻawale ʻana, e like me ke kani ʻana iā Spark.

ʻO kaʻu hoʻāʻo hope loa e hoʻokaʻawale iaʻu e hoʻokaʻawale i nā chromosomes a laila hoʻokaʻawale i kēlā me kēia ʻāpana. Ma ke kumumanaʻo, e wikiwiki kēia i kēlā me kēia nīnau no ka mea pono ka ʻikepili SNP i makemake ʻia i loko o kekahi mau ʻāpana Parquet i loko o kahi ākea. ʻO ka mea pōʻino, ʻo ka hoʻokaʻawale ʻana i ka ʻikepili i hoʻokaʻawale ʻia ua lilo ia i hana paʻakikī. ʻO ka hopena, ua hoʻololi au i EMR no kahi hui maʻamau a hoʻohana i ʻewalu mau manawa ikaika (C5.4xl) a me Sparklyr e hana i kahi kaila hana maʻalahi ...

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

... ʻaʻole naʻe i pau ka hana. Ua hoʻonohonoho au iā ia ma nā ʻano like ʻole: hoʻonui i ka hoʻokaʻawale hoʻomanaʻo no kēlā me kēia mea hoʻokō nīnau, hoʻohana i nā nodes me ka nui o ka hoʻomanaʻo, hoʻohana i nā ʻano hoʻolaha hoʻolaha (nā hoʻololi hoʻolaha hoʻolaha), akā i kēlā me kēia manawa ua lilo kēia i hapalua, a hoʻomaka mālie nā mea hoʻokō. e hāʻule a pau nā mea a pau.

Ke lilo nei au i mea noʻeau

He aha kaʻu i aʻo ai: I kekahi manawa pono nā ʻikepili kūikawā i nā hoʻonā kūikawā.

He kūlana kūlana ko kēlā me kēia SNP. He helu kēia e pili ana i ka helu o nā kumu ma kona chromosome. He ala maikaʻi a kūlohelohe kēia e hoʻonohonoho ai i kā mākou ʻikepili. I ka wā mua, makemake au e hoʻokaʻawale i nā ʻāpana o kēlā me kēia chromosome. No ka laʻana, kūlana 1 - 2000, 2001 - 4000, etc. Akā ʻo ka pilikia, ʻaʻole i puunaue like ʻia nā SNP ma nā chromosomes, no laila e ʻokoʻa ka nui o ka hui.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R

ʻO ka hopena, ua hōʻea au i ka hoʻokaʻawale ʻana o nā kūlana i nā ʻāpana (pae). Ke hoʻohana nei i ka ʻikepili i hoʻoiho mua ʻia, holo wau i kahi noi e kiʻi i kahi papa inoa o nā SNP kūʻokoʻa, ko lākou mau kūlana a me nā chromosomes. A laila hoʻokaʻawale au i ka ʻikepili i loko o kēlā me kēia chromosome a hōʻiliʻili i nā SNP i loko o nā pūʻulu (bin) o ka nui i hāʻawi ʻia. E ʻōlelo kākou he 1000 SNP kēlā me kēia. Hāʻawi kēia iaʻu i ka pilina SNP-to-group-per-chromosome.

I ka hopena, ua hana au i nā hui (bin) o 75 SNPs, e wehewehe ʻia ke kumu ma lalo nei.

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

E hoao mua me Spark

He aha kaʻu i aʻo ai: He wikiwiki ka hui ʻana o Spark, akā ʻoi aku ka pipiʻi o ka hoʻokaʻawale ʻana.

Makemake au e heluhelu i kēia kiʻi ʻikepili liʻiliʻi (2,5 miliona lālani) i Spark, e hui pū me ka ʻikepili maka, a laila e hoʻokaʻawale iā ia me ke kolamu 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')
  )

Ua hoʻohana au sdf_broadcast(), no laila ʻike ʻo Spark e hoʻouna i ke kiʻi ʻikepili i nā nodes a pau. Pono kēia inā liʻiliʻi ka nui o ka ʻikepili a koi ʻia no nā hana āpau. A i ʻole, hoʻāʻo ʻo Spark e naʻauao a puʻunaue i ka ʻikepili e like me ka mea e pono ai, hiki ke hoʻolohi.

A eia hou, ʻaʻole i hana koʻu manaʻo: ua hana nā hana no kekahi manawa, ua hoʻopau i ka hui, a laila, e like me nā mea hoʻokō i hoʻokumu ʻia e ka hoʻokaʻawale ʻana, hoʻomaka lākou e hāʻule.

Hoʻohui AWK

He aha kaʻu i aʻo ai: Mai hiamoe ke aʻo ʻia ʻoe i nā kumu. ʻOiaʻiʻo, ua hoʻoponopono kekahi i kou pilikia i ka makahiki 1980.

A hiki i kēia manawa, ʻo ke kumu o kaʻu mau hemahema me Spark ʻo ia ka jumble o ka ʻikepili i loko o ka pūpū. Hiki paha ke hoʻomaikaʻi ʻia ke kūlana me ka mālama mua ʻana. Ua hoʻoholo wau e hoʻāʻo e hoʻokaʻawale i ka ʻikepili kikokikona i loko o nā kolamu o nā chromosomes, no laila ua manaʻo wau e hāʻawi iā Spark i ka ʻikepili "pre-partitioned".

Ua ʻimi au ma StackOverflow no ka hoʻokaʻawale ʻana i nā koina kolamu a loaʻa he pane nui. Me AWK hiki iā ʻoe ke hoʻokaʻawale i kahi faila ma nā koina kolamu ma ke kākau ʻana iā ia i kahi palapala ma mua o ka hoʻouna ʻana i nā hopena i stdout.

Ua kākau wau i kahi palapala Bash e hoʻāʻo ai. Hoʻoiho i kekahi o nā TSV i hoʻopaʻa ʻia, a laila wehe ʻia me ka hoʻohana ʻana gzip a hoouna aku i awk.

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

Ua hana!

Hoʻopiha i nā kiko

He aha kaʻu i aʻo ai: gnu parallel - he mea kupua, pono e hoʻohana nā kānaka a pau.

Ua lohi ka kaʻawale ʻana a i koʻu hoʻomaka ʻana htope nānā i ka hoʻohana ʻana i kahi hiʻohiʻona ikaika (a pipiʻi) EC2, ua ʻike ʻia ua hoʻohana wau i hoʻokahi kumu a ma kahi o 200 MB o ka hoʻomanaʻo. No ka hoʻoponopono ʻana i ka pilikia a ʻaʻole lilo i ka nui o ke kālā, pono mākou e noʻonoʻo pehea e hoʻohālikelike ai i ka hana. ʻO ka mea pōmaikaʻi, i loko o kahi puke kupaianaha loa ʻIkepili ʻIke ma ka Laina Kauoha Ua loaʻa iaʻu kahi mokuna na Jeron Janssens e pili ana i ka parallelization. Mai ia mea au i aʻo ai e pili ana gnu parallel, he ala maʻalahi loa no ka hoʻokō ʻana i ka multithreading ma Unix.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R
I koʻu hoʻomaka ʻana i ka hoʻokaʻawale ʻana me ka hoʻohana ʻana i ke kaʻina hana hou, ua maikaʻi nā mea a pau, akā aia nō kahi bottleneck - ʻaʻole wikiwiki loa ka hoʻoiho ʻana i nā mea S3 i ka disk a ʻaʻole i hoʻohālikelike ʻia. No ka hoʻoponopono ʻana i kēia, hana wau i kēia:

  1. Ua ʻike wau hiki ke hoʻokō pololei i ka pae hoʻoiho S3 i ka pipeline, e hoʻopau loa i ka waiho waena ma ka disk. ʻO ia ke ʻano hiki iaʻu ke pale i ke kākau ʻana i ka ʻikepili maka i ka disk a hoʻohana i ka liʻiliʻi, a no laila ʻoi aku ka liʻiliʻi o ka waiho ʻana ma AWS.
  2. hui aws configure set default.s3.max_concurrent_requests 50 hoʻonui nui i ka helu o nā kaula i hoʻohana ʻia e AWS CLI (ma ka maʻamau he 10).
  3. Ua hoʻololi au i kahi hanana EC2 i hoʻopaʻa ʻia no ka wikiwiki o ka pūnaewele, me ka leka n ma ka inoa. Ua ʻike au i ka nalowale o ka mana hana i ka wā e hoʻohana ai i nā n-instances ma mua o ka uku ʻia e ka piʻi ʻana o ka wikiwiki hoʻouka. No ka nui o nā hana ua hoʻohana au i c5n.4xl.
  4. Hoʻololi gzip maluna o pigz, He mea hana gzip kēia e hiki ke hana i nā mea ʻoluʻolu e hoʻohālikelike i ka hana mua ʻole i hoʻohālikelike ʻia o ka decompressing faila (ua kōkua kēia i ka mea liʻiliʻi loa).

# 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

Hoʻohui ʻia kēia mau ʻanuʻu me kekahi i mea e hana wikiwiki ai nā mea a pau. Ma ka hoʻonui ʻana i ka wikiwiki o ka hoʻoiho ʻana a me ka hoʻopau ʻana i nā kākau disk, hiki iaʻu ke hana i kahi pūʻolo 5 terabyte i loko o kekahi mau hola.

Ua ʻōlelo paha kēia tweet iā 'TSV'. Auwe.

Ke hoʻohana nei i ka ʻikepili i hoʻopaʻa ʻia

He aha kaʻu i aʻo ai: Makemake ʻo Spark i ka ʻikepili i hoʻopaʻa ʻole ʻia a ʻaʻole makemake i ka hoʻohui ʻana i nā ʻāpana.

I kēia manawa, aia ka ʻikepili i ka S3 ma kahi ʻano unpacked (heluhelu: kaʻana like) a me ke ʻano semi-kauoha, a hiki iaʻu ke hoʻi hou i Spark. Ua kakali mai kekahi kahaha: ʻAʻole au i hoʻokō i kaʻu mea i makemake ai! He mea paʻakikī loa ka haʻi pololei ʻana iā Spark pehea i hoʻokaʻawale ʻia ai ka ʻikepili. A i koʻu hana ʻana i kēia, ua ʻike ʻia he nui loa nā ʻāpana (95 tausani), a i ka wā aʻu i hoʻohana ai coalesce ua ho'ēmi i kā lākou helu i nā palena kūpono, ua hoʻopau kēia i kaʻu ʻāpana. Manaʻo wau hiki ke hoʻopaʻa ʻia kēia, akā ma hope o ʻelua mau lā o ka ʻimi ʻana ʻaʻole hiki iaʻu ke loaʻa kahi hopena. Ua hoʻopau wau i nā hana āpau ma Spark, ʻoiai ua lōʻihi ka manawa a ʻaʻole liʻiliʻi loa kaʻu faila Parquet (~200 KB). Eia naʻe, aia ka ʻikepili i kahi i pono ai.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R
ʻAʻole liʻiliʻi a kūlike ʻole, kupanaha!

Ke hoʻāʻo nei i nā nīnau Spark kūloko

He aha kaʻu i aʻo ai: He nui loa ka Spark i ka wā e hoʻoponopono ai i nā pilikia maʻalahi.

Ma ka hoʻoiho ʻana i ka ʻikepili ma kahi ʻano akamai, ua hiki iaʻu ke hoʻāʻo i ka wikiwiki. E hoʻonohonoho i kahi palapala R e holo i kahi kikowaena Spark kūloko, a laila hoʻouka i kahi kiʻi ʻikepili Spark mai ka waihona pūʻulu Parquet i kuhikuhi ʻia (bin). Ua hoʻāʻo wau e hoʻouka i nā ʻikepili āpau akā ʻaʻole hiki iā Sparklyr ke ʻike i ka ʻāpana.

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 kekona ka hana ana. ʻOi aku ka maikaʻi, akā ʻaʻole maikaʻi loa no ka hoʻāʻo nui ʻana i kekahi mea. Eia hou, ʻaʻole hiki iaʻu ke wikiwiki i nā mea me ka caching no ka mea i koʻu hoʻāʻo ʻana e hūnā i kahi kiʻi ʻikepili i ka hoʻomanaʻo, hāʻule mau ʻo Spark, ʻoiai i ka wā aʻu i hoʻokaʻawale ai ma mua o 50 GB o ka hoʻomanaʻo i kahi dataset i emi iho ma mua o 15.

E hoʻi i AWK

He aha kaʻu i aʻo ai: He maikaʻi loa nā hui hui ma AWK.

Ua maopopo iaʻu hiki iaʻu ke hoʻokō i nā wikiwiki kiʻekiʻe. Ua hoʻomanaʻo wau i kēlā mea i kahi kupaianaha Aʻo AWK na Bruce Barnett Heluhelu au e pili ana i kahi hiʻona maikaʻi i kapa ʻia "hui hui" ʻO ka mea nui, he mau kī-waiwai nui kēia, no kekahi kumu i kapa ʻia ʻokoʻa ma AWK, a no laila ʻaʻole wau i noʻonoʻo nui iā lākou. Roman Cheplyaka ua hoʻomanaʻo ʻia ʻo ka huaʻōlelo "asociative arrays" ʻoi aku ka nui ma mua o ka huaʻōlelo "key-value pair". ʻOiai inā ʻoe e nānā i ka waiwai kī ma Google Ngram, ʻaʻole ʻoe e ʻike i kēia huaʻōlelo ma laila, akā e ʻike ʻoe i nā hui hui! Eia kekahi, pili pinepine ʻia ka "key-value pair" me nā waihona, no laila ʻoi aku ka maikaʻi o ka hoʻohālikelike ʻana me kahi hashmap. Ua ʻike wau hiki iaʻu ke hoʻohana i kēia mau hui hui e hoʻopili i kaʻu mau SNP me kahi papa bin a me ka ʻikepili maka me ka ʻole o ka hoʻohana ʻana iā Spark.

No ka hana ʻana i kēia, ma ka palapala AWK ua hoʻohana au i ka poloka BEGIN. He ʻāpana code kēia i hoʻokō ʻia ma mua o ka hāʻawi ʻia ʻana o ka laina mua o ka ʻikepili i ke kino nui o ka palapala.

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

hui while(getline...) hoʻouka i nā lālani a pau mai ka hui CSV (bin), hoʻonoho i ke kolamu mua (inoa SNP) i kī no ka hui hui. bin a ʻo ka waiwai ʻelua (hui) ʻo ia ka waiwai. A laila ma ka poloka { }, i hoʻokō ʻia ma nā laina āpau o ka faila nui, hoʻouna ʻia kēlā me kēia laina i ka faila puka, loaʻa kahi inoa kūʻokoʻa ma muli o kāna hui (bin): ..._bin_"bin[$1]"_....

Nā Loli batch_num и chunk_id ua kūlike i ka ʻikepili i hāʻawi ʻia e ka pipeline, e pale ana i kahi kūlana heihei, a me kēlā me kēia pae hoʻokō e holo ana parallel, i kākau i kāna faila kū hoʻokahi.

Ma muli o koʻu hoʻopuehu ʻana i nā ʻikepili maka a pau i loko o nā waihona ma nā chromosomes i waiho ʻia mai kaʻu hoʻokolohua mua me AWK, i kēia manawa hiki iaʻu ke kākau i kahi palapala Bash hou e hana i hoʻokahi chromosome i ka manawa a hoʻouna i nā ʻikepili i hoʻokaʻawale ʻia i 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/*

He ʻelua ʻāpana ka palapala parallel.

Ma ka ʻāpana mua, heluhelu ʻia ka ʻikepili mai nā faila a pau i loaʻa ka ʻike ma ka chromosome i makemake ʻia, a laila hoʻohele ʻia kēia ʻikepili ma nā pae, e puʻunaue ana i nā faila i nā hui kūpono (bin). No ka pale ʻana i nā kūlana lāhui ke kākau nā loina he nui i ka faila hoʻokahi, hāʻawi ʻo AWK i nā inoa faila e kākau ʻikepili i nā wahi like ʻole, e.g. chr_10_bin_52_batch_2_aa.csv. ʻO ka hopena, nui nā faila liʻiliʻi i hana ʻia ma ka disk (no kēia ua hoʻohana au i nā volumes terabyte EBS).

Conveyor mai ka pauku elua parallel hele i loko o nā pūʻulu (bin) a hoʻohui i kā lākou mau faila i CSV c maʻamau cata laila hoʻouna iā lākou no ka lawe ʻana aku.

Hoʻolaha ma R?

He aha kaʻu i aʻo ai: Hiki iā ʻoe ke hoʻokaʻaʻike mai stdin и stdout mai kahi palapala R, a no laila e hoʻohana iā ia i ka pipeline.

Ua ʻike paha ʻoe i kēia laina i kāu palapala Bash: ...cat chunked/*_bin_{}_*.csv | ./upload_as_rds.R.... Unuhi ia i nā waihona pūʻulu hui pū (bin) i loko o ka palapala R ma lalo nei. {} he ʻenehana kūikawā parallel, ka mea e hoʻokomo i kekahi ʻikepili i hoʻouna ʻia i ke kahawai i kuhikuhi ʻia i loko o ke kauoha ponoʻī. Koho {#} hāʻawi i kahi ID pae kū hoʻokahi, a {%} hōʻike i ka helu kau hana (i hana hou ʻia, akā ʻaʻole i ka manawa like). Hiki ke loaʻa kahi papa inoa o nā koho āpau ma palapala.

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

Ke hoololi file("stdin") hoʻouna ʻia i readr::read_csv, ua hoʻoili ʻia ka ʻikepili i unuhi ʻia i loko o ka palapala R i loko o kahi kiʻi, a laila ma ke ʻano .rds-file hoʻohana aws.s3 kākau pololei iā S3.

ʻO RDS kahi mea e like me ka mana ʻōpio o Parquet, me ka ʻole o ka waiho ʻana o ka leo.

Ma hope o ka pau ʻana o ka palapala Bash ua loaʻa iaʻu kahi pūpū .rds- nā faila i loaʻa ma S3, i ʻae iaʻu e hoʻohana i ka hoʻopiʻi kūpono a me nā ʻano i kūkulu ʻia.

ʻOiai ka hoʻohana ʻana i ka brake R, ua hana wikiwiki nā mea āpau. ʻAʻole ia he mea kupanaha, ʻoi aku ka maikaʻi o nā ʻāpana o R e heluhelu a kākau i ka ʻikepili. Ma hope o ka hoʻāʻo ʻana i hoʻokahi chromosome liʻiliʻi, ua hoʻopau ka hana ma kahi laʻana C5n.4xl ma kahi o ʻelua hola.

S3 palena

He aha kaʻu i aʻo ai: Mahalo i ka hoʻokō ʻana i ke ala akamai, hiki iā S3 ke mālama i nā faila he nui.

Ua hopohopo au inā hiki iā S3 ke mālama i nā faila he nui i hoʻoili ʻia iā ia. Hiki iaʻu ke hoʻomaopopo i nā inoa faila, akā pehea e ʻimi ai ʻo S3 iā lākou?

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R
ʻO nā waihona ma S3 he hōʻike wale nō, ʻoiai ʻaʻole makemake ka ʻōnaehana i ka hōʻailona /. Mai ka ʻaoʻao FAQ S3.

ʻIke ʻia ʻo S3 e hōʻike ana i ke ala i kahi faila ma ke ʻano he kī maʻalahi i ke ʻano o ka papaʻaina hash a i ʻole ka waihona waihona palapala. Hiki ke noʻonoʻo ʻia kahi bākeke ma ke ʻano he papaʻaina, a hiki ke manaʻo ʻia nā faila he mau moʻolelo ma ia papa.

No ka mea he mea nui ka wikiwiki a me ka pono i ka loaʻa ʻana o ka loaʻa kālā ma Amazon, ʻaʻole ia he mea kupanaha no ka hoʻonui ʻia ʻana o kēia ʻōnaehana key-as-a-file-path. Ua hoʻāʻo wau e ʻimi i kahi kaulike: i ʻole au e hana nui i nā noi, akā ua hoʻokō koke ʻia nā noi. Ua ʻike ʻia ʻoi aku ka maikaʻi o ka hana ʻana ma kahi o 20 tausani mau faila bin. Manaʻo wau inā e hoʻomau mākou i ka loiloi, hiki iā mākou ke hoʻokō i ka piʻi ʻana o ka wikiwiki (e like me ka hana ʻana i kahi bākeke kūikawā no ka ʻikepili wale nō, pēlā e hōʻemi ai i ka nui o ka papa ʻimi). Akā ʻaʻohe manawa a kālā paha no nā hoʻokolohua hou aʻe.

Pehea e pili ana i ka launa kea?

ʻO kaʻu mea i aʻo ai: ʻO ke kumu helu hoʻokahi o ka pau ʻana o ka manawa, ʻo ia ka hoʻomaikaʻi ʻana i kāu ʻano hoʻopaʻa ʻana ma mua.

I kēia manawa, he mea koʻikoʻi ke nīnau iā ʻoe iho: "No ke aha e hoʻohana ai i kahi format file proprietary?" Aia ke kumu i ka wikiwiki o ka hoʻouka ʻana (ʻo 7 mau manawa ka lōʻihi o ka hoʻouka ʻana i nā faila CSV gzipped) a me ka hoʻopili ʻana me kā mākou kaila hana. Hiki iaʻu ke noʻonoʻo inā hiki iā R ke hoʻouka maʻalahi i nā faila Parquet (a i ʻole Arrow) me ka ʻole o ka ukana Spark. Hoʻohana ka poʻe a pau o kā mākou lab i ka R, a inā pono wau e hoʻololi i ka ʻikepili i kahi ʻano ʻē aʻe, aia nō iaʻu ka ʻikepili kikokikona kumu, no laila hiki iaʻu ke holo hou i ka pipeline.

Mahele o ka hana

He aha kaʻu i aʻo ai: Mai ho'āʻo e hoʻonui i nā hana me ka lima, e hoʻokuʻu i ke kamepiula.

Ua hoʻopau wau i ke kahe hana ma hoʻokahi chromosome, i kēia manawa pono wau e hana i nā ʻikepili ʻē aʻe.
Makemake au e hoʻāla i kekahi mau manawa EC2 no ka hoʻololi ʻana, akā i ka manawa like ua makaʻu wau i ka loaʻa ʻana o kahi ukana kaulike ʻole ma waena o nā hana hoʻoili like ʻole (e like me ka loaʻa ʻana o Spark i nā ʻāpana kaulike ʻole). Eia kekahi, ʻaʻole wau i hoihoi i ka hoʻonui ʻana i hoʻokahi hiʻohiʻona no kēlā me kēia chromosome, no ka mea no nā moʻolelo AWS aia kahi palena paʻamau o 10 mau manawa.

A laila ua hoʻoholo wau e kākau i kahi palapala ma R e hoʻomaikaʻi i nā hana hana.

ʻO ka mea mua, ua noi au iā S3 e helu i ka nui o ka waiho ʻana o kēlā me kē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

A laila kākau wau i kahi hana e lawe i ka nui o ka nui, hoʻokaʻawale i ke ʻano o nā chromosomes, hoʻokaʻawale iā lākou i mau pūʻulu. num_jobs a haʻi iā ʻoe i ka ʻokoʻa o ka nui o nā hana hoʻoponopono āpau.

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

A laila holo au i hoʻokahi tausani shuffles me ka purrr a koho i ka mea maikaʻi loa.

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

No laila ua hoʻopau wau i kahi hoʻonohonoho o nā hana i like loa me ka nui. A laila ʻo nā mea a pau i koe, ʻo ke kāʻei ʻana i kaʻu palapala Bash ma mua i kahi loop loop for. Ma kahi o 10 mau minuke e kākau ai i kēia loiloi. A ʻoi aku ka liʻiliʻi o kēia ma mua o kaʻu e hoʻolilo ai i ka hana lima ʻana i nā hana inā ʻaʻole kaulike lākou. No laila, manaʻo wau ua pololei wau i kēia loiloi mua.

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

I ka hopena, hoʻohui au i ke kauoha pani:

sudo shutdown -h now

... a ua holo pono nā mea a pau! Ke hoʻohana nei i ka AWS CLI, ua hāpai au i nā manawa e hoʻohana ana i ke koho user_data hāʻawi iā lākou i nā palapala Bash o kā lākou mau hana no ka hana ʻana. Holo lākou a pani ʻokoʻa, no laila ʻaʻole au e uku no ka mana hana hou.

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

E kāʻei kāua!

He aha kaʻu i aʻo ai: Pono e maʻalahi ka API no ka maʻalahi a me ka maʻalahi o ka hoʻohana.

Ma hope loa ua loaʻa iaʻu ka ʻikepili ma kahi kūpono a me ke ʻano. ʻO nā mea a pau i koe, ʻo ia ka hoʻomaʻamaʻa ʻana i ke kaʻina hana o ka hoʻohana ʻana i ka ʻikepili i hiki ke maʻalahi i kaʻu mau hoa hana. Makemake au e hana i kahi API maʻalahi no ka hana ʻana i nā noi. Inā ma kēia mua aku e hoʻoholo wau e hoʻololi mai .rds i nā faila Parquet, a laila he pilikia kēia noʻu, ʻaʻole no kaʻu mau hoa hana. No kēia, ua hoʻoholo wau e hana i kahi pūʻolo R kūloko.

Kūkulu a palapala i kahi pūʻolo maʻalahi loa i loaʻa kekahi mau hana komo ʻikepili i hoʻonohonoho ʻia a puni kahi hana get_snp. Ua hana au i kahi pūnaewele no kaʻu mau hoa hana pkgdown, no laila hiki iā lākou ke ʻike maʻalahi i nā laʻana a me nā palapala.

Hoʻopau i ka 25TB me ka hoʻohana ʻana iā AWK a me R

Ka hoʻokolo ʻana

He aha kaʻu i aʻo ai: Inā mākaukau maikaʻi kāu ʻikepili, maʻalahi ka hoʻopaʻa ʻana!

Ma muli o ka hoʻohana ʻana o kekahi o nā kaʻina hana nui i ke ʻano hoʻohālikelike like i ka pūʻolo SNP, ua hoʻoholo wau e hoʻohana i ka binning i koʻu pono. I ka hoʻouna ʻana i ka ʻikepili ma o SNP, pili nā ʻike āpau mai ka hui (bin) i ka mea i hoʻihoʻi ʻia. ʻO ia hoʻi, hiki i nā nīnau kahiko (ma ke kumumanaʻo) ke wikiwiki i ka hana ʻana i nā nīnau 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 ke kūkulu ʻana i ka pūʻolo, ua holo au i nā pae kuhikuhi he nui e hoʻohālikelike i ka wikiwiki i ka wā e hoʻohana ai i nā ʻano hana like ʻole. Manaʻo wau ʻaʻole e haʻalele i kēia, no ka mea i kekahi manawa ʻaʻole i manaʻo ʻia nā hopena. ʻo kahi laʻana, dplyr::filter ʻoi aku ka wikiwiki ma mua o ka hopu ʻana i nā lālani me ka hoʻohana ʻana i ka kānana e pili ana i ka helu helu ʻana, a ʻoi aku ka wikiwiki o ka lawe ʻana i kahi kolamu hoʻokahi mai kahi kiʻi ʻikepili kānana ma mua o ka hoʻohana ʻana i ka syntax indexing.

E ʻoluʻolu e hoʻomaopopo i ka mea prev_snp_results aia ke kī snps_in_bin. He pūʻulu kēia o nā SNP kūʻokoʻa a pau i loko o kahi hui (bin), hiki iā ʻoe ke nānā wikiwiki inā loaʻa iā ʻoe ka ʻikepili mai kahi nīnau mua. He mea maʻalahi hoʻi ka hoʻopaʻa ʻana i nā SNP āpau i kahi hui (bin) me kēia code:

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

Nā hualoaʻa

I kēia manawa hiki iā mākou (a ua hoʻomaka e hana koʻikoʻi) holo i nā hiʻohiʻona a me nā hiʻohiʻona i hiki ʻole iā mākou ma mua. ʻO ka mea maikaʻi, ʻaʻole pono kaʻu mau hoa hana keʻena e noʻonoʻo i nā pilikia. He hana wale nō kā lākou.

A ʻoiai ʻo ka pōʻai e hoʻokaʻawale iā lākou i nā kikoʻī, ua hoʻāʻo wau e maʻalahi i ka format data i hiki iā lākou ke noʻonoʻo inā nalo koke wau i ka lā ʻapōpō...

Ua hoʻonui nui ʻia ka wikiwiki. ʻIke pinepine mākou i nā ʻāpana genome koʻikoʻi. Ma mua, ʻaʻole hiki iā mākou ke hana i kēia (ua lilo ia i mea kūʻai nui loa), akā i kēia manawa, mahalo i ka hui (bin) ka hoʻolālā a me ka caching, kahi noi no hoʻokahi SNP e lawe i ka awelika ma lalo o 0,1 kekona, a pēlā ka hoʻohana ʻana i ka ʻikepili. haʻahaʻa nā kumukūʻai no S3 he pīkī.

hopena

ʻAʻole kēia ʻatikala he alakaʻi. ʻO ka hoʻonā i hoʻololi ʻia he kanaka hoʻokahi, a aneane ʻaʻole maikaʻi loa. Akā, he huakaʻi hele. Makemake au e hoʻomaopopo i nā poʻe ʻē aʻe ʻaʻole i ʻike ʻia kēlā mau hoʻoholo i ke poʻo, ʻo ia ka hopena o ka hoʻāʻo a me ka hewa. Eia kekahi, inā ʻoe e ʻimi nei i kahi ʻepekema data, e hoʻomanaʻo i ka hoʻohana ʻana i kēia mau mea hana pono e pono ai ka ʻike, a ʻo ka ʻike ke kumukūʻai kālā. Ua hauʻoli wau i ka loaʻa ʻana o ka uku, akā ʻoi aku ka nui o nā poʻe ʻē aʻe i hiki ke hana i ka hana like ʻoi aku ka maikaʻi ma mua oʻu, ʻaʻole loa e loaʻa ka manawa kūpono no ka nele o ke kālā e hoʻāʻo ai.

Nui nā mea hana ʻikepili nui. Inā loaʻa iā ʻoe ka manawa, ʻaneʻane hiki iā ʻoe ke kākau i kahi hopena wikiwiki me ka hoʻohana ʻana i ka hoʻomaʻemaʻe ʻikepili akamai, ka mālama ʻana, a me nā ʻenehana unuhi. ʻO ka hope loa e iho i lalo i kahi kānana kumukūʻai-pono.

Ka mea aʻu i aʻo ai:

  • ʻAʻohe ala maʻalahi e paʻi i ka 25 TB i ka manawa;
  • e akahele i ka nui o kāu mau faila Parquet a me kā lākou hui;
  • Pono e kaulike nā ʻāpana ma Spark;
  • Ma keʻano laulā, mai hoʻāʻo e hana i 2,5 miliona mau ʻāpana;
  • Paʻakikī ka hoʻonohonoho ʻana, e like me ka hoʻonohonoho ʻana iā Spark;
  • i kekahi manawa pono nā ʻikepili kūikawā i nā hoʻonā kūikawā;
  • He wikiwiki ka hui ʻana o Spark, akā ʻoi aku ka pipiʻi o ka ʻāpana;
  • Mai hiamoe i ka wā e aʻo ai lākou iā ʻoe i nā kumu, ua hoʻoponopono paha kekahi i kou pilikia i ka makahiki 1980;
  • gnu parallel - he mea kupua kēia, pono e hoʻohana nā kānaka a pau;
  • Makemake ʻo Spark i ka ʻikepili i hoʻopaʻa ʻole ʻia a makemake ʻole i ka hoʻohui ʻana i nā ʻāpana;
  • He nui loa ka Spark i ka wā e hoʻoponopono ai i nā pilikia maʻalahi;
  • He maikaʻi loa nā hui hui o AWK;
  • hiki iā ʻoe ke hoʻokaʻaʻike mai stdin и stdout mai kahi palapala R, a no laila e hoʻohana i ka pipeline;
  • Mahalo i ka hoʻokō ʻana i ke ala akamai, hiki iā S3 ke hana i nā faila he nui;
  • ʻO ke kumu nui o ka hoʻopau ʻana i ka manawa ʻo ka hoʻomaʻamaʻa mua ʻana i kāu ʻano mālama;
  • Mai ho'āʻo e hoʻoikaika i nā hana me ka lima, e ʻae i ke kamepiula e hana;
  • Pono e maʻalahi ka API no ka maʻalahi a me ka maʻalahi o ka hoʻohana;
  • Inā mākaukau maikaʻi kāu ʻikepili, maʻalahi ka hoʻopaʻa ʻana!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka