Direkt zum Hauptinhalt

Simplifying Genomics Pipelines at Scale with Databricks Delta

SimplifyGenPipes_Social_Tile

Veröffentlicht: March 7, 2019

Open-Source9 min Lesezeit

 <a href="https://www.databricks.com/resources/ebook/delta-lake-running-oreilly?itm_data=simplifyinggenomicspipelinesdelta-blog-oreillydlupandrunning">Holen Sie sich eine Vorschau auf das neue E-Book von O'Reilly</a> für die Schritt-für-Schritt-Anleitung, die Sie für den Einstieg in Delta Lake benötigen.</p><hr><p><a class="dbce_cta" href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html" target="_blank">Testen Sie dieses Notebook in Databricks</a><br><em>Dieser Blogbeitrag ist der erste in unserer Reihe „Genomik Analysen at Scale“. In dieser Reihe zeigen wir, wie die </em><a href="https://www.databricks.com/product/genomics"><em>Databricks einheitliche Analyseplattform für Genomik</em></a><em> es Kunden ermöglicht, Genomikdaten im Populationsmaßstab zu analysieren. Ausgehend von der Ausgabe unserer </em><a href="https://www.databricks.com/blog/2018/09/10/building-the-fastest-dnaseq-pipeline-at-scale.html"><em>Genomik-Pipeline</em></a><em> bietet diese Reihe ein Tutorial zur Ausführung von Databricks zur Ausführung von Probenqualitätskontrollen, gemeinsamen Genotypisierungen, Kohortenqualitätskontrollen und erweiterten statistischen genetischen Analysen.</em></p><hr><p>Seit dem Abschluss des <a href="https://www.genome.gov/human-genome-project/What">Humangenomprojekts</a> im Jahr 2003 gab es eine Datenexplosion, die durch einen drastischen Preisverfall bei der DNA-Sequenzierung befeuert wurde: von 3 Mrd. $<sup>1</sup> für das erste Genom auf heute unter 1.000 $.</p><blockquote><p>[1] <a href="https://www.genome.gov/human-genome-project/What">Das Humangenomprojekt</a> war ein 3-Milliarden-Dollar-Projekt unter der Leitung des Department of Energy und der National Institutes of Health, das 1990 begann und 2003 abgeschlossen wurde.</p></blockquote><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/costpergenome_2017.jpg"><img class="aligncenter wp-image-39985" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/costpergenome_2017.jpg" alt="Kosten pro Genom" height="525"></a></p><p class="text-align-center">Quelle: <a href="https://www.genome.gov/about-genomics/fact-sheets/DNA-Sequencing-Costs-Data">Kosten der DNA-Sequenzierung: Daten</a></p><p>Daher ist der Bereich der Genomik mittlerweile so weit fortgeschritten, dass Unternehmen begonnen haben, DNA-Sequenzierungen im Bevölkerungs-Scale durchzuführen. Die Sequenzierung des DNA-Codes ist jedoch nur der erste Schritt. Anschließend müssen die Rohdaten in ein für die Analyse geeignetes Format umgewandelt werden. Typischerweise geschieht dies durch das Zusammenfügen einer Reihe von <a href="https://www.databricks.com/glossary/bioinformatics">Bioinformatik</a> -Tools mit benutzerdefinierten Skripten und die Verarbeitung der Daten auf einem einzigen Knoten, eine Probe nach der anderen, bis wir schließlich eine Sammlung genomischer Varianten erhalten. &nbsp;<a href="https://www.databricks.com/glossary/bioinformatics">Bioinformatiker</a> verbringen heute den größten Teil ihrer Zeit mit dem Aufbau und der Wartung dieser Pipelines. Da genomische Datensätze in den Petabyte-Scale angewachsen sind, ist es zu einer Herausforderung geworden, selbst die folgenden einfachen Fragen zeitnah zu beantworten:</p><ul><li>Wie viele Proben haben wir diesen Monat sequenziert?</li><li>Wie viele eindeutige Varianten wurden erkannt?</li><li>Wie viele Varianten haben wir in den verschiedenen Variationsklassen gesehen?</li></ul><p>Dieses Problem wird dadurch verschärft, dass Daten von Tausenden von Personen nicht gespeichert, nachverfolgt oder versioniert werden können und gleichzeitig zugänglich und abfragbar bleiben. Infolgedessen duplizieren Forscher bei der Durchführung ihrer Analysen häufig Teilmengen ihrer genomischen Daten, was den gesamten Speicherbedarf und die Kosten in die Höhe treibt. &nbsp;Um dieses Problem zu lindern, wenden Forscher heute eine Strategie der „Data Freezes“ an: Für einen Zeitraum von typischerweise sechs Monaten bis zu zwei Jahren stellen sie die Arbeit an neuen Daten ein und konzentrieren sich stattdessen auf eine eingefrorene Kopie vorhandener Daten. Es gibt keine Lösung, um Analysen über kürzere Zeiträume inkrementell aufzubauen, was den Forschungsfortschritt verlangsamt.</p><p>Es besteht ein dringender Bedarf an robuster Software, die genomische Daten im industriellen Maßstab verarbeiten kann und gleichzeitig Wissenschaftlern die Flexibilität bietet, die Daten zu untersuchen, ihre Analyse-Pipelines zu iterieren und neue Erkenntnisse zu gewinnen.</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/06/genomics-reader-writer_image3.png"><img class="aligncenter wp-image-44884" style="width:698px;" src="https://www.databricks.com/wp-content/uploads/2019/06/genomics-reader-writer_image3.png" alt="Architektur für die End-to-End-Genomik-Analysen mit Databricks" height="212"></a></p><p class="text-align-center">Abb. 1. Architektur für die End-to-End-Genomanalyse mit Databricks</p><p>Mit <a href="https://www.youtube.com/watch?v=gg-lEJ4sBaA">Databricks Delta: A Unified Management System for Echtzeit Big Data Analytics</a> hat die Databricks-Plattform einen großen Schritt zur Lösung der Probleme in den Bereichen Data Governance, Datenzugriff und Datenanalysen gemacht, mit denen Forscher heute konfrontiert sind. Mit <a href="https://www.databricks.com/product/delta-lake-on-databricks">Databricks Delta Lake</a> können Sie all Ihre Genomdaten an einem Ort speichern und Analysen erstellen, die in Echtzeit aktualisiert werden, sobald neue Daten aufgenommen werden. In Kombination mit Optimierungen in unserer <a href="https://www.databricks.com/product/genomics">einheitlichen Analyseplattform für Genomik</a> (UAP4G) zum Lesen, Schreiben und Verarbeiten von Genomik-Dateiformaten bieten wir eine End-to-End-Lösung für die Workflows von Genomik-Pipelines. Die UAP4G-Architektur bietet Flexibilität und ermöglicht es Kunden, ihre eigenen Pipelines anzuschließen und ihre eigenen tertiären Analysen zu entwickeln. Als Beispiel haben wir das folgende Dashboard hervorgehoben, das Metriken zur Qualitätskontrolle und Visualisierungen zeigt, die automatisiert berechnet, dargestellt und an Ihre spezifischen Anforderungen angepasst werden können.</p><p>https://www.youtube.com/watch?v=73fMhDKXykU</p><p>Im weiteren Verlauf dieses Blogs führen wir Sie durch die Schritte zur Erstellung des obigen Dashboards für die Qualitätskontrolle, das in Echtzeit aktualisiert wird, sobald die Verarbeitung von Samples abgeschlossen ist. Durch die Verwendung einer Delta-basierten Pipeline für die Verarbeitung genomischer Daten können unsere Kunden ihre Pipelines nun so betreiben, dass eine Echtzeit-Transparenz auf Stichprobenebene gewährleistet ist. Mit Databricks-Notebooks (und Integrationen wie GitHub und MLflow) können sie Analysen so nachverfolgen und versionieren, dass die Reproduzierbarkeit ihrer Ergebnisse gewährleistet ist. Ihre Bioinformatiker können weniger Zeit für die Wartung von Pipelines aufwenden und mehr Zeit für Entdeckungen nutzen. Wir sehen das UAP4G als den Motor, der die Transformation von Ad-hoc-Analysen zur Produktionsgenomik im industriellen Maßstab vorantreiben und so bessere Einblicke in den Zusammenhang zwischen Genetik und Krankheit ermöglichen wird.</p><h2>Beispieldaten lesen</h2><p>Starten wir mit dem Einlesen von Variationsdaten aus einer kleinen Kohorte von Proben. Die folgende Anweisung liest Daten für eine bestimmte sampleId ein und speichert sie im Databricks-Delta-Format (im Ordner delta_stream_output).[[ ## completed ## ]]</p><pre style="font-size:10pt;">spark.read. \ format("parquet"). \ load("dbfs:/annotations_etl_parquet/sampleId=" + "SRS000030_SRR709972"). \ write. \ format("delta"). \ save(delta_stream_outpath) </pre><blockquote><p>Hinweis: Der Ordner „annotations_etl_parquet“ enthält Annotationen, die aus dem <a href="https://www.internationalgenome.org/">1000-Genome-Dataset</a> generiert und im Parquet-Format gespeichert wurden. &nbsp;&nbsp;Das ETL und die Verarbeitung dieser Annotationen erfolgte über die <a href="https://www.databricks.com/product/genomics">einheitliche Analyseplattform von Databricks für Genomik</a>.</p></blockquote><h2>Streaming der Databricks Delta-Tabelle starten</h2><p>In der folgenden Anweisung erstellen wir das Exomes Apache Spark DataFrame, das einen stream (über readStream) von Daten im Databricks Delta-Format liest. &nbsp;Dies ist ein kontinuierlich ausgeführter oder dynamischer DataFrame, d.&nbsp;h. der Exomes-DataFrame lädt neue Daten, sobald diese in den Ordner 'delta_stream_output' geschrieben werden. &nbsp;&nbsp;Um den Exomes-DataFrame anzuzeigen, können wir eine DataFrame-Abfrage ausführen, um die Anzahl der nach der sampleId gruppierten Varianten zu ermitteln.</p><pre style="font-size:10pt;"># Read the stream of data exomes = spark.readStream.format("delta").load(delta_stream_outpath) # Display the data via DataFrame query display(exomes.groupBy("sampleId").count().withColumnRenamed("count", "variants")) </pre><p>Bei der Ausführung der <code>display</code> -Anweisung stellt das Databricks-Notebook ein Streaming-Dashboard zur Überwachung der Streaming-Jobs bereit. &nbsp;Direkt unter dem Streaming-Job befinden sich die Ergebnisse der display-Anweisung (d. h. die Anzahl der Varianten nach sample_id).</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_sample_display_variant_count_by_sampleid.png"><img class="aligncenter wp-image-39992" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_sample_display_variant_count_by_sampleid.png" alt height="282"></a></p><p>Beantworten wir unsere anfänglichen Fragen, indem wir weitere DataFrame-Abfragen auf der Grundlage unseres <code>exomes</code> -DataFrames ausführen.</p><h2>Anzahl der Einzelnukleotidvarianten</h2><p>Um das Beispiel fortzusetzen, können wir schnell die Anzahl der Einzelnukleotid-Varianten (SNVs) berechnen, wie in dem folgenden Graph dargestellt.</p><pre style="font-size:10pt;">%sql select referenceAllele, alternateAllele, count(1) as GroupCount from snvs group by referenceAllele, alternateAllele order by GroupCount desc </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_nucleotide_variant_count_sorted.png"><img class="aligncenter wp-image-39994" style="width:699px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_nucleotide_variant_count_sorted.png" alt height="356"></a></p><blockquote><p>Beachten Sie, dass der Befehl <code>display</code> Teil des Databricks-Workspace ist, mit dem Sie Ihren DataFrame mithilfe von Databricks-Visualisierungen anzeigen können (d. h. kein Code erforderlich).</p></blockquote><h2>Anzahl der Varianten</h2><p>Da wir unsere Varianten mit funktionellen Auswirkungen annotiert haben, können wir unsere Analysen fortsetzen, indem wir uns die Verteilung der beobachteten Varianten-Auswirkungen ansehen. Die meisten der entdeckten Varianten flankieren Regionen, die für Proteine kodieren, diese sind als nicht kodierende Varianten bekannt.</p><pre style="font-size:10pt;">display(exomes.groupBy("mutationType").count()) </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/mutation_type_donut.png"><img class="aligncenter wp-image-39996" style="width:650px;" src="https://www.databricks.com/wp-content/uploads/2019/03/mutation_type_donut.png" alt height="534"></a></p><h2>Aminosäure-Substitutions-Heatmap</h2><p>Fahren wir mit unserem <code>exomes</code> -DataFrame fort und berechnen wir die Anzahl der Aminosäuresubstitutionen mit dem folgenden Code-Snippet. &nbsp;Ähnlich wie bei den vorherigen DataFrames erstellen wir einen weiteren dynamischen DataFrame (<code>aa_counts</code>), sodass, wenn neue Daten vom exomes-DataFrame verarbeitet werden, sich dies anschließend auch in der Anzahl der Aminosäuresubstitutionen widerspiegelt. &nbsp;Wir schreiben die Daten auch in den Arbeitsspeicher (d. h. <code>.format(“memory”)</code>) und verarbeiten Batches alle 60 Sekunden (d. h. <code>trigger(processingTime=’60 seconds’)</code>), damit der nachgelagerte Pandas-Heatmap-Code die Heatmap verarbeiten und visualisieren kann.</p><pre style="font-size:10pt;">&lt;span&gt;# Calculate amino acid substitution counts &lt;/span&gt;coding = get_coding_mutations(exomes) aa_substitutions = get_amino_acid_substitutions(coding.select("proteinHgvs"), "proteinHgvs") aa_counts = count_amino_acid_substitution_combinations(aa_substitutions) aa_counts. \ writeStream. \ format("memory"). \ queryName("amino_acid_substitutions"). \ outputMode("complete"). \ trigger(processingTime='60 seconds'). \ start() </pre><p>Der folgende Codeausschnitt liest die vorangehende <code>amino_acid_substitutions</code> -Spark-Tabelle, bestimmt die maximale Anzahl, erstellt eine neue Pandas-Pivot-Tabelle aus der Spark-Tabelle und zeichnet dann die Heatmap.</p><pre style="font-size:10pt;"># Use pandas and matplotlib to build heatmap amino_acid_substitutions = spark.read.table("amino_acid_substitutions") max_count = amino_acid_substitutions.agg(fx.max("substitutions")).collect()[0][0] aa_counts_pd = amino_acid_substitutions.toPandas() aa_counts_pd = pd.pivot_table(aa_counts_pd, values='substitutions', index=['reference'], columns=['alternate'], fill_value=0) fig, ax = plt.subplots() with sns.axes_style("white"): ax = sns.heatmap(aa_counts_pd, vmax=max_count*0.4, cbar=False, annot=True, annot_kws={"size": 7}, fmt="d") plt.tight_layout() display(fig) </pre><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/single_sampleid_amino_acid_map.png"><img class="aligncenter wp-image-39998" style="width:701px;" src="https://www.databricks.com/wp-content/uploads/2019/03/single_sampleid_amino_acid_map.png" alt height="463"></a></p><h2>Migration zu einer kontinuierlichen Pipeline</h2><p>Bisher stellen die vorangegangenen Code-Snippets und Visualisierungen eine einzelne Ausführung für eine einzelne <code>sampleId</code> dar. &nbsp;Da wir jedoch Structured Streaming und Databricks Delta verwenden, kann dieser Code (ohne Änderungen) verwendet werden, um eine Produktions-Datenpipeline zu erstellen, die kontinuierlich Statistiken zur Qualitätskontrolle berechnet, während Samples unsere Pipeline durchlaufen. Um dies zu demonstrieren, können wir das folgende Code-Snippet ausführen, das unser gesamtes Dataset lädt.</p><pre style="font-size:10pt;">import time parquets = "dbfs:/databricks-datasets/Genomik/annotations_etl_parquet/" files = dbutils.fs.ls(parquets) counter=0 for sample in files: counter+=1 annotation_path = sample.path sampleId = annotation_path.split("/")[4].split("=")[1] variants = spark.read.format("parquet").load(str(annotation_path)) print("running " + sampleId) if(sampleId != "SRS000030_SRR709972"): variants.write.format("delta"). \ mode("append"). \ save(delta_stream_outpath) time.sleep(10) </pre><p>Wie in den vorherigen Code-Snippets beschrieben, sind die in den Ordner <code>delta_stream_output</code> geladenen Dateien die Quelle des <code>exomes</code> -DataFrame. &nbsp;Ursprünglich hatten wir einen Satz Dateien für eine einzelne <code>sampleId</code> (d. h. <code>sampleId = “SRS000030_SRR709972”</code>) geladen. &nbsp;&nbsp;Der vorhergehende Code-Snippet nimmt jetzt alle generierten Parquet-Samples (d. h. <code>Parquets</code>) und lädt diese Dateien inkrementell nach <code>sampleId</code> in denselben Ordner <code>delta_stream_output</code>. &nbsp;&nbsp;Die folgende animierte GIF zeigt die gekürzte Ausgabe des vorhergehenden Code-Snippets.</p><p>https://www.youtube.com/watch?v=JPngSC5Md-Q</p><h2>Visualisierung Ihrer Genomik-Pipeline</h2><p>Wenn Sie zum Anfang Ihres Notebooks zurückscrollen, werden Sie feststellen, dass der <code>exomes</code> -DataFrame jetzt automatisch die neuen <code>sampleIds</code> lädt. &nbsp;Da die Komponente für strukturiertes Streaming unserer Genomik-Pipeline kontinuierlich ausgeführt wird, verarbeitet sie Daten, sobald neue Dateien in den Ordner <code>delta_stream_outputpath</code> geladen werden. &nbsp;Durch die Verwendung des Databricks-Delta-Formats können wir die transaktionale Konsistenz der Daten gewährleisten, die in das Exome-DataFrame gestreamt werden.</p><p>https://www.youtube.com/watch?v=Q7KdPsc5mbY</p><p>Im Gegensatz zur anfänglichen Erstellung unseres <code>Exome-DataFrame</code> kannst du sehen, wie das strukturiertes Streaming-Monitoring-Dashboard jetzt Daten lädt (d. h. die schwankende "Eingabe- vs. Verarbeitungsrate", die schwankende "Batch-Laufzeit" und eine Zunahme der verschiedenen Keys im "Aggregationsstatus"). &nbsp;Beachten Sie während der Verarbeitung des <code>exomes</code> -DataFrames die neuen Zeilen von <code>sampleIds</code> (und die Anzahl der Varianten). &nbsp;Dieselbe Aktion ist auch bei der <em>Abfrage</em> der zugehörigen Gruppe nach Mutationsart zu sehen.</p><p>https://www.youtube.com/watch?v=sT179SCknGM</p><p>Mit Databricks Delta sind alle neuen Daten in jedem einzelnen Schritt unserer Genomik-Pipeline transaktional konsistent. &nbsp;Dies ist wichtig, da dadurch sichergestellt wird, dass Ihre Pipeline konsistent ist (die Konsistenz Ihrer Daten aufrechterhält, d.&nbsp;h. sicherstellt, dass alle Daten „korrekt“ sind), zuverlässig ist (entweder die Transaktion erfolgreich ist oder vollständig fehlschlägt) und Echtzeit-Updates verarbeiten kann (die Fähigkeit, viele Transaktionen gleichzeitig zu verarbeiten, und jeder Ausfall die Daten nicht beeinträchtigt). &nbsp;&nbsp;Daher werden sogar die Daten in unserer nachgelagerten Aminosäuresubstitutionskarte (die eine Reihe zusätzlicher ETL-Schritte durchlaufen hat) nahtlos aktualisiert.</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/amino-acid-map-all-files.png"><img class="aligncenter wp-image-40004" style="width:700px;" src="https://www.databricks.com/wp-content/uploads/2019/03/amino-acid-map-all-files.png" alt height="478"></a></p><p>Als letzten Schritt unserer Genomik-Pipeline führen wir auch ein Monitoring der verschiedenen Mutationen durch, indem wir die Databricks Delta Parquet-Dateien in DBFS überprüfen (d.&nbsp;h. die Zunahme der verschiedenen Mutationen im Laufe der Zeit).</p><p><a href="https://www.databricks.com/wp-content/uploads/2019/03/distinct-mutations-multiple-files.png"><img class="aligncenter wp-image-40006" style="width:699px;" src="https://www.databricks.com/wp-content/uploads/2019/03/distinct-mutations-multiple-files.png" alt height="421"></a></p><h2>Übersicht</h2><p>Auf der Grundlage der Databricks einheitliche Analyseplattform – mit besonderem Fokus auf Databricks Delta – können Bioinformatiker und Forscher mithilfe der <a href="https://www.databricks.com/product/genomics">Databricks einheitliche Analyseplattform for Genomik</a> verteilte Analysen mit Transaktionskonsistenz anwenden. Diese Abstraktionen ermöglichen es Datenexperten, Genomik-Pipelines zu vereinfachen. &nbsp;Hier haben wir eine Pipeline zur Qualitätskontrolle genomischer Proben erstellt, die Daten kontinuierlich verarbeitet, sobald neue Proben verarbeitet werden, ohne dass manuelle Eingriffe erforderlich sind. &nbsp;Ganz gleich, ob Sie ETL oder komplexe Analysen durchführen, Ihre Daten fließen schnell und ohne Disruption durch Ihre Genomik-Pipeline. Probieren Sie es noch heute selbst aus, indem Sie das <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">Notebook „Simplifying Genomik Pipelines at Scale with Databricks Delta“</a> herunterladen.</p><p>Erste Schritte mit der Analyse von Genomik im großen Scale:</p><ul><li>Lesen Sie unseren <a href="https://www.databricks.com/product/genomics">Lösungsleitfaden</a>zu Unified Analytics für Genomik</li><li>Laden Sie das <a href="https://pages.databricks.com/rs/094-YMS-629/images/Simplifying%20Genomics%20Pipelines%20at%20Scale%20with%20Databricks.html">Notebook „Simplifying Genomik Pipelines at Scale with Databricks Delta“</a>herunter</li><li>Registrieren Sie sich für eine <a href="https://pages.databricks.com/genomics-preview.html">kostenlose Testversion </a>von Databricks Unified Analytics for Genomics</li></ul><p>&nbsp;</p><h2>Danksagung</h2><p>Vielen Dank an Yongsheng Huang und Michael Ortega für ihre Beiträge.<br>&nbsp;</p><div style="border-radius:10px;border:medium solid #0CF;margin-left:auto;margin-right:auto;max-width:700px;padding:25px;text-align:left;"><strong>Haben Sie Interesse am Open-Source Delta Lake?</strong><br><a href="https://delta.io?utm_source=delta-blog" rel="noopener noreferrer" target="_blank">Besuchen Sie den Online-Hub von Delta Lake</a>, um mehr zu erfahren, den neuesten Code zu downloaden und der Delta Lake-Community beizutreten.</div><p>&nbsp;</p>

Verpassen Sie keinen Beitrag von Databricks

Abonnieren Sie unseren Blog und erhalten Sie die neuesten Beiträge direkt in Ihren Posteingang.

Was kommt als Nächstes?

image

Data Science e ML

October 31, 2023/9 min de leitura

Anunciando as métricas de LLM-como-juiz do MLflow 2.8 e as Melhores Práticas para Avaliação de LLM de Aplicações RAG, Parte 2

Creating High Quality RAG Applications with Databricks

Anúncios

December 6, 2023/7 min de leitura

Criando aplicativos RAG de alta qualidade com a Databricks