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.
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.
Lawe wau i ka papa algorithms ma ke kulanui: "Ugh, ʻaʻohe mea e hopohopo e pili ana i ka paʻakikī computational o kēia mau algorithms sorting"
Ke ho'āʻo nei wau e hoʻokaʻawale i kahi kolamu ma kahi 20TB #spark papa: "No ke aha e lōʻihi ai kēia?" #Dataʻepekema nā hakakā.
ʻ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.
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.
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.
ʻ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.
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.
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.
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:
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.
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).
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.
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.
ʻAʻohe mea ʻoi aku ka maikaʻi ma mua o ka ʻike ʻana i nā cores āpau āu e uku nei ma AWS e hoʻohana ʻia. Mahalo iā gnu-parallel hiki iaʻu ke wehe a hoʻokaʻawale i kahi csv 19gig e like me ka wikiwiki e hiki iaʻu ke hoʻoiho. ʻAʻole hiki iaʻu ke loaʻa i ke ahi e holo i kēia. #Dataʻepekema#Linuxpic.twitter.com/Nqyba2zqEk
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.
ʻ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.
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.
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?
ʻ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.
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.
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.
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ī.
I kēia manawa, ua hoʻololi au i ka wrangling 25+ TB o ka ʻikepili genotyping maka no kaʻu lab. I koʻu hoʻomaka ʻana, ʻo ka hoʻohana ʻana i ka spark i lawe i 8 min & kumukūʻai $20 e nīnau i kahi SNP. Ma hope o ka hoʻohana ʻana iā AWK+ #rstats no ka hana ʻana, ʻoi aku ka liʻiliʻi ma mua o ka 10th o ke kekona a he $0.00001 ke kumukūʻai. ʻO koʻu pilikino #BigData lanakila. pic.twitter.com/ANOXVGrmkk
ʻ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!