2016-12-07 5 views
1

BigQuery ist schnell bei der Verarbeitung großer Datenmengen, das Abrufen großer Ergebnisse aus BigQuery ist jedoch überhaupt nicht schnell.BigQuery Retrieval Zeiten langsam

Zum Beispiel habe ich eine Abfrage ausgeführt, die 211.136 Zeilen über drei HTTP-Anfragen zurückgegeben hat, wobei etwas mehr als 12 Sekunden insgesamt.
enter image description here Die Abfrage selbst wurde vom Cache zurückgegeben, sodass keine Zeit für die Ausführung der Abfrage benötigt wurde. Der Hostserver ist Amazon m4.xlarge, das in US-East (Virginia) ausgeführt wird.

In der Produktion habe ich gesehen, dass dieser Prozess ~ 90 Sekunden dauert, wenn ~ 1Mn Zeilen zurückgegeben werden. Offensichtlich könnte dies auf Netzwerkverkehr zurückzuführen sein ... aber es scheint zu langsam zu sein, als dass dies die einzige Ursache wäre (diese 211.136 Zeilen waren nur ~ 1.7MB).

Hat jemand andere solche langsame Geschwindigkeit bei der Rückkehr Ergebnisse gefunden, und eine Lösung gefunden?


Update: Reran Test auf VM in Google Cloud mit sehr ähnlichen Ergebnissen. Ausschluss von Netzwerkproblemen zwischen Google und AWS

+0

könnten Sie bitte die Job-ID angeben? – xuejian

+0

@xuejian job_BAp8OdilQEzuV7x6HNeEzVh2lo8 – NPSF3000

+0

Sorry, vergessen zu erwähnen: Projekt-ID wird auch benötigt. – xuejian

Antwort

0

Concurrent Anfragen TableData.List mit

Es ist nicht groß, aber es gibt eine Auflösung.

Erstellen Sie eine Abfrage, und legen Sie die maximale Anzahl der Zeilen auf 1000 fest. Wenn kein Seiten-Token vorhanden ist, geben Sie einfach die Ergebnisse zurück.

Wenn ein Seiten-Token vorhanden ist, ignorieren Sie die Ergebnisse * und verwenden Sie die TableData.List-API. Anstatt jedoch nur eine Anfrage zu senden, senden Sie eine Anfrage für alle 10.000 Datensätze * im Ergebnis. Dazu kann man die Felder 'MaxResults' und 'StartIndex' verwenden. (Beachten Sie, dass selbst diese kleineren Seiten in mehrere Anfragen aufgeteilt werden können *, so dass die Paging-Logik weiterhin benötigt wird).

Dieser Nebenläufigkeit (und kleinere Seiten) führt zu einer erheblichen Reduzierung der Abrufzeiten. Nicht so gut wie BigQ, das einfach alle Ergebnisse streamt, aber genug, um die Vorteile der Verwendung von BigQ zu erkennen.

enter image description here

Potential Pitfals: Halten Sie ein Auge auf die Anforderungszählung, wie bei größeren Ergebnis-Sets könnte es 100req/s Drosselung sein. Es ist auch erwähnenswert, dass es keine Garantie für die Reihenfolge gibt. Daher kann die Verwendung des StartIndex-Felds als Pseudo-Paging nicht immer die korrekten Ergebnisse liefern *.

* Alles mit einem einzigen Stern ist immer noch eine Vermutung, aber nicht als wahre/beste Praxis bestätigt.

1

Unsere SLO auf dieser API ist 32 Sekunden, und ein Anruf dauert 12 Sekunden ist normal. 90 Sekunden klingen zu lang, es muss einen Teil der Latenzzeit des Systems ausmachen.

Ich verstehe, dass es peinlich langsam ist. Dafür gibt es mehrere Gründe, und wir arbeiten daran, die Latenz dieser API zu verbessern. Bis zum Ende des ersten Quartals des nächsten Jahres sollten wir in der Lage sein, eine Änderung einzuführen, die die Zeit von tabledata.list halbiert (indem wir das API-Frontend auf unsere neue One Platform-Technologie aufrüsten). Wenn wir mehr Ressourcen haben, würden wir jobs.getQueryResults schneller machen.

+0

Ist tabledata.list schneller? Können wir etwas tun, um die Dinge zu verbessern? Für uns ist es ziemlich sinnlos, schnelle Abfragezeiten zu haben, wenn die Abfrage zu langsam ist ... da die totale Latenz das ist, was uns wirklich interessiert. – NPSF3000