Neulich haben wir beschlossen, mit Dmitry Bugaychenko ( dmitrybugaychenko ), einem unserer Lehrer des Programms "Datenanalyse auf Scala", zu sprechen und mit ihm aktuelle Probleme bei der Verwendung von Scala in den Aufgaben von Data Science und Data Engineering zu besprechen. Dmitry ist Analytiker bei Odnoklassniki.

- Dima, du arbeitest bei Odnoklassniki. Sag mir, was machst du da?
In Odnoklassniki begann ich 2011 mit der Arbeit an einem Entwurf einer Musikempfehlung. Es war eine sehr interessante und schwierige Aufgabe - die meisten Musikempfehlungsdienste zu dieser Zeit basierten auf gut katalogisierten Veröffentlichungsinhalten, während wir echte UGC (User Generated Content) hatten, die zuerst gekämmt und in Regale sortiert werden mussten. Im Allgemeinen erwies sich das resultierende System als recht gut und sie beschlossen, die Erfahrung auf andere Bereiche der Website auszudehnen: Gruppenempfehlungen, Freundschaften, Rangfolge des Feeds usw. Gleichzeitig wuchs das Team, die Infrastruktur entwickelte sich, neue Algorithmen und Technologien wurden eingeführt. Jetzt habe ich ein ziemlich breites Spektrum an Verantwortlichkeiten: Koordination der Daten von Wissenschaftlern, Entwicklung der DS-Infrastruktur, Forschungsprojekte usw.
- Wie lange verwenden Sie Spark schon? Was ist die Notwendigkeit?
Die ersten Versuche, sich mit Spark anzufreunden, waren 2013, waren jedoch erfolglos. Wir brauchten dringend ein leistungsstarkes interaktives Tool, mit dem wir Hypothesen schnell testen konnten, aber Spark dieser Zeit konnte nicht die Stabilität und Skalierbarkeit bieten, die wir brauchten. Der zweite Versuch, den wir ein Jahr später machten, im Jahr 2014, und diesmal lief alles viel besser. Im selben Jahr begannen wir mit der Implementierung von Streaming-Analyse-Tools auf der Basis von Kafka und Samza, versuchten Spark Streaming, konnten es dann aber nicht starten. Aufgrund der relativ frühen Implementierung befanden wir uns bis 2017 für eine Weile in einer Aufholposition - eine große Menge Code auf dem ersten Spark hat uns daran gehindert, auf den zweiten umzusteigen, aber im Sommer 2018 haben wir dieses Problem gelöst und arbeiten nun an 2.3.3. In dieser Version hat das Streaming bereits stabiler funktioniert und wir haben bereits einige neue Produktaufgaben erledigt.
- Soweit ich weiß, verwenden Sie die Scala-API, nicht wie die meisten Python. Warum so?
Ich sehe aufrichtig keinen Grund, Python für die Arbeit mit Spark zu verwenden, außer Faulheit. Die Scala-API ist flexibler und effizienter, aber nicht komplizierter. Wenn Sie die Standardfunktionen von Spark SQL verwenden, ist der Scala-Code fast identisch mit dem entsprechenden Python-Code, und die Geschwindigkeit ist identisch. Wenn Sie jedoch versuchen, die einfachste benutzerdefinierte Funktion zu erstellen, wird der Unterschied offensichtlich: Die Arbeit des Scala-Codes bleibt ebenso effizient, und der Python-Code verwandelt einen Multi-Core-Cluster in einen Kürbis und beginnt, Kilowatt / Stunde für völlig unproduktive Aktivitäten zu verbrennen. In dem Ausmaß, mit dem wir arbeiten müssen, können wir uns eine solche Verschwendung einfach nicht leisten.
- C Python ist verständlich. Und ist Scala im Vergleich zu Java überhaupt etwas Besseres für die Datenanalyse? In Java werden viele Dinge in den Big Data Stack geschrieben.
Wir verwenden Java sehr häufig, auch beim maschinellen Lernen. Wir versuchen, nicht auf die am höchsten geladenen Scala-Anwendungen zuzugreifen. Aber wenn es um interaktive Analyse und Rapid Prototyping geht, wird der Lakonismus von Scala zu einem Plus. Natürlich sollten Sie immer bedenken, dass es beim Programmieren in Scala sehr einfach ist, die Beine an die Ohren zu schießen - viele Designs verhalten sich möglicherweise nicht so, wie Sie es von einer Position des gesunden Menschenverstandes erwarten würden, und einige einfache Vorgänge verursachen unnötiges Kopieren und Versuche, sich zu materialisieren Datensätze im Speicher.
- Warum ist Scala bei all diesen Vorteilen noch nicht so beliebt? Übertrifft es Python und Java deutlich?
Scala ist ein sehr leistungsfähiges Tool, das von demjenigen, der es verwendet, eine ausreichend hohe Qualifikation erfordert. Darüber hinaus werden mit der Teamentwicklung zusätzliche Anforderungen an die allgemeine Ebene der Entwicklungskultur gestellt: Der Code auf Scala ist sehr einfach zu schreiben, wird jedoch nach einiger Zeit vom Autor nicht immer erfolgreich gelesen und kann unter der Haube einer einfachen API eine Art Spiel erstellen. Daher sollte besonderes Augenmerk auf die Aufrechterhaltung eines einheitlichen Stils, Funktions- und Stresstests der Lösung gelegt werden.
Nun, wenn man JVM-Sprachen vergleicht, kann man Kotlin nur erwähnen - es gewinnt an Popularität, wird von vielen als „ideologisch verifizierter“ angesehen und unterstützt Spark sogar als Teil des Sparklin-Projekts, obwohl es immer noch sehr begrenzt ist. Wir selbst verwenden es noch nicht für Spark, verfolgen aber die Entwicklung genau.
- Zurück zu Spark. Soweit ich weiß, hat Ihnen diese Scala-API-Funktionalität immer noch nicht gefallen, und Sie haben eine Art Gabel für Spark geschrieben?
Es wäre falsch, unsere PravdaML- Projektgabel aufzurufen : Diese Bibliothek ersetzt nicht die SparkML-Funktionalität, sondern ergänzt sie durch neue Funktionen. Wir kamen zu den Entscheidungen, die dort umgesetzt wurden, und versuchten, die Band-Ranking-Modelle zu skalieren und auf die reproduzierbaren Schienen zu setzen. Tatsache ist, dass Sie bei der Entwicklung effektiver Algorithmen für verteiltes maschinelles Lernen viele "technische" Faktoren berücksichtigen müssen: Wie werden Daten korrekt in Knoten zerlegt, an welchem Punkt müssen sie zwischengespeichert, heruntergesampelt usw. werden? Es gibt keine Möglichkeit, diese Aspekte in der Standard-SparkML zu verwalten, und sie müssen über die ML-Pipeline hinaus verschoben werden, was sich negativ auf die Verwaltbarkeit und Reproduzierbarkeit auswirkt.
- Ich erinnere mich, dass Sie zwei Optionen für den Namen hatten ...
Ja, der ursprüngliche Name ok-ml-pipelines schien den Jungs langweilig, daher sind wir gerade dabei, den neuen Namen PravdaML umzubenennen.
- Viele Leute benutzen es außerhalb Ihres Teams?
Ich denke nicht viel, aber wir arbeiten daran. J.
- Lassen Sie uns über Rollen und Berufe im Bereich der Arbeit mit Daten sprechen. Sagen Sie mir, sollte ein Datenwissenschaftler Code in der Produktion schreiben oder ist dies bereits ein anderer Beruf und eine andere Rolle?
Die Antwort auf diese Frage ist meine Meinung, und es gibt eine harte Realität. Ich habe immer gedacht, dass eine Person für die erfolgreiche Implementierung von ML-Lösungen verstehen muss, wo und warum alles implementiert wird (wer der Benutzer ist, welche Bedürfnisse er hat und welche Bedürfnisse das Unternehmen hat), er muss verstehen, welche mathematischen Methoden zur Entwicklung der Lösung angewendet werden können, und wie diese Methoden aus technischer Sicht funktionieren können. Daher versuchen wir in Odnoklassniki immer noch, uns an das Modell der Einzelverantwortung zu halten, wenn eine Person eine Initiative entwickelt, diese umsetzt und umsetzt. Um einzelne private Probleme zu lösen, sei es ein effektives DBMS oder ein interaktives Layout, können Sie natürlich immer Leute mit umfassender Erfahrung in diesen Bereichen anziehen, aber die Integration all dessen in einen einzigen Mechanismus bleibt beim Wissenschaftler als der Person, die am besten versteht, was genau und wie es funktionieren soll Ausgabe.
Es gibt jedoch eine harte Realität auf dem Arbeitsmarkt, die im Bereich der ML inzwischen stark überhitzt ist, was dazu führt, dass viele junge Fachkräfte es nicht für notwendig halten, etwas anderes als ML selbst zu studieren. Infolgedessen wird es immer schwieriger, einen Spezialisten für den gesamten Zyklus zu finden. Obwohl kürzlich eine gute Alternative aufgetaucht ist: Die Praxis hat gezeigt, dass gute Programmierer ML ziemlich schnell und recht gut lernen. J.
- Datum Ingenieur müssen Scala kennen? Wie gut übrigens? Muss ich in den Dschungel der funktionalen Programmierung gehen?
Es ist auf jeden Fall notwendig, Scala zu kennen, schon allein deshalb, weil zwei grundlegende Tools wie Kafka und Spark darauf geschrieben sind und Sie in der Lage sein müssen, ihren Quellcode zu lesen. Was den "Dschungel der funktionalen Programmierung" betrifft, würde ich ihnen dringend raten, nicht zu viel zu missbrauchen: Je mehr Entwickler den Code lesen und verstehen können, desto besser. Auch wenn dafür manchmal „elegantes“ funktionales Design in einem banalen Zyklus eingesetzt werden muss.
- Das Universum der Berufe in diesem Bereich hat bereits aufgehört zu expandieren, oder sollten wir noch auf die Entstehung neuer Berufe warten?
Ich denke, dass es in absehbarer Zeit in ML und DS einen Wendepunkt in Bezug auf die Automatisierung geben wird: Die Hauptmuster, denen Menschen bei der Arbeit mit Attributen, der Auswahl eines Modells und seiner Parameter und der Qualitätsprüfung folgen, werden automatisiert. Dies wird dazu führen, dass die Nachfrage nach Spezialisten, die "die Parameter auswählen", erheblich sinken wird, aber AutoML-Ingenieure, die automatisierte Lösungen implementieren und entwickeln können, werden gefragt sein.
"Sie unterrichten aktiv, wie ich es verstehe." Warum halten Sie das für wichtig? Was ist die Motivation dahinter?
Wir alle werden eines Tages in den Ruhestand gehen und die Qualität unseres Lebens wird stark davon abhängen, wer uns ersetzen wird. Investitionen in die Bildung der nächsten Generation sind daher eine der wichtigsten.
- In unserem Programm "Datenanalyse auf Scala" werden Sie mehrere Klassen durchführen. Erzähl mir kurz davon. Welche Bedeutung haben sie?
In diesen Kursen werden wir nur untersuchen, wie Ingenieurwesen und Mathematik zusammenpassen: wie man den Prozess richtig organisiert, ohne unnötige Hindernisse für ETL-> ML-> Prod einzuführen. Der Kurs basiert auf den Funktionen von Spark ML: Grundkonzepte, unterstützte Konvertierungen, implementierte Algorithmen und deren Einschränkungen. Wir werden auf den Bereich eingehen, in dem die vorhandenen SparkML-Funktionen nicht ausreichen, und es wird erforderlich, Erweiterungen wie PravdaML zu verwenden. Nun, es wird definitiv Übung geben, nicht nur auf der Ebene des „Zusammenstellens einer Lösung aus vorgefertigten Würfeln“, sondern auch darüber, wie man versteht, dass hier ein neuer „Würfel“ benötigt wird und wie man ihn implementiert.
- Gibt es ein Lieblingswortspiel mit Scala? Kletterwand, Kletterer, Felskunst - verwenden Sie im Alltag?
Es sei denn, das Epitheton „indoskal“, mit dem wir besonders bemerkenswerte Open-Source-Stücke ansprechen, deren Autor eindeutig die bemerkenswerte Fähigkeit demonstrieren wollte, unlesbaren Code mithilfe funktionaler Abstraktionen zu konstruieren.
- Moskau oder Peter?
Jede Stadt hat ihre eigene Lust. Moskau ist eine reiche und gepflegte Stadt mit einem schnellen Rhythmus. Peter ist ruhiger und erfüllt vom Charme der ehemaligen europäischen Hauptstadt. Deshalb komme ich gerne nach Moskau, um dort zu besuchen, aber ich lebe lieber in St. Petersburg.