{"id":91438,"date":"2020-08-13T19:42:36","date_gmt":"2020-08-13T17:42:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks"},"modified":"2020-08-13T19:42:36","modified_gmt":"2020-08-13T17:42:36","slug":"effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","title":{"rendered":"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8e42c1fffffcc964eacef240ea90bbc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da ClickHouse ein spezialisiertes System ist, ist es wichtig, bei seiner Verwendung die Besonderheiten seiner Architektur zu ber\u00fccksichtigen. In diesem Bericht wird Alexey Beispiele f\u00fcr typische Fehler vorstellen, die bei der Nutzung von ClickHouse auftreten k\u00f6nnen und die zu ineffizientem Arbeiten f\u00fchren. An praktischen Beispielen wird gezeigt, wie die Wahl eines bestimmten Datenverarbeitungsschemas die Leistung erheblich beeinflussen kann.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Hallo zusammen! Ich bin Alexey, und ich arbeite mit ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7f5fc01663be58d3d25e518a4169b8cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zun\u00e4chst m\u00f6chte ich euch erfreuen, ich werde euch heute nicht erz\u00e4hlen, was ClickHouse ist. Ehrlich gesagt, ich habe genug davon. Ich erkl\u00e4re das st\u00e4ndig, und wahrscheinlich wei\u00df es mittlerweile jeder. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/fae6bd07d098200643d591b8e5bf51e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Stattdessen werde ich dar\u00fcber sprechen, welche Stolpersteine es gibt, d. h. wie man ClickHouse falsch nutzen kann. Tats\u00e4chlich braucht man keine Angst zu haben, denn wir entwickeln ClickHouse als ein System, das einfach, benutzerfreundlich und sofort einsatzbereit ist. Einfach installiert und alles l\u00e4uft, ohne Probleme. <\/p>\n<p><\/p>\n<p>Dennoch sollte man ber\u00fccksichtigen, dass dieses System spezialisiert ist, und es ist leicht, auf ungew\u00f6hnliche Nutzungsszenarien zu sto\u00dfen, die das System aus seiner komfortablen Zone herausf\u00fchren.<\/p>\n<p><\/p>\n<p>Also, was sind die Stolpersteine? Im Wesentlichen werde ich \u00fcber die offensichtlichen Dinge sprechen. Jeder sieht es ein, alle verstehen es, und k\u00f6nnen sich freuen, dass sie so klug sind. Und wer es nicht versteht, wird etwas Neues lernen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/bffacf353ff31b361460178e911f0e16.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das erste einfache Beispiel, das leider h\u00e4ufig vorkommt, ist eine gro\u00dfe Anzahl von Inserts mit kleinen Batches, d.h. viele kleine Inserts.<\/p>\n<p><\/p>\n<p>Wenn man betrachtet, wie ClickHouse Inserts ausf\u00fchrt, k\u00f6nnen Sie mit einer einzigen Abfrage einen Datenstrom von einem Terabyte senden. Das ist kein Problem. <\/p>\n<p><\/p>\n<p>Schauen wir uns die typische Leistung an. Zum Beispiel haben wir eine Tabelle mit Daten von Yandex.Metrica. Hits. 105 Spalten. 700 Byte in unkomprimierter Form. Und wir werden ordentlich in Batches mit einer Million Zeilen einf\u00fcgen. <\/p>\n<p><\/p>\n<p>Wir f\u00fcgen in die MergeTree-Tabelle ein, es kommen eine halbe Million Zeilen pro Sekunde. Ausgezeichnet. In die replizierte Tabelle wird es etwas weniger, etwa 400.000 Zeilen pro Sekunde. <\/p>\n<p><\/p>\n<p>Wenn man die Quorum-Insertion aktiviert, erh\u00e4lt man etwas weniger, aber immer noch eine anst\u00e4ndige Leistung, 250.000 Zeilen pro Sekunde. Die Quorum-Insertion ist eine undocumented feature in ClickHouse*.<\/p>\n<p><\/p>\n<p>* Stand 2020, <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/operations\/settings\/settings\/#settings-insert_quorum\">bereits dokumentiert<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/668498fc82a0f6e851d05e6e1ea67033.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was passiert, wenn man es schlecht macht? Wir f\u00fcgen Zeile f\u00fcr Zeile in die MergeTree-Tabelle ein und erreichen 59 Zeilen pro Sekunde. Das ist 10.000 Mal langsamer. Bei ReplicatedMergeTree sind es nur 6 Zeilen pro Sekunde. Und wenn dann auch noch ein Quorum aktiviert wird, sind es nur 2 Zeilen pro Sekunde. Meiner Meinung nach ist das ein echtes Desaster. Wie kann es sein, dass es so langsam ist? Ich habe sogar ein T-Shirt, auf dem steht, dass ClickHouse nicht langsam sein sollte. Und trotzdem passiert es manchmal. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4c771eddc4e8453f60ef91123ae5d109.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tats\u00e4chlich ist das unser Fehler. Wir h\u00e4tten es so einrichten k\u00f6nnen, dass alles normal funktioniert, aber das haben wir nicht gemacht. Und wir haben es nicht getan, weil es f\u00fcr unser Szenario nicht n\u00f6tig war. Wir hatten bereits Batch-Prozesse. Einfach gesagt, die Daten kamen in Batch-Form zu uns, und alles lief reibungslos. Aber nat\u00fcrlich gibt es verschiedene Szenarien. Zum Beispiel, wenn Sie eine Menge Server haben, auf denen Daten generiert werden. Diese f\u00fcgen nicht so h\u00e4ufig Daten ein, aber es f\u00fchrt trotzdem zu h\u00e4ufigen Einf\u00fcgungen. Das muss irgendwie vermieden werden. <\/p>\n<p><\/p>\n<p>Technisch gesehen besteht der Kern darin, dass bei einem Insert in ClickHouse die Daten nicht in eine Memtable gelangen. Wir haben nicht einmal einen echten log structure MergeTree, sondern nur einen MergeTree, da es weder ein Log noch eine Memtable gibt. Wir schreiben die Daten direkt ins Dateisystem, bereits in Spalten unterteilt. Wenn Sie 100 Spalten haben, m\u00fcssen \u00fcber 200 Dateien in ein separates Verzeichnis geschrieben werden. Das ist ziemlich umst\u00e4ndlich. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/24688fe3d39d81b92f12ac1b8b21425b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es stellt sich die Frage: \u201eWie macht man es richtig?\u201c, wenn es notwendig ist, Daten auf irgendeine Weise in ClickHouse zu schreiben.<\/p>\n<p><\/p>\n<p>Steg 1. Dies ist die einfachste Methode. Verwenden Sie eine verteilte Warteschlange, wie zum Beispiel Kafka. Sie entnehmen einfach die Daten aus Kafka, batchen jede Sekunde. Und alles wird in Ordnung sein, Sie schreiben, es funktioniert alles einwandfrei. <\/p>\n<p><\/p>\n<p>Ein Nachteil ist, dass Kafka ein weiteres schwerf\u00e4lliges verteiltes System ist. Ich verstehe, wenn Ihre Firma bereits Kafka hat, das ist gut und bequem. Aber wenn nicht, sollte man dreimal \u00fcberlegen, bevor man ein weiteres verteiltes System in sein Projekt bringt. Daher sollten Alternativen in Betracht gezogen werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/4f687221e8c7443abf02fb002c4eba5b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Methode 2. Hier ist eine altmodische, aber sehr einfache Alternative. Sie haben einen Server, der Ihre Protokolle erzeugt, und dieser schreibt Ihre Protokolle in eine Datei. Einmal pro Sekunde benennen wir diese Datei um und \u00f6ffnen eine neue. Ein separiertes Skript, entweder \u00fcber cron oder einen Daemon, nimmt die \u00e4lteste Datei und speichert sie in ClickHouse. Wenn Sie die Protokolle einmal pro Sekunde speichern, wird alles hervorragend funktionieren. <\/p>\n<p><\/p>\n<p>Der Nachteil dieser Methode ist, dass, wenn der Server, auf dem die Protokolle erzeugt werden, irgendwo verschwindet, auch die Daten verloren gehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b4c28b6df87386c42b6908bdfccb6b90.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Methode 3. Es gibt noch einen weiteren interessanten Ansatz, der ganz ohne tempor\u00e4re Dateien auskommt. Zum Beispiel haben Sie einen Werbe-Rotator oder einen anderen interessanten Daemon, der Daten generiert. Sie k\u00f6nnen eine Menge Daten direkt im Arbeitsspeicher, im Puffer, ansammeln. Wenn eine ausreichende Zeit vergangen ist, legen Sie diesen Puffer beiseite, erstellen einen neuen und f\u00fcgen in einem separaten Thread das, was bereits angesammelt wurde, in ClickHouse ein.<\/p>\n<p><\/p>\n<p>Auf der anderen Seite verschwinden die Daten auch bei einem kill -9. Wenn Ihr Server abst\u00fcrzt, verlieren Sie diese Daten. Ein weiteres Problem ist, dass, wenn Sie nicht in die Datenbank schreiben konnten, die Daten im RAM gespeichert werden. Entweder wird der RAM voll, oder Sie verlieren einfach die Daten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/dc375b22fcb26cfa111d0bdb4563aa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Methode 4. Eine weitere interessante Methode. Wenn Sie einen Serverprozess haben, der Daten sofort an ClickHouse senden kann, sollte dies \u00fcber eine einzige Verbindung geschehen. Zum Beispiel, indem Sie eine HTTP-Anfrage mit transfer-encoding: chunked und einem Insert absenden. Dabei werden nicht zu selten Chunks generiert; Sie k\u00f6nnen jede Zeile senden, obwohl es Overhead f\u00fcr das Framing dieser Daten gibt. <\/p>\n<p><\/p>\n<p>Dennoch werden in diesem Fall die Daten sofort an ClickHouse gesendet. ClickHouse wird sie selbst puffern. <\/p>\n<p><\/p>\n<p>Es treten jedoch auch Probleme auf. Sie werden Daten verlieren, insbesondere wenn Ihr Prozess abgest\u00fcrzt ist, und auch wenn der ClickHouse-Prozess abst\u00fcrzt, da dies ein unvollst\u00e4ndiges Insert zur Folge hat. In ClickHouse sind Inserts bis zu einer bestimmten Zeilenanzahl atomar. Im Grunde ist dies eine interessante Methode. Sie kann ebenfalls genutzt werden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6a18a974b9600ade377a870390e95d3d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Methode 5. Hier ist eine weitere interessante M\u00f6glichkeit. Dies ist ein von der Community entwickelter Server f\u00fcr das Batch-Processing von Daten. Ich habe selbst nicht darauf geschaut, daher kann ich nichts garantieren. Ebenso werden f\u00fcr ClickHouse keine Garantien gegeben. Es ist ebenfalls Open Source, aber Sie k\u00f6nnten an einem bestimmten Qualit\u00e4tsstandard gew\u00f6hnt sein, den wir zu gew\u00e4hrleisten versuchen. F\u00fcr dieses Tool \u2013 ich wei\u00df es nicht, schauen Sie auf GitHub nach und werfen Sie einen Blick in den Code. Vielleicht wurde etwas Sinnvolles geschrieben. <\/p>\n<p><\/p>\n<p>* Stand 2020, sollte auch zur Diskussion hinzugef\u00fcgt werden <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/vk\/blog\/430168\/\">KittenHouse<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae6a04af63ae4e7fa160c002fdb6d506.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Methode 6. Eine weitere M\u00f6glichkeit ist die Verwendung von Buffer-Tabellen. Die Vorteile dieser Methode liegen darin, dass es sehr einfach ist, sie zu verwenden. Sie erstellen eine Buffer-Tabelle und f\u00fcgen Daten hinzu. <\/p>\n<p><\/p>\n<p>Das Problem ist jedoch, dass es nicht vollst\u00e4ndig gel\u00f6st wird. Wenn Sie bei einer MergeTree-Einf\u00fcgung die Daten mit einem Batch pro Sekunde gruppieren m\u00fcssen, sollten Sie bei der Puffer-Tabelle wenigstens einige Tausend pro Sekunde gruppieren. Wenn es mehr als 10.000 pro Sekunde sind, ist das immer noch schlecht. Wenn Sie in Batches einf\u00fcgen, sehen Sie, dass dort Hunderttausende von Zeilen pro Sekunde verarbeitet werden, und das auch mit ziemlich schweren Daten. <\/p>\n<p><\/p>\n<p>Au\u00dferdem haben die Puffer-Tabellen kein Log. Wenn also mit Ihrem Server etwas nicht stimmt, gehen die Daten verloren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/9bb16bf5e8145cc8368b11e54c86c837.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als Bonus haben wir k\u00fcrzlich die M\u00f6glichkeit hinzugef\u00fcgt, Daten aus Kafka in ClickHouse zu holen. Es gibt eine Tabellen-Engine namens Kafka. Sie erstellen einfach eine solche Tabelle, und Sie k\u00f6nnen materialisierte Ansichten darauf anwenden. In diesem Fall wird die Engine die Daten selbst aus Kafka entnehmen und in die gew\u00fcnschten Tabellen einf\u00fcgen. <\/p>\n<p><\/p>\n<p>Besonders erfreulich an dieser M\u00f6glichkeit ist, dass sie nicht von uns stammt. Es ist eine Funktion der Community. Und wenn ich \"Community-Funktion\" sage, dann ohne jegliche Herabsetzung. Wir haben den Code gelesen, \u00fcberpr\u00fcfen lassen, es sollte also normal funktionieren. <\/p>\n<p><\/p>\n<p>* Stand 2020, gab es eine \u00e4hnliche Unterst\u00fctzung f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/engines\/table-engines\/integrations\/rabbitmq\/\">RabbitMQ<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15dc61dfd435f5f8640395b7de480fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was k\u00f6nnte beim Einf\u00fcgen von Daten noch unbequem oder unerwartet sein? Wenn Sie eine Anfrage \"insert values\" machen und in den \"values\" berechnete Ausdr\u00fccke schreiben. Zum Beispiel ist now() ebenfalls ein berechneter Ausdruck. In diesem Fall muss ClickHouse den Interpreter dieser Ausdr\u00fccke f\u00fcr jede Zeile aufrufen, was die Leistung erheblich beeintr\u00e4chtigt. Es ist besser, dies zu vermeiden.<\/p>\n<p><\/p>\n<p>* Derzeit ist das Problem vollst\u00e4ndig gel\u00f6st, es gibt keine R\u00fcckg\u00e4nge in der Leistung mehr bei der Verwendung von Ausdr\u00fccken in VALUES.<\/p>\n<p><\/p>\n<p>Ein weiteres Beispiel f\u00fcr m\u00f6gliche Probleme ist, wenn Ihre Daten in einem Batch zu mehreren Partitionen geh\u00f6ren. Standardm\u00e4\u00dfig hat ClickHouse Partitionen nach Monaten. Wenn Sie einen Batch aus einer Million Zeilen einf\u00fcgen und die Daten \u00fcber mehrere Jahre verteilt sind, haben Sie mehrere Dutzend Partitionen. Das entspricht dem Einf\u00fcgen von Batches, die um ein Vielfaches kleiner sind, da sie zuerst nach Partitionen aufgeteilt werden.<\/p>\n<p><\/p>\n<p>* K\u00fcrzlich wurde in ClickHouse im experimentellen Modus die Unterst\u00fctzung f\u00fcr kompaktes Format von St\u00fccken und St\u00fccken im Arbeitsspeicher mit Write-Ahead-Log hinzugef\u00fcgt, was das Problem fast vollst\u00e4ndig l\u00f6st.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/b8c6cecdba53559dad31ed11713a980d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns nun die zweite Art von Problem betrachten \u2013 die Typisierung von Daten. <\/p>\n<p><\/p>\n<p>Die Typisierung von Daten kann streng oder als Stringtyp erfolgen. Stringtyp bedeutet, dass Sie einfach erkl\u00e4rt haben, dass alle Ihre Felder vom Typ string sind. Das ist nicht optimal. So sollte man es nicht machen. <\/p>\n<p><\/p>\n<p>Lassen Sie uns kl\u00e4ren, wie man es richtig macht, wenn man sagen m\u00f6chte, dass ein gewisses Feld ein String ist, und ClickHouse den Rest selbst regeln kann, ohne dass ich mir darum Gedanken machen muss. Dennoch ist es sinnvoll, gewisse Anstrengungen zu unternehmen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a0fdcf6423933293318411242fe2ede7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nehmen wir zum Beispiel eine IP-Adresse. In einem Fall haben wir sie als String gespeichert, etwa 192.168.1.1. Im anderen Fall wird sie als Zahl vom Typ UInt32* gespeichert. 32 Bit sind ausreichend f\u00fcr eine IPv4-Adresse.<\/p>\n<p><\/p>\n<p>Erstens, erstaunlicherweise werden die Daten \u00e4hnlich komprimiert. Es wird zwar Unterschiede geben, aber sie sind nicht allzu gro\u00df. Daher gibt es beim Datentransfer auf der Festplatte keine besonderen Probleme. <\/p>\n<p><\/p>\n<p>Es gibt jedoch einen signifikanten Unterschied in der CPU-Zeit und in der Ausf\u00fchrungszeit der Abfrage. <\/p>\n<p><\/p>\n<p>Wir berechnen die Anzahl der einzigartigen IP-Adressen, wenn sie als Zahlen gespeichert sind. Das ergibt 137 Millionen Zeilen pro Sekunde. Dasselbe in Form von Strings ergibt 37 Millionen Zeilen pro Sekunde. Ich wei\u00df nicht, warum es eine solche \u00dcbereinstimmung gibt. Ich habe diese Abfragen selbst durchgef\u00fchrt. Dennoch ist es ungef\u00e4hr viermal langsamer. <\/p>\n<p><\/p>\n<p>Und wenn wir den Unterschied im Speicherplatz auf der Festplatte ber\u00fccksichtigen, gibt es auch Unterschiede. Dieser liegt etwa bei einem Viertel, da es ziemlich viele einzigartige IP-Adressen gibt. W\u00e4ren hier Zeilen mit einer kleinen Anzahl unterschiedlicher Werte, w\u00fcrden sie im W\u00f6rterbuch wahrscheinlich auf ein \u00e4hnliches Volumen komprimiert werden. <\/p>\n<p><\/p>\n<p>Und ein vierfacher Zeitunterschied liegt nicht einfach so auf der Stra\u00dfe. Vielleicht ist es Ihnen egal, aber wenn ich einen solchen Unterschied sehe, macht es mich traurig.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f74dbfdab5a9e26fa044a5870a8cc00d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Betrachten wir verschiedene F\u00e4lle. <\/p>\n<p><\/p>\n<p>1. Ein Fall, wenn Sie nur wenige verschiedene einzigartige Werte haben. In diesem Fall verwenden wir eine einfache Praxis, die Sie wahrscheinlich kennen und f\u00fcr jede Datenbank verwenden k\u00f6nnen. Das macht nicht nur f\u00fcr ClickHouse Sinn. Sie speichern einfach numerische Identifikatoren in der Datenbank. Und die Umwandlung in Strings und zur\u00fcck kann bereits auf der Seite Ihrer Anwendung erfolgen. <\/p>\n<p><\/p>\n<p>Nehmen wir zum Beispiel eine Region. Sie versuchen, sie als String zu speichern. Dort steht dann: Moskau und MO. Wenn ich nur \"Moskau\" sehe, ist das noch in Ordnung, aber wenn auch MO dazu kommt, wird es irgendwie traurig. Das sind schlie\u00dflich viele Bytes. <\/p>\n<p><\/p>\n<p>Stattdessen schreiben wir einfach die Zahl Ulnt32 und 250. Bei uns sind es 250 in Yandex, bei Ihnen k\u00f6nnte es anders sein. Zur Sicherheit erw\u00e4hne ich, dass ClickHouse eine integrierte Funktion zur Arbeit mit Geodatenbanken hat. Sie speichern einfach ein Verzeichnis mit Regionen, einschlie\u00dflich hierarchischer Struktur, das hei\u00dft, dort wird auch Moskau und MO enthalten sein und alles, was Sie ben\u00f6tigen. Au\u00dferdem k\u00f6nnen Sie auf Abfrageebene konvertieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/cc6e871136dab8f8a35246a5af512cda.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die zweite Variante ist \u00e4hnlich, aber mit Unterst\u00fctzung innerhalb von ClickHouse. Es handelt sich um den Datentyp Enum. Sie geben einfach innerhalb von Enum alle ben\u00f6tigten Werte an. Zum Beispiel den Ger\u00e4tetyp und schreiben dort: Desktop, Mobilger\u00e4t, Tablet, Fernseher. Insgesamt gibt es 4 Varianten. <\/p>\n<p><\/p>\n<p>Der Nachteil besteht darin, dass gelegentlich ein Alter ben\u00f6tigt wird. Wir haben nur eine einzige Variante hinzugef\u00fcgt. Wir f\u00fchren Alter Tabelle durch. Tats\u00e4chlich ist das Alter Tabelle in ClickHouse kostenlos. Besonders kostenlos f\u00fcr Enum, da sich die Daten auf der Festplatte nicht \u00e4ndern. Dennoch erfordert das Alter eine Sperrung* der Tabelle und muss warten, bis alle Selects abgeschlossen sind. Erst danach wird das Alter ausgef\u00fchrt, also gibt es doch einige Unannehmlichkeiten.<\/p>\n<p><\/p>\n<p>* In den neuesten Versionen von ClickHouse ist ALTER vollst\u00e4ndig nicht blockierend.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7284fa5be583ab063bb6de0b60f54d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine weitere, recht einzigartige M\u00f6glichkeit f\u00fcr ClickHouse ist die Anbindung externer Dictionaries. Sie k\u00f6nnen Zahlen in ClickHouse schreiben, w\u00e4hrend Ihre Verzeichnisse in einem beliebigen Ihnen angenehmen System verwahrt werden. Beispielsweise k\u00f6nnen Sie MySQL, Mongo oder Postgres verwenden. Sie k\u00f6nnen sogar Ihren eigenen Microservice entwickeln, der diese Daten \u00fcber HTTP bereitstellt. Auf der Ebene von ClickHouse schreiben Sie eine Funktion, die diese Daten von Zahlen in Zeichenfolgen umwandelt. <\/p>\n<p><\/p>\n<p>Dies ist eine spezialisierte, aber sehr effektive Methode, um einen Join mit einer externen Tabelle durchzuf\u00fchren. Dabei gibt es zwei Varianten. In einer Variante werden die Daten vollst\u00e4ndig im Cache gehalten, befinden sich komplett im Arbeitsspeicher und werden in regelm\u00e4\u00dfigen Abst\u00e4nden aktualisiert. In der anderen Variante, wenn diese Daten nicht in den Arbeitsspeicher passen, k\u00f6nnen sie teilweise im Cache gespeichert werden. <\/p>\n<p><\/p>\n<p>Hier ist ein Beispiel. Nehmen wir Yandex.Direct. Dort gibt es Werbekampagnen und Banner. Es gibt wahrscheinlich etwa zehn Millionen Werbekampagnen, die im Arbeitsspeicher Platz finden. Die Banner hingegen \u2013 Milliarden davon, die passen nicht. Wir verwenden ein speicherbares Dictionary aus MySQL.<\/p>\n<p><\/p>\n<p>Das einzige Problem ist, dass das speicherbare Dictionary nur gut funktioniert, wenn die Trefferquote nahe 100 % liegt. Ist sie niedriger, m\u00fcssen beim Verarbeiten der Anfragen f\u00fcr jede Datenmenge tats\u00e4chlich die fehlenden Schl\u00fcssel abgerufen und die Daten aus MySQL geholt werden. Bei ClickHouse kann ich garantieren, dass es nicht stockt; \u00fcber andere Systeme m\u00f6chte ich jedoch keine Aussagen treffen.<\/p>\n<p><\/p>\n<p>Ein zus\u00e4tzlicher Vorteil besteht darin, dass Dictionaries eine sehr einfache M\u00f6glichkeit bieten, Daten in ClickHouse r\u00fcckwirkend zu aktualisieren. Das bedeutet, wenn Sie einen Bericht \u00fcber Werbekampagnen hatten und der Benutzer die Werbekampagne \u00e4ndert, \u00e4ndern sich auch alle alten Daten und Berichte. Wenn man die Daten direkt in die Tabelle schreibt, w\u00e4re eine Aktualisierung nicht m\u00f6glich. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/a5a2919d6be7d00c0ad5875b9a8f0f31.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine weitere M\u00f6glichkeit besteht darin, dass Sie nicht wissen, woher Sie die Identifikatoren f\u00fcr Ihre Zeilen bekommen. Sie k\u00f6nnen einfach hashieren. Der einfachste Weg ist, einen 64-Bit-Hash zu verwenden. <\/p>\n<p><\/p>\n<p>Das einzige Problem dabei ist, dass es bei einem 64-Bit-Hash fast sicher Kollisionen geben wird. Wenn es eine Milliarde Zeilen gibt, wird die Wahrscheinlichkeit erheblich. <\/p>\n<p><\/p>\n<p>Es w\u00e4re auch nicht ideal, die Namen der Werbekampagnen so zu hashen. Wenn die Werbekampagnen verschiedener Unternehmen durcheinander geraten, wird es unverst\u00e4ndlich. <\/p>\n<p><\/p>\n<p>Es gibt einen einfachen Trick. Nat\u00fcrlich ist es f\u00fcr ernsthafte Daten nicht besonders geeignet, aber wenn es um weniger kritische Dinge geht, f\u00fcgen Sie einfach eine Kunden-ID zum Dictionary-Schl\u00fcssel hinzu. Dann werden Kollisionen auftreten, aber nur innerhalb eines einzelnen Kunden. Diese Methode verwenden wir f\u00fcr die Link-Karte in Yandex.Metrica. Dort haben wir URLs, wir speichern Hashes. Und wir wissen, dass es Kollisionen gibt. Aber wenn die Seite angezeigt wird, ist die Wahrscheinlichkeit gering, dass auf einer Seite bei einem bestimmten Benutzer zwei URLs zusammenfallen und dies bemerkt wird, sodass wir das ignorieren k\u00f6nnen. <\/p>\n<p><\/p>\n<p>Als Bonus \u2013 f\u00fcr viele Operationen reichen tats\u00e4chlich Hashes aus und die Strings m\u00fcssen nirgendwo gespeichert werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/abbb73aaba29d10e3b7e7650bf68e6a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein anderes Beispiel: Wenn die Strings kurz sind, zum Beispiel die Domains von Websites. Sie k\u00f6nnen sie so speichern, wie sie sind. Oder, wie zum Beispiel, die Sprache des Browsers ru \u2013 2 Bytes. Nat\u00fcrlich tut es mir leid um diese Bytes, aber keine Sorge, es sind nur 2 Bytes, da kann man sich nicht beschweren. Bitte speichern Sie sie so, wie sie sind, machen Sie sich keine Gedanken. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/901eaed0029da6ea59630b57ccf80c25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiteres Szenario, bei dem es sehr viele Strings gibt und diese wiederum sehr viele einzigartige Werte enthalten, ist die Verwendung von Suchanfragen oder URLs. Suchanfragen, auch aufgrund von Tippfehlern. Lassen Sie uns also sehen, wie viele einzigartige Suchanfragen in einem Tag vorkommen. Dabei zeigt sich, dass sie fast die H\u00e4lfte aller Ereignisse ausmachen. In diesem Fall k\u00f6nnten Sie denken, dass die Daten normalisiert werden m\u00fcssen, indem Sie Identifikatoren z\u00e4hlen und in eine separate Tabelle speichern. Aber das sollten Sie nicht tun. Bewahren Sie diese Strings einfach in ihrer urspr\u00fcnglichen Form auf. <\/p>\n<p><\/p>\n<p>Am besten ist es, wenn Sie sich keine neuen Strukturen ausdenken, denn wenn Sie sie separat speichern, m\u00fcssen Sie Joins durchf\u00fchren. Und dieser Join geht im besten Fall mit zuf\u00e4lligem Speicherzugriff einher, vorausgesetzt, es passt noch in den Speicher. Wenn nicht, wird es wirklich problematisch. <\/p>\n<p><\/p>\n<p>Wenn die Daten jedoch inplace gespeichert werden, werden sie einfach in der erforderlichen Reihenfolge aus dem Dateisystem abgerufen, und alles l\u00e4uft reibungslos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/15f1d632083def16ccbc939579c1cf6b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn Sie URLs oder eine andere komplexe, lange Zeichenfolge haben, sollten Sie dar\u00fcber nachdenken, ob Sie nicht im Voraus eine Zusammenfassung berechnen und in eine separate Spalte speichern k\u00f6nnen. <\/p>\n<p><\/p>\n<p>F\u00fcr URLs k\u00f6nnen Sie beispielsweise die Domain separat speichern. Wenn Sie tats\u00e4chlich eine Domain ben\u00f6tigen, nutzen Sie einfach diese Spalte, w\u00e4hrend die URLs dort bleiben, ohne dass Sie sie ber\u00fchren m\u00fcssen. <\/p>\n<p><\/p>\n<p>Lassen Sie uns die Unterschiede betrachten. In ClickHouse gibt es eine spezialisierte Funktion zur Berechnung der Domain. Sie ist sehr schnell, wir haben sie optimiert. Und ehrlich gesagt, sie entspricht nicht einmal dem RFC, aber dennoch berechnet sie alles, was wir brauchen. <\/p>\n<p><\/p>\n<p>In einem Fall extrahieren wir einfach die URLs und berechnen die Domain. Das dauert 166 Millisekunden. Wenn wir jedoch die fertige Domain verwenden, sind es nur 67 Millisekunden, also fast dreimal schneller. Das liegt nicht daran, dass wir Berechnungen durchf\u00fchren m\u00fcssen, sondern daran, dass wir weniger Daten lesen. <\/p>\n<p><\/p>\n<p>Aus irgendeinem Grund hat eine langsamere Abfrage eine h\u00f6here Geschwindigkeit in Gigabyte pro Sekunde. Das liegt daran, dass sie mehr Gigabyte liest. Diese zus\u00e4tzlichen Daten sind vollkommen \u00fcberfl\u00fcssig. Die Abfrage scheint schneller zu arbeiten, ben\u00f6tigt jedoch mehr Zeit f\u00fcr die Ausf\u00fchrung.<\/p>\n<p><\/p>\n<p>Wenn man den Datenumfang auf der Festplatte betrachtet, ergibt sich, dass die URL 126 Megabyte gro\u00df ist, w\u00e4hrend die Domain nur 5 Megabyte ben\u00f6tigt. Das ist 25 Mal weniger. Dennoch wird die Anfrage lediglich 4 Mal schneller ausgef\u00fchrt. Das liegt daran, dass die Daten hot sind. W\u00e4ren sie kalt, w\u00e4re es wahrscheinlich 25 Mal schneller aufgrund der Festplatten-I\/O. <\/p>\n<p><\/p>\n<p>\u00dcbrigens, wenn man beurteilt, wie viel kleiner die Domain im Vergleich zur URL ist, stellt man fest, dass sie ungef\u00e4hr 4 Mal kleiner ist. Merkw\u00fcrdigerweise ben\u00f6tigen die Daten auf der Festplatte jedoch 25 Mal weniger Platz. Warum? Wegen der Kompression. Sowohl die URL als auch die Domain werden komprimiert. Oft enth\u00e4lt die URL auch viel unn\u00f6tigen Ballast. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/c93d2128a41561ed7abb25d77414bc2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist nat\u00fcrlich wichtig, die richtigen Datentypen zu verwenden, die speziell f\u00fcr die ben\u00f6tigten Werte bestimmt sind oder passend sind. Wenn Sie IPv4 verwenden, speichern Sie UInt32*. Bei IPv6 verwenden Sie FixedString(16), denn eine IPv6-Adresse ist 128 Bit, also speichern Sie sie direkt im Bin\u00e4rformat. <\/p>\n<p><\/p>\n<p>Was ist zu tun, wenn Sie manchmal IPv4-Adressen und manchmal IPv6-Adressen haben? Ja, Sie k\u00f6nnen beide speichern. Eine Spalte f\u00fcr IPv4, die andere f\u00fcr IPv6. Nat\u00fcrlich gibt es die M\u00f6glichkeit, IPv4 in IPv6 darzustellen. Das funktioniert ebenfalls, aber wenn Sie in Ihren Anfragen h\u00e4ufig genau die IPv4-Adresse ben\u00f6tigen, w\u00e4re es sinnvoll, sie in einer separaten Spalte zu speichern. <\/p>\n<p><\/p>\n<p>* Jetzt gibt es in ClickHouse separate Datentypen f\u00fcr IPv4 und IPv6, die Daten ebenso effizient speichern wie Zahlen, jedoch so benutzerfreundlich darstellen wie Strings.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d7d6342ebd6b8b4f3526b3cd8a06cf26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist auch wichtig zu beachten, dass die Daten im Voraus verarbeitet werden sollten. Zum Beispiel, wenn Ihnen rohe Logs vorliegen. Es mag verlockend sein, sie sofort in ClickHouse zu importieren, auch wenn es sehr verlockend ist, nichts zu tun und alles w\u00fcrde funktionieren. Aber es ist dennoch sinnvoll, die Berechnungen, die m\u00f6glich sind, durchzuf\u00fchren.<\/p>\n<p><\/p>\n<p>Zum Beispiel die Browserversion. In einer benachbarten Abteilung, auf die ich nicht zeigen m\u00f6chte, wird die Browserversion so gespeichert, d.h. als String: 12.3. Und dann, um einen Bericht zu erstellen, nehmen sie diesen String und teilen ihn in ein Array auf, und dann den ersten Element des Arrays. Nat\u00fcrlich sorgt das f\u00fcr Verz\u00f6gerungen. Ich habe gefragt, warum sie das so machen. Sie antworteten, dass sie voreilige Optimierungen nicht m\u00f6gen. Ich hingegen mag voreilige Pessimierungen nicht.<\/p>\n<p><\/p>\n<p>In diesem Fall w\u00e4re es also besser, in 4 Spalten zu unterteilen. Scheuen Sie sich nicht, denn das ist ClickHouse. ClickHouse ist eine spaltenbasierte Datenbank. Und je mehr ordentliche, kleine Spalten, desto besser. Wenn es 5 BrowserVersionen gibt, erstellen Sie 5 Spalten. Das ist in Ordnung. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f9a67221bf8508933d7bd336b16f9e04.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Betrachten wir nun, was zu tun ist, wenn Sie viele sehr lange Texte oder Arrays haben. Diese m\u00fcssen \u00fcberhaupt nicht in ClickHouse gespeichert werden. Stattdessen k\u00f6nnen Sie in ClickHouse nur eine Art Identifikator speichern. Die langen Texte sollten Sie in ein anderes System schieben. <\/p>\n<p><\/p>\n<p>Zum Beispiel haben wir in einem unserer Analyse-Services einige Ereignisparameter. Wenn bei den Ereignissen viele Parameter auftauchen, speichern wir einfach die ersten 512. Denn 512 ist es wert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/755271e8788ba4bd638f493bf320c820.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn Sie sich nicht \u00fcber Ihre Datentypen sicher sind, k\u00f6nnen Sie die Daten ebenfalls in ClickHouse speichern, jedoch in einer tempor\u00e4ren Tabelle vom Typ Log, die speziell f\u00fcr tempor\u00e4re Daten gedacht ist. Danach k\u00f6nnen Sie analysieren, wie Ihre Verteilung der Werte aussieht, was es \u00fcberhaupt gibt und die richtigen Typen festlegen.<\/p>\n<p><\/p>\n<p>* Aktuell gibt es in ClickHouse einen Datentyp <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/data-types\/lowcardinality\/\">LowCardinality<\/a><\/noindex> der es erm\u00f6glicht, Strings effizient mit geringeren Ressourcenaufwand zu speichern.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/7e9e53d86a4189783c28ce56a669198c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns einen weiteren interessanten Fall betrachten. Manchmal funktioniert alles bei den Leuten irgendwie seltsam. Ich logge mich ein und sehe das. Und sofort kommt mir in den Sinn, dass dies von einem sehr erfahrenen, klugen Administrator mit umfassender Erfahrung in der Konfiguration von MySQL Version 3.23 gemacht wurde. <\/p>\n<p><\/p>\n<p>Hier sehen wir tausend Tabellen, in denen jeweils der Rest einer unklaren Division durch tausend gespeichert ist. <\/p>\n<p><\/p>\n<p>Im Grunde respektiere ich die Erfahrung anderer, verstehe jedoch auch, welch gro\u00dfe M\u00fchen hinter dieser Erfahrung stecken k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3a5e21ef2076966fcc627670485c5b3a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Gr\u00fcnde sind mehr oder weniger verst\u00e4ndlich. Es sind alte Stereotypen, die sich aus der Arbeit mit anderen Systemen angesammelt haben k\u00f6nnten. Zum Beispiel gibt es in MyISAM-Tabellen keinen clusterweiten Prim\u00e4rschl\u00fcssel. Und diese Art der Datenaufteilung k\u00f6nnte ein verzweifelter Versuch sein, dieselbe Funktionalit\u00e4t zu erreichen. <\/p>\n<p><\/p>\n<p>Ein anderer Grund ist, dass verschiedene Operationen wie ALTER an gro\u00dfen Tabellen schwierig sind. Es kommt zu Sperrungen. Obwohl dieses Problem in modernen Versionen von MySQL nicht mehr so gravierend ist. <\/p>\n<p><\/p>\n<p>Oder zum Beispiel Mikroschardierung, aber dar\u00fcber sp\u00e4ter mehr.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/321b1d9caa8db7aca5b96e08c61d05b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In ClickHouse ist das nicht notwendig, denn erstens ist der Prim\u00e4rschl\u00fcssel ein Cluster, und die Daten sind nach dem Prim\u00e4rschl\u00fcssel sortiert. <\/p>\n<p><\/p>\n<p>Manchmal werde ich gefragt: \u201eWie beeinflusst die Gr\u00f6\u00dfe einer Tabelle die Leistung von Bereichsanfragen in ClickHouse?\u201c Ich antworte, dass es keinen Unterschied macht. Zum Beispiel, wenn Sie eine Tabelle mit einer Milliarde Zeilen haben und eine Million Zeilen abfragen, funktioniert alles einwandfrei. Wenn die Tabelle eine Billion Zeilen hat und Sie eine Million Zeilen abfragen, ist das nahezu identisch. <\/p>\n<p><\/p>\n<p>Zudem sind keine manuellen Partitionierungsm\u00f6glichkeiten erforderlich. Wenn Sie sich die Dateisystemstruktur ansehen, werden Sie feststellen, dass eine Tabelle eine bedeutende Struktur hat. Innerhalb dieser Struktur gibt es etwas \u00c4hnliches wie Partitionen. ClickHouse erledigt dies alles automatisch f\u00fcr Sie, sodass Sie keine Schwierigkeiten haben m\u00fcssen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/652f3742ad3a44f172d0d7302abd09f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In ClickHouse ist der Befehl ALTER kostenfrei, wenn es um das Hinzuf\u00fcgen oder Entfernen von Spalten geht. <\/p>\n<p><\/p>\n<p>Es ist nicht sinnvoll, kleine Tabellen zu verwenden, denn ob Sie 10 oder 10.000 Zeilen in einer Tabelle haben, spielt keine Rolle. ClickHouse optimiert den Durchsatz und nicht die Latenz, weshalb es keinen Sinn macht, nur 10 Zeilen zu verarbeiten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/144144b4740e9c5daec80c8dadc445f9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist ratsam, eine gro\u00dfe Tabelle zu nutzen. Lassen Sie die alten Vorurteile hinter sich, alles wird gut. <\/p>\n<p><\/p>\n<p>In der neuesten Version haben wir die M\u00f6glichkeit eingef\u00fchrt, benutzerdefinierte Partitionierungsschl\u00fcssel zu erstellen, um verschiedene Wartungsoperationen an einzelnen Partitionen durchzuf\u00fchren. <\/p>\n<p><\/p>\n<p>Wenn Sie viele kleine Tabellen ben\u00f6tigen, beispielsweise zur Verarbeitung von tempor\u00e4ren Daten, die in Form von Chunks ankommen und vor dem Speichern in die endg\u00fcltige Tabelle umgewandelt werden m\u00fcssen. In diesem Fall gibt es eine hervorragende Tabellenengine \u2013 StripeLog. Es funktioniert \u00e4hnlich wie TinyLog, ist jedoch besser. <\/p>\n<p><\/p>\n<p>* Aktuell gibt es in ClickHouse auch <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.tech\/docs\/en\/sql-reference\/table-functions\/input\/\">die Tabellenfunktion input<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/d62f0b3d29876c29c6c0ba236b200186.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiteres Antipattern ist das Mikroscharding. Wenn Sie Daten shardieren m\u00fcssen und 5 Server haben, aber morgen 6 Server ben\u00f6tigen, stellen Sie sich die Frage, wie Sie die Daten umverteilen. Anstatt auf 5 Shards zu partitionieren, erstellen Sie 1.000 Shards. Danach ordnen Sie jeden dieser Mikroschards einem einzelnen Server zu. Das bedeutet, dass Sie auf einem Server beispielsweise 200 ClickHouse-Instanzen haben k\u00f6nnten, jeweils auf separaten Ports oder in separaten Datenbanken. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3e550ef7e338b84e4394eb9fa4538769.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In ClickHouse ist das jedoch nicht optimal. Selbst ein einzelner ClickHouse-Instanz versucht, alle verf\u00fcgbaren Serverressourcen f\u00fcr die Verarbeitung einer Anfrage zu nutzen. Angenommen, Sie haben einen Server mit 56 CPU-Kernen. Wenn Sie eine Anfrage ausf\u00fchren, die eine Sekunde dauert, werden alle 56 Kerne verwendet. Wenn Sie jedoch 200 ClickHouse-Instanzen auf demselben Server hosten, werden 10.000 Threads gestartet. Das Ergebnis wird sehr ineffizient sein.<\/p>\n<p><\/p>\n<p>Ein weiterer Grund ist, dass die Arbeitsverteilung auf diesen Instanzen ungleichm\u00e4\u00dfig sein wird. Einige werden fr\u00fcher abgeschlossen, andere sp\u00e4ter. W\u00e4re alles in einer einzigen Instanz, k\u00f6nnte ClickHouse selbst die Daten optimal auf die Threads verteilen. <\/p>\n<p><\/p>\n<p>Ein zus\u00e4tzlicher Grund ist, dass es zu Inter-Prozess-Kommunikation \u00fcber TCP kommen wird. Daten m\u00fcssen serialisiert und deserialisiert werden, und dabei entstehen wesentlich mehr Mikroscharten. Das f\u00fchrt zu einer ineffizienten Arbeitsweise.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/18cacc17d22ae1cb2977c6be74769896.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiteres Problem, obwohl es schwer als solches zu bezeichnen ist, ist die gro\u00dfe Anzahl an Voraggregation.<\/p>\n<p><\/p>\n<p>Im Grunde genommen ist Pr\u00e4daggregation vorteilhaft. Hatten Sie eine Milliarde Zeilen, haben Sie sie aggregiert, und es sind nur noch 1.000 Zeilen \u00fcbrig, sodass die Abfrage jetzt blitzschnell ausgef\u00fchrt wird. Alles ist wunderbar. So kann man das machen. Daf\u00fcr gibt es sogar in ClickHouse einen speziellen Tabellentyp, den AggregatingMergeTree, der inkrementelle Aggregationen w\u00e4hrend des Datenimports durchf\u00fchrt. <\/p>\n<p><\/p>\n<p>Es gibt jedoch Situationen, in denen man denkt, dass wir die Daten so aggregieren werden und dann noch auf diese Weise. Und in einer benachbarten Abteilung, die ich lieber nicht benennen m\u00f6chte, verwenden sie SummingMergeTree-Tabellen zur Summierung nach dem Prim\u00e4rschl\u00fcssel, wobei sie als Prim\u00e4rschl\u00fcssel etwa 20 verschiedene Spalten nutzen. Ich habe zur Sicherheit einige Spaltennamen f\u00fcr die Anonymit\u00e4t ge\u00e4ndert, aber so in etwa ist es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/54e3a02ab4bbce7c63ded595780ae1f6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hierbei entstehen bestimmte Probleme. Erstens verringert sich das Datenvolumen nicht signifikant. Beispielsweise reduziert es sich nur um das Dreifache. Dreimal w\u00e4re ein akzeptabler Preis, um sich unbegrenzte Analytik-M\u00f6glichkeiten leisten zu k\u00f6nnen, die entstehen, wenn die Daten unaggregiert sind. Wenn die Daten jedoch aggregiert sind, erhalten Sie statt einer Analyse lediglich mickrige Statistiken. <\/p>\n<p><\/p>\n<p>Und was besonders \u00e4rgerlich ist? Dass diese Leute aus der benachbarten Abteilung manchmal kommen und bitten, eine weitere Spalte zum Prim\u00e4rschl\u00fcssel hinzuzuf\u00fcgen. Das hei\u00dft, wir haben die Daten so aggregiert, und jetzt wollen wir etwas mehr. Aber in ClickHouse gibt es keinen Befehl zum \u00c4ndern des Prim\u00e4rschl\u00fcssels. Daher muss man irgendwelche Skripte in C++ schreiben. Und ich mag Skripte nicht, selbst wenn sie in C++ sind.<\/p>\n<p><\/p>\n<p>Wenn man sich anschaut, wof\u00fcr ClickHouse entwickelt wurde, sind nicht aggregierte Daten genau das Szenario, f\u00fcr das es gedacht ist. Wenn Sie ClickHouse f\u00fcr nicht aggregierte Daten nutzen, machen Sie alles richtig. Aggregieren Sie jedoch, ist das manchmal verzeihlich. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/09fafd4c8a3ea8c22e586cb7a5cf6564.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiterer interessanter Fall sind Anfragen in einer Endlosschleife. Manchmal gehe ich auf einen Produktionsserver und schaue mir dort die Prozessliste an. Und jedes Mal entdecke ich, dass etwas Schreckliches passiert. <\/p>\n<p><\/p>\n<p>Zum Beispiel so etwas. Hier ist sofort klar, dass alles in einer einzigen Anfrage h\u00e4tte ausgef\u00fchrt werden k\u00f6nnen. Einfach dort url in und die Liste schreiben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/ae03b659f178962f50e0640614517296.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum ist es schlecht, wenn viele solcher Anfragen in einer Endlosschleife auftreten? Wenn der Index nicht verwendet wird, durchlaufen Sie dieselben Daten viele Male. Aber wenn der Index verwendet wird, zum Beispiel wenn Sie einen Prim\u00e4rschl\u00fcssel f\u00fcr ru haben und url = irgendetwas schreiben. Und Sie denken, dass eine spezifische url aus der Tabelle abgerufen wird, wird alles gut sein. In Wirklichkeit ist das jedoch nicht der Fall. Denn ClickHouse macht alles in Chargen. <\/p>\n<p><\/p>\n<p>Wenn es notwendig ist, einen bestimmten Datenbereich zu lesen, wird etwas mehr gelesen, da der Index in ClickHouse sp\u00e4rlich ist. Dieser Index kann nicht eine einzelne Zeile in der Tabelle finden, sondern nur einen bestimmten Bereich. Die Daten werden blockweise komprimiert. Um eine einzige Zeile zu lesen, muss der gesamte Block genommen und dekomprimiert werden. Wenn Sie also viele Anfragen ausf\u00fchren, wird es viele \u00dcberschneidungen geben und eine Menge Arbeit wird immer wiederholt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/95eef43c5b869f8b145c61ce3c616cfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein Bonus, den man erw\u00e4hnen sollte, ist, dass man in ClickHouse keine Angst haben muss, sogar Megabytes und Hundert Megabytes in die IN-Klausel zu \u00fcbergeben. Aus unserer Erfahrung wei\u00df ich, dass MySQL, wenn wir viele Werte in die IN-Klausel \u00fcbergeben, beispielsweise 100 Megabyte irgendwelcher Zahlen, 10 Gigabyte Arbeitsspeicher ben\u00f6tigt und dann nichts weiter passiert \u2013 alles funktioniert schlecht. <\/p>\n<p><\/p>\n<p>Und der zweite Punkt ist, dass in ClickHouse, wenn Ihre Abfragen einen Index verwenden, sie niemals langsamer sind als ein Full Scan, d. h. wenn nahezu die gesamte Tabelle gelesen werden muss, erfolgt dies sequentiell und es wird die gesamte Tabelle gelesen. ClickHouse organisiert das selbst.<\/p>\n<p><\/p>\n<p>Dennoch gibt es einige Herausforderungen. Zum Beispiel wird der IN-Befehl mit Unterabfragen keinen Index benutzen. Das ist unser Problem und wir m\u00fcssen das beheben. Es gibt hier nichts Fundamentales. Wir werden es reparieren. <\/p>\n<p><\/p>\n<p>Und noch etwas Interessantes \u2013 wenn Sie eine sehr lange Abfrage haben und die Abfragedistribution auf mehreren Servern erfolgt, wird diese sehr lange Abfrage auf jeden Server ohne Kompression gesendet. Zum Beispiel 100 Megabyte und 500 Server. Somit werden \u00fcber das Netzwerk 50 Gigabyte \u00fcbertragen. Es wird \u00fcbertragen und alles wird anschlie\u00dfend erfolgreich ausgef\u00fchrt.<\/p>\n<p><\/p>\n<p>* nutzt bereits; alles wurde wie versprochen repariert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/5fcde9bf04fff0645be2530daa12743f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist durchaus h\u00e4ufig, dass Anfragen aus APIs kommen. Angenommen, Sie haben einen eigenen Dienst. Und wenn dieser Dienst ben\u00f6tigt wird, haben Sie eine API ge\u00f6ffnet und sehen bereits nach zwei Tagen, dass etwas Ungew\u00f6hnliches passiert. Alles ist \u00fcberlastet und es kommen schreckliche Anfragen, die niemals gestellt werden sollten. <\/p>\n<p><\/p>\n<p>Die L\u00f6sung ist einfach. Wenn Sie eine API ge\u00f6ffnet haben, m\u00fcssen Sie sie limitieren. Zum Beispiel, indem Sie Quoten einf\u00fchren. Es gibt keine anderen vern\u00fcnftigen Optionen. Andernfalls wird sofort ein Skript geschrieben, und es gibt Probleme. <\/p>\n<p><\/p>\n<p>In ClickHouse gibt es eine spezielle Funktion - die Quotenverwaltung. Sie k\u00f6nnen sogar Ihren eigenen Quoten-Schl\u00fcssel \u00fcbergeben. Dies k\u00f6nnte beispielsweise eine interne Benutzer-ID sein. Die Quoten werden dann unabh\u00e4ngig f\u00fcr jeden einzelnen von ihnen gez\u00e4hlt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/532438d0f116919e62f04e32ebbd3c45.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt noch etwas Interessantes. Dies betrifft die manuelle Replikation. <\/p>\n<p><\/p>\n<p>Ich kenne viele F\u00e4lle, in denen, obwohl ClickHouse eine integrierte Unterst\u00fctzung f\u00fcr Replikation bietet, die Leute ClickHouse manuell replizieren.<\/p>\n<p><\/p>\n<p>Welches Prinzip? Sie haben eine Datenverarbeitungspipeline, die unabh\u00e4ngig funktioniert, zum Beispiel in verschiedenen Rechenzentren. Sie zeichnen die gleichen Daten auf die gleiche Weise in ClickHouse auf. Allerdings zeigt die Praxis, dass die Daten aufgrund bestimmter Besonderheiten in Ihrem Code trotzdem voneinander abweichen werden. Ich hoffe, das ist bei Ihnen nicht der Fall. <\/p>\n<p><\/p>\n<p>Und hin und wieder m\u00fcssen Sie trotzdem manuell synchronisieren. Beispielsweise f\u00fchren die Administratoren einmal im Monat einen rsync durch.<\/p>\n<p><\/p>\n<p>Tats\u00e4chlich ist es viel einfacher, die eingebaute Replikation in ClickHouse zu verwenden. Es gibt jedoch einige Vorbehalte, denn daf\u00fcr muss ZooKeeper verwendet werden. Ich werde nichts Schlechtes \u00fcber ZooKeeper sagen; grunds\u00e4tzlich ist das System funktional, aber manchmal vermeiden es die Leute aufgrund von Java-Phobie, weil ClickHouse ein tolles System ist, das in C++ geschrieben wurde und sehr gut funktioniert. ZooKeeper hingegen l\u00e4uft auf Java. Und es ist irgendwie nicht angenehm, sich damit zu besch\u00e4ftigen; dann k\u00f6nnen Sie auch die manuelle Replikation nutzen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/3b5b68996daef6b8920f067b189f25e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse ist ein praktisches System, das auf Ihre Bed\u00fcrfnisse zugeschnitten ist. Wenn Sie manuelle Replikation verwenden, k\u00f6nnen Sie eine verteilte Tabelle erstellen, die auf Ihre manuellen Replikate zugreift und automatisch zwischen ihnen Failover durchf\u00fchrt. Es gibt sogar eine spezielle Option, die es Ihnen erm\u00f6glicht, Flaps zu vermeiden, selbst wenn Ihre Replikate systematisch voneinander abweichen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/70f6630f8b14756163923a7db8dd7391.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es k\u00f6nnen Probleme auftreten, wenn Sie primitive Tabellen-Engines verwenden. ClickHouse ist ein Aufbau mit einer Vielzahl verschiedener Tabellengere, die Sie nutzen k\u00f6nnen. F\u00fcr alle ernsthaften Anwendungsf\u00e4lle, wie in der Dokumentation beschrieben, verwenden Sie Tabellen der MergeTree-Familie. Alle anderen sind f\u00fcr spezielle F\u00e4lle oder f\u00fcr Tests gedacht.<\/p>\n<p><\/p>\n<p>In einer MergeTree-Tabelle ist es nicht unbedingt erforderlich, dass Sie ein Datum und eine Uhrzeit haben. Sie k\u00f6nnen es dennoch verwenden. Wenn kein Datum und keine Uhrzeit vorhanden sind, geben Sie an, dass das Standarddatum das Jahr 2000 ist. Das funktioniert und erfordert keine zus\u00e4tzlichen Ressourcen. <\/p>\n<p><\/p>\n<p>In der neuen Serverversion k\u00f6nnen Sie sogar angeben, dass Sie eine benutzerdefinierte Partitionierung ohne Partitionierungsschl\u00fcssel haben m\u00f6chten. Es wird dasselbe sein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/6d4046d11afdd1e5962d49a1612b666a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Auf der anderen Seite k\u00f6nnen primitive Tabellen-Engines verwendet werden. Zum Beispiel, einmalige Datenzufuhr und dann analysieren, drehen und l\u00f6schen. Sie k\u00f6nnen Log verwenden.<\/p>\n<p><\/p>\n<p>Oder die Speicherung kleiner Datenmengen f\u00fcr die Zwischenverarbeitung \u2013 das ist StripeLog oder TinyLog.<\/p>\n<p><\/p>\n<p>Memory kann genutzt werden, wenn nur eine kleine Datenmenge vorhanden ist und einfach etwas im RAM gedreht werden soll. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/8a3d4e0e3a8c26dd3a2b2f64123e2bf9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>ClickHouse mag \u00fcbernormalisierte Daten nicht besonders. <\/p>\n<p><\/p>\n<p>Hier ist ein typisches Beispiel. Das ist eine gro\u00dfe Anzahl von URLs. Sie haben sie in eine benachbarte Tabelle gesteckt. Dann haben Sie entschieden, einen JOIN damit durchzuf\u00fchren, aber das wird in der Regel nicht funktionieren, da ClickHouse nur Hash JOIN unterst\u00fctzt. Wenn nicht gen\u00fcgend RAM vorhanden ist, um mit den vielen Daten, die verbunden werden m\u00fcssen, umzugehen, kann der JOIN nicht durchgef\u00fchrt werden*. <\/p>\n<p><\/p>\n<p>Wenn die Daten eine hohe Kardinalit\u00e4t haben, machen Sie sich keine Sorgen, speichern Sie sie in denormalisierter Form, URLs direkt inplace in der Haupttabelle. <\/p>\n<p><\/p>\n<p>* mittlerweile gibt es in ClickHouse auch den Merge-Join, der funktioniert, wenn die Zwischendaten nicht in den RAM passen. Aber es ist ineffizient und die Empfehlung bleibt bestehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/e8160a8db17c18d48f810092c55b094c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier sind noch ein paar Beispiele, aber ich bin mir nicht mehr sicher, ob sie wirklich Antipattern sind oder nicht. <\/p>\n<p><\/p>\n<p>ClickHouse hat einen bekannten Nachteil: Es unterst\u00fctzt keine Updates*. Das hat sogar seine Vorteile. Wenn Sie wichtige Daten haben, etwa aus der Buchhaltung, k\u00f6nnen diese nicht versendet werden, da keine Updates vorhanden sind.<\/p>\n<p><\/p>\n<p>* Unterst\u00fctzung f\u00fcr Updates und Deletes im Batch-Modus wurde bereits lange hinzugef\u00fcgt.<\/p>\n<p><\/p>\n<p>Es gibt jedoch einige spezielle Methoden, mit denen Updates quasi im Hintergrund durchgef\u00fchrt werden k\u00f6nnen. Zum Beispiel Tabellen des Typs ReplaceMergeTree, die Updates w\u00e4hrend der Hintergrundmerges durchf\u00fchren. Sie k\u00f6nnen dies mit dem Befehl optimize table forcieren. Aber machen Sie das nicht zu oft, denn das f\u00fchrt zur vollst\u00e4ndigen Neubeschreibung der Partition. <\/p>\n<p><\/p>\n<p>Verteilte JOINS in ClickHouse werden vom Abfrageplaner ebenfalls schlecht behandelt. <\/p>\n<p><\/p>\n<p>Schlecht, aber manchmal in Ordnung.<\/p>\n<p><\/p>\n<p>Die Nutzung von ClickHouse nur, um Daten \u00fcber select* wieder abzurufen.<\/p>\n<p><\/p>\n<p>Ich w\u00fcrde nicht empfehlen, ClickHouse f\u00fcr rechenintensive Berechnungen zu verwenden. Das ist jedoch nicht ganz richtig, weil wir von dieser Empfehlung abweichen. Neu hinzugekommen ist die M\u00f6glichkeit, Machine-Learning-Modelle in ClickHouse zu verwenden \u2013 Catboost. Das beunruhigt mich, denn ich frage mich: \u201eWie viele Taktzyklen pro Byte gibt es da?\u201c Es tut mir leid, Taktzyklen f\u00fcr Bytes zu verwenden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Effektive Nutzung von ClickHouse. Alexey Milovidov (Yandex)\" src=\"\/wp-content\/uploads\/2020\/08\/f686d5d352ccb444cd06e2ae68897137.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Keine Sorge, installieren Sie ClickHouse, alles wird gut. Sollte es Probleme geben, haben wir eine Community. \u00dcbrigens, die Community sind Sie. Falls Sie Schwierigkeiten haben, k\u00f6nnen Sie gerne in unseren Chat kommen und ich hoffe, dass Ihnen geholfen wird. <\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr die Pr\u00e4sentation! Wo kann ich mich \u00fcber einen Ausfall von ClickHouse beschweren?<\/em><\/p>\n<p><\/p>\n<p>Sie k\u00f6nnen sich direkt jetzt an mich wenden. <\/p>\n<p><\/p>\n<p><em>Ich habe vor kurzem angefangen, ClickHouse zu nutzen. Ich habe sofort die CLI-Oberfl\u00e4che zum Absturz gebracht.<\/em><\/p>\n<p><\/p>\n<p>Sie haben Gl\u00fcck gehabt. <\/p>\n<p><\/p>\n<p><em>Ein wenig sp\u00e4ter habe ich den Server mit einer kleinen SELECT-Abfrage zum Absturz gebracht.<\/em><\/p>\n<p><\/p>\n<p>Sie haben Talent. <\/p>\n<p><\/p>\n<p><em>Ich habe einen Bug auf GitHub gemeldet, aber er wurde ignoriert.<\/em> <\/p>\n<p><\/p>\n<p>Mal sehen. <\/p>\n<p><\/p>\n<p><em>Alexey hat mich unter falschem Vorwand zur Pr\u00e4sentation gebracht, indem er versprach, mir zu zeigen, wie Sie die Daten intern komprimieren.<\/em><\/p>\n<p><\/p>\n<p>Sehr einfach. <\/p>\n<p><\/p>\n<p><em>Das habe ich schon gestern verstanden. Mehr Details bitte.<\/em> <\/p>\n<p><\/p>\n<p>Es gibt keine furchtbaren Tricks. Es handelt sich einfach um eine Blockkomprimierung. Standardm\u00e4\u00dfig wird LZ4 verwendet, ZSTD* kann jedoch aktiviert werden. Bl\u00f6cke reichen von 64 Kilobyte bis 1 Megabyte.<\/p>\n<p><\/p>\n<p>* Es gibt auch Unterst\u00fctzung f\u00fcr spezialisierte Komprimierungs-Codecs, die in Kombination mit anderen Algorithmen verwendet werden k\u00f6nnen.<\/p>\n<p><\/p>\n<p><em>Sind in den Bl\u00f6cken einfach nur rohe Daten?<\/em><\/p>\n<p><\/p>\n<p>Nicht ganz roh. Es sind dort Arrays. Wenn Sie eine numerische Spalte haben, sind die Zahlen hintereinander in einem Array angeordnet. <\/p>\n<p><\/p>\n<p><em>Verstanden.<\/em> <\/p>\n<p><\/p>\n<p><em>Alexej, ein Beispiel, das mit uniqExact bei IP-Adressen gezeigt wurde, d. h. dass uniqExact f\u00fcr Strings l\u00e4nger ben\u00f6tigt als f\u00fcr Zahlen usw. Aber was passiert, wenn wir einen Trick anwenden und beim Lesen casten? Sie haben anscheinend gesagt, dass sich das auf der Festplatte nicht wesentlich unterscheidet. Wenn wir beim Lesen von Strings von der Festplatte casten, werden unsere Aggregationen dann schneller oder nicht? Oder gewinnen wir hier doch nur minimal? Ich glaube, Sie haben das getestet, aber warum haben Sie es im Benchmark nicht angegeben?<\/em> <\/p>\n<p><\/p>\n<p>Ich denke, es wird langsamer sein als ohne Casting. In diesem Fall m\u00fcsste die IP-Adresse aus der Zeichenfolge geparst werden. Nat\u00fcrlich ist das Parsen von IP-Adressen in ClickHouse auch optimiert. Wir haben uns wirklich M\u00fche gegeben, aber die Zahlen sind bei Ihnen in einer Zehntausenderdarstellung gespeichert. Sehr unpraktisch. Andererseits wird die Funktion uniqExact bei Strings langsamer arbeiten, nicht nur weil es Strings sind, sondern auch weil eine andere Algorithmusspezialisierung ausgew\u00e4hlt wird. Strings werden einfach anders verarbeitet.<\/p>\n<p><\/p>\n<p><em>Und was ist, wenn wir einen primitiveren Datentyp nehmen? Zum Beispiel, wir haben die user id, die wir als String gespeichert haben, und dann gecastet, wird es interessanter oder nicht?<\/em><\/p>\n<p><\/p>\n<p>Ich habe Zweifel. Ich denke, es wird sogar noch trauriger, denn das Parsen von Zahlen ist ein ernstes Problem. Ich glaube, dieser Kollege hatte sogar einen Vortrag dar\u00fcber gehalten, wie schwierig es ist, Zahlen im Zehntausenderformat zu parsen, oder vielleicht auch nicht. <\/p>\n<p><\/p>\n<p><em>Alexey, vielen Dank f\u00fcr den Vortrag! Und auch vielen Dank f\u00fcr ClickHouse! Ich habe eine Frage zu den Pl\u00e4nen. Ist eine Funktion f\u00fcr ein teilweises Update der Dictionate geplant?<\/em><\/p>\n<p><\/p>\n<p>Also eine partielle Neuinitialisierung?<\/p>\n<p><\/p>\n<p><em>Ja, genau. Eine M\u00f6glichkeit, ein MySQL-Feld anzugeben, um nur die Daten zu aktualisieren, die nach einem bestimmten Punkt geladen werden, wenn das Dictionary sehr gro\u00df ist.<\/em><\/p>\n<p><\/p>\n<p>Eine sehr interessante Funktion. Ich glaube, jemand hat das in unserem Chat vorgeschlagen. Vielleicht waren Sie das sogar. <\/p>\n<p><\/p>\n<p><em>Ich glaube nicht, dass ich das war.<\/em><\/p>\n<p><\/p>\n<p>Ausgezeichnet, jetzt haben wir also zwei Anfragen. Und wir k\u00f6nnen gem\u00fctlich damit anfangen. Aber ich m\u00f6chte Sie gleich warnen, dass diese Funktion recht einfach zu implementieren ist. Man m\u00fcsste theoretisch einfach die Versionsnummer in die Tabelle schreiben und dann angeben: Version ist kleiner als die bestimmte Zahl. Das bedeutet, dass wir wahrscheinlich den Enthusiasten vorschlagen werden, dies zu \u00fcbernehmen. Sind Sie ein Enthusiast? <\/p>\n<p><\/p>\n<p><em>Ja, aber leider nicht in C++.<\/em><\/p>\n<p><\/p>\n<p>K\u00f6nnen Ihre Kollegen in C++ programmieren? <\/p>\n<p><\/p>\n<p><em>Ich werde jemanden finden.<\/em><\/p>\n<p><\/p>\n<p>Ausgezeichnet.<\/p>\n<p><\/p>\n<p>* Die M\u00f6glichkeit wurde zwei Monate nach dem Vortrag hinzugef\u00fcgt \u2013 sie wurde vom Autor der Frage entwickelt und sein <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\/pull\/1771\">Pull-Request<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><em>Danke!<\/em><\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Vortrag! Sie haben erw\u00e4hnt, dass ClickHouse alle ihm zur Verf\u00fcgung stehenden Ressourcen sehr gut nutzt. Der Referent neben Luxoft sprach \u00fcber seine L\u00f6sung f\u00fcr die russische Post. Er sagte, dass ihnen ClickHouse sehr gefallen hat, sie es aber nicht anstelle ihres Hauptkonkurrenten verwendet haben, weil es die gesamte CPU verschlang. Und sie konnten es nicht in ihre Architektur integrieren, in ihren ZooKeeper mit den Docker-Containern. Gibt es eine M\u00f6glichkeit, ClickHouse so zu beschr\u00e4nken, dass es nicht alles verbraucht, was ihm zur Verf\u00fcgung steht?<\/em><\/p>\n<p><\/p>\n<p>Ja, das ist m\u00f6glich und sehr einfach. Wenn Sie m\u00f6chten, dass weniger Kerne verwendet werden, dann schreiben Sie einfach <code>set max_threads = 1<\/code>. Und dann wird die Anfrage auf einem Kern ausgef\u00fchrt. Au\u00dferdem k\u00f6nnen verschiedenen Benutzern unterschiedliche Einstellungen zugewiesen werden. Das sind also \u00fcberhaupt keine Probleme. Und bitte teilen Sie den Kollegen von Luxoft mit, dass es nicht gut ist, dass sie diese Einstellung nicht in der Dokumentation gefunden haben. <\/p>\n<p><\/p>\n<p><em>Hallo Alexey! Ich m\u00f6chte eine Frage stellen. Ich habe schon \u00f6fter geh\u00f6rt, dass viele ClickHouse als Speichersystem f\u00fcr Logs verwenden. In Ihrem Vortrag haben Sie gesagt, dass man das nicht tun sollte, also dass man keine langen Zeilen speichern sollte. Wie stehen Sie dazu?<\/em><\/p>\n<p><\/p>\n<p>Zun\u00e4chst einmal sind Logs in der Regel keine langen Zeilen. Es gibt nat\u00fcrlich Ausnahmen. Zum Beispiel, wenn ein Service, der in Java geschrieben ist, eine Ausnahme ausl\u00f6st, wird dies protokolliert. Und das geschieht in einer Endlosschleife, wodurch der Speicherplatz auf der Festplatte knapp wird. Die L\u00f6sung ist ganz einfach: Wenn die Zeilen sehr lang sind, schneiden Sie sie ab. Aber was bedeutet 'lang'? Zehntausende von Bytes \u2013 das ist schlecht*.<\/p>\n<p><\/p>\n<p>* In den neuesten Versionen von ClickHouse ist die &quot;adaptive Granularit\u00e4t des Indexes&quot; aktiviert, was das Problem der Speicherung langer Strings gr\u00f6\u00dftenteils behebt.<\/p>\n<p><\/p>\n<p><em>Ist ein Kilobyte normal?<\/em><\/p>\n<p><\/p>\n<p>Das ist normal. <\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr Ihren Vortrag! Ich habe dazu bereits im Chat gefragt, erinnere mich aber nicht, ob ich eine Antwort erhalten habe. Ist es geplant, die WITH-Sektion in der Art von CTE zu erweitern?<\/em><\/p>\n<p><\/p>\n<p>Momentan nicht. Die WITH-Sektion ist bei uns etwas unbedeutend. Sie ist eine kleine Funktion.<\/p>\n<p><\/p>\n<p><em>Ich verstehe. Danke!<\/em><\/p>\n<p><\/p>\n<p><em>Vielen Dank f\u00fcr den Vortrag! Sehr interessant! Eine globale Frage. Ist geplant, eventuell in Form von Platzhaltern eine Modifikation f\u00fcr die Datenl\u00f6schung zu erstellen?<\/em><\/p>\n<p><\/p>\n<p>Ja, unbedingt. Das ist unsere erste Aufgabe in der Warteschlange. Wir haben bereits aktiv \u00fcberlegt, wie wir alles richtig umsetzen k\u00f6nnen. Und es ist Zeit, mit dem Tippen auf der Tastatur zu beginnen*.<\/p>\n<p><\/p>\n<p>* Wir haben die Tasten auf der Tastatur gedr\u00fcckt und alles erledigt.<\/p>\n<p><\/p>\n<p><em>Wird sich das irgendwie auf die Systemleistung auswirken oder nicht? Wird die Einf\u00fcgung genauso schnell sein wie bisher?<\/em><\/p>\n<p><\/p>\n<p>M\u00f6glicherweise werden die L\u00f6sch- und Aktualisierungsoperationen sehr aufwendig sein, aber das wird sich nicht auf die Leistung der Abfragen und Einf\u00fcgungen auswirken.<\/p>\n<p><\/p>\n<p><em>Und noch eine kleine Frage. In der Pr\u00e4sentation sprachen Sie \u00fcber den Prim\u00e4rschl\u00fcssel. Entsprechend haben wir eine Partitionierung, die standardm\u00e4\u00dfig monatlich ist, richtig? Und wenn wir einen Datumsbereich angeben, der in einen Monat f\u00e4llt, wird nur diese Partition gelesen, korrekt?<\/em><\/p>\n<p><\/p>\n<p>Ja.<\/p>\n<p><\/p>\n<p><em>Eine solche Frage. Wenn wir keinen Prim\u00e4rschl\u00fcssel definieren k\u00f6nnen, ist es sinnvoll, ihn anhand des Feldes \"Datum\" zu erstellen, um eine geringere Umschichtung dieser Daten im Hintergrund zu erm\u00f6glichen, damit sie ordentlicher sortiert werden? Wenn Sie keine Bereichsanfragen haben und keinen Prim\u00e4rschl\u00fcssel ausw\u00e4hlen k\u00f6nnen, sollte dann das Datum im Prim\u00e4rschl\u00fcssel enthalten sein?<\/em><\/p>\n<p><\/p>\n<p>Ja.<\/p>\n<p><\/p>\n<p>Vielleicht macht es Sinn, ein Feld im Prim\u00e4rschl\u00fcssel zu haben, nach dem die Daten besser komprimiert werden, wenn sie nach diesem Feld sortiert sind. Zum Beispiel die ID des Benutzers. Der Benutzer besucht h\u00e4ufig dieselbe Website. In diesem Fall f\u00fcgen Sie die Benutzer-ID und die Zeit hinzu. Dann werden Ihre Daten besser komprimiert. Was das Datum betrifft: Wenn Sie wirklich keine und niemals Bereichsanfragen nach Daten haben, k\u00f6nnen Sie das Datum auch aus dem Prim\u00e4rschl\u00fcssel herauslassen. <\/p>\n<p><\/p>\n<p><em>Gut, vielen Dank!<\/em><\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/514840\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91439,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-13T17:42:36+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Effiziente Nutzung von ClickHouse. Alexey Milovidov (Yandex) | ProHoster","description":"Da ClickHouse ein spezialisiertes System ist, ist es wichtig, die Besonderheiten seiner Architektur zu ber\u00fccksichtigen. In diesem Bericht wird Alexey typische Fehler beim Einsatz von ClickHouse erl\u00e4utern, die zu einer ineffizienten Arbeitsweise f\u00fchren k\u00f6nnen. An praktischen Beispielen wird gezeigt, wie die Wahl einer bestimmten Datenverarbeitungsschema die Leistung erheblich beeinflussen kann. Hallo zusammen! Ich hei\u00dfe","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 ClickHouse. \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041c\u0438\u043b\u043e\u0432\u0438\u0434\u043e\u0432 (\u042f\u043d\u0434\u0435\u043a\u0441) | ProHoster","og:description":"\u0422\u0430\u043a \u043a\u0430\u043a ClickHouse \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ClickHouse, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u044b\u0431\u043e\u0440 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438. \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/effektivnoe-ispolzovanie-clickhouse-aleksej-milovidov-yandeks","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-13T17:42:36+00:00","article:modified_time":"2020-08-13T17:42:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91438","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:27:23","updated":"2022-09-28 17:25:41"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/91438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=91438"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/91438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/91439"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=91438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=91438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=91438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}