Más allá de la interactividad: innovación en portátiles en Netflix

Por Michelle Ufford, M Pacer, Matthew Seal y Kyle Kelley

Las computadoras portátiles han crecido rápidamente en popularidad entre los científicos de datos para convertirse en el estándar de facto para la creación rápida de prototipos y análisis exploratorios. En Netflix, estamos ampliando aún más los límites, reimaginando lo que puede ser un portátil, quién puede usarlo y qué pueden hacer con él. Y estamos haciendo grandes inversiones para ayudar a hacer realidad esta visión.

En esta publicación, compartiremos nuestras motivaciones y por qué nos parecen tan atractivos los cuadernos Jupyter. También presentaremos componentes de nuestra infraestructura de computadoras portátiles y exploraremos algunas de las formas novedosas en que las estamos usando en Netflix.

Si tiene poco tiempo, le sugerimos saltar a la sección Casos de uso.

Motivaciones

Los datos alimentan a Netflix. Permea nuestros pensamientos, informa nuestras decisiones y desafía nuestras suposiciones. Impulsa la experimentación y la innovación a una escala sin precedentes. Los datos nos ayudan a descubrir contenido fantástico y ofrecer experiencias personalizadas para nuestros 130 millones de miembros en todo el mundo.

Hacer esto posible no es poca cosa; requiere un amplio soporte de ingeniería e infraestructura. Todos los días se escriben más de 1 billón de eventos en una canalización de ingestión de transmisión, que se procesa y se escribe en un almacén de datos nativo de la nube de 100 PB. Y todos los días, nuestros usuarios ejecutan más de 150,000 trabajos con estos datos, que abarcan desde informes y análisis hasta aprendizaje automático y algoritmos de recomendación. Para admitir estos casos de uso a tal escala, hemos creado una plataforma de datos líder en la industria que es flexible, potente y compleja (por necesidad). También hemos creado un rico ecosistema de herramientas y servicios complementarios, como Genie, un servicio federado de ejecución de trabajos, y Metacat, un metastore federado. Estas herramientas simplifican la complejidad, lo que permite admitir un conjunto más amplio de usuarios en toda la empresa.

La diversidad de usuarios es emocionante, pero tiene un costo: la plataforma de datos de Netflix, y su ecosistema de herramientas y servicios, debe escalar para admitir casos de uso adicionales, idiomas, patrones de acceso y más. Para comprender mejor este problema, considere 3 roles comunes: ingeniero analítico, ingeniero de datos y científico de datos.

Ejemplo de cómo las herramientas y las preferencias de idioma pueden variar según los roles

En general, cada rol se basa en un conjunto diferente de herramientas e idiomas. Por ejemplo, un ingeniero de datos podría crear un nuevo agregado de un conjunto de datos que contenga billones de eventos de transmisión, utilizando Scala en IntelliJ. Un ingeniero analítico podría usar ese agregado en un nuevo informe sobre la calidad de transmisión global, utilizando SQL y Tableau. Y ese informe podría llevar a un científico de datos a construir un nuevo modelo de compresión de transmisión, usando R y RStudio. En la superficie, estos parecen flujos de trabajo dispares, aunque complementarios. Pero si profundizamos más, vemos que cada uno de estos flujos de trabajo tiene múltiples tareas superpuestas:

exploración de datos: ocurre temprano en un proyecto; puede incluir ver datos de muestra, ejecutar consultas para perfiles estadísticos y análisis exploratorios, y visualizar datos

preparación de datos: tarea iterativa; puede incluir limpiar, estandarizar, transformar, desnormalizar y agregar datos; típicamente la tarea de un proyecto que requiere más tiempo

validación de datos - tarea recurrente; puede incluir ver datos de muestra, ejecutar consultas para perfiles estadísticos y análisis agregado, y visualizar datos; generalmente ocurre como parte de la exploración de datos, preparación de datos, desarrollo, predespliegue y fases posteriores al despliegue

producción: ocurre tarde en un proyecto; puede incluir la implementación de código en producción, rellenar conjuntos de datos, modelos de capacitación, validar datos y programar flujos de trabajo

Para ayudar a nuestros usuarios a escalar, queremos que estas tareas sean lo más sencillas posible. Para ayudar a nuestra plataforma a escalar, queremos minimizar la cantidad de herramientas que necesitamos para soportar. ¿Pero cómo? Ninguna herramienta individual podría abarcar todas estas tareas; Además, una sola tarea a menudo requiere múltiples herramientas. Sin embargo, cuando agregamos otra capa de abstracción, emerge un patrón común en todas las herramientas e idiomas: ejecutar código, explorar datos, presentar resultados.

De hecho, un proyecto de código abierto fue diseñado para hacer precisamente eso: Proyecto Jupyter.

Cuadernos Jupyter

Cuaderno Jupyter renderizado en el escritorio nteract con Vega y Altair

El Proyecto Jupyter comenzó en 2014 con el objetivo de crear un conjunto consistente de herramientas de código abierto para investigación científica, flujos de trabajo reproducibles, narrativas computacionales y análisis de datos. Esas herramientas se tradujeron bien en la industria, y hoy las computadoras portátiles Jupyter se han convertido en una parte esencial del conjunto de herramientas para científicos de datos. Para darle una idea de su impacto, Jupyter recibió el Premio ACM Software Systems 2017, un prestigioso honor que comparte con Java, Unix y la Web.

Para comprender por qué el portátil Jupyter es tan atractivo para nosotros, considere la funcionalidad principal que proporciona:

  • Un protocolo de mensajería para introspección y ejecución de código que es independiente del lenguaje.
  • un formato de archivo editable para describir y capturar código, salida de código y notas de descuento
  • Una interfaz de usuario basada en web para escribir y ejecutar código de forma interactiva, así como para visualizar resultados

El protocolo Jupyter proporciona una API de mensajería estándar para comunicarse con los núcleos que actúan como motores computacionales. El protocolo permite una arquitectura componible que separa dónde se escribe el contenido (la interfaz de usuario) y dónde se ejecuta el código (el núcleo). Al aislar el tiempo de ejecución de la interfaz, las computadoras portátiles pueden abarcar varios idiomas y mantener la flexibilidad en la configuración del entorno de ejecución. Si existe un núcleo para un idioma que sabe cómo comunicarse utilizando el protocolo Jupyter, los portátiles pueden ejecutar código enviando mensajes de un lado a otro con ese núcleo.

Todo esto está respaldado por un formato de archivo que almacena el código y los resultados juntos. Esto significa que se puede acceder a los resultados más tarde sin necesidad de volver a ejecutar el código. Además, el cuaderno almacena prosa rica para dar contexto a lo que está sucediendo dentro del cuaderno. Esto lo convierte en un formato ideal para comunicar el contexto comercial, documentar supuestos, anotar código, describir conclusiones y más.

Casos de uso

De nuestros muchos casos de uso, las formas más comunes en las que usamos las notebooks hoy en día son: acceso a datos, plantillas de notebook y programación de notebooks.

Acceso a los datos

Las computadoras portátiles se introdujeron por primera vez en Netflix para admitir flujos de trabajo de ciencia de datos. A medida que su adopción creció entre los científicos de datos, vimos la oportunidad de escalar nuestros esfuerzos de herramientas. Nos dimos cuenta de que podíamos aprovechar la versatilidad y la arquitectura de los portátiles Jupyter y ampliarla para el acceso general a los datos. En el tercer trimestre de 2017, comenzamos este trabajo en serio, elevando los portátiles de una herramienta de nicho a un ciudadano de primera clase de la plataforma de datos de Netflix.

Desde la perspectiva de nuestros usuarios, las computadoras portátiles ofrecen una interfaz conveniente para ejecutar código de forma iterativa, explorar la salida y visualizar datos, todo desde un único entorno de desarrollo basado en la nube. También mantenemos una biblioteca de Python que consolida el acceso a las API de la plataforma. Esto significa que los usuarios tienen acceso programático a prácticamente toda la plataforma desde un portátil. Debido a esta combinación de versatilidad, potencia y facilidad de uso, hemos visto una rápida adopción orgánica para todos los tipos de usuarios en toda nuestra plataforma.

Hoy en día, los portátiles son la herramienta más popular para trabajar con datos en Netflix.

Plantillas de cuaderno

A medida que expandimos el soporte de la plataforma para portátiles, comenzamos a introducir nuevas capacidades para satisfacer nuevos casos de uso. De este trabajo surgieron las libretas parametrizadas. Un cuaderno parametrizado es exactamente lo que parece: un cuaderno que le permite especificar parámetros en su código y aceptar valores de entrada en tiempo de ejecución. Esto proporciona un excelente mecanismo para que los usuarios definan los portátiles como plantillas reutilizables.

Nuestros usuarios han encontrado una sorprendente cantidad de usos para estas plantillas. Algunos de los más comunes son:

  • Científico de datos: realice un experimento con diferentes coeficientes y resuma los resultados
  • Ingeniero de datos: ejecute una recopilación de auditorías de calidad de datos como parte del proceso de implementación
  • Analista de datos: comparta consultas y visualizaciones preparadas para permitir que un interesado explore más profundamente de lo que Tableau permite
  • Ingeniero de software: envíe por correo electrónico los resultados de un script de solución de problemas cada vez que haya una falla

Programar cuadernos

Una de las formas más novedosas en las que estamos aprovechando los portátiles es como una capa unificadora para programar flujos de trabajo.

Dado que cada computadora portátil puede ejecutarse contra un núcleo arbitrario, podemos admitir cualquier entorno de ejecución que un usuario haya definido. Y debido a que los cuadernos describen un flujo lineal de ejecución, dividido por celdas, podemos mapear la falla a celdas particulares. Esto permite a los usuarios describir una breve narrativa de ejecución y visualizaciones que podemos informar con precisión cuando se ejecuta en un momento posterior.

Este paradigma significa que podemos usar portátiles para el trabajo interactivo y pasar sin problemas a la programación que funciona para que se ejecute de forma recurrente. Para los usuarios, esto es muy conveniente. Muchos usuarios construyen un flujo de trabajo completo en una computadora portátil, solo para tener que copiarlo / pegarlo en archivos separados para programarlo cuando estén listos para implementarlo. Al tratar los portátiles como un flujo de trabajo lógico, podemos programarlo fácilmente igual que cualquier otro flujo de trabajo.

También podemos programar otros tipos de trabajo a través de cuadernos. Cuando un trabajo Spark o Presto se ejecuta desde el planificador, el código fuente se inyecta en un cuaderno recién creado y se ejecuta. Ese cuaderno se convierte en un registro histórico inmutable, que contiene todos los artefactos relacionados, incluido el código fuente, los parámetros, la configuración del tiempo de ejecución, los registros de ejecución, los mensajes de error, etc. Cuando se solucionan fallas, esto ofrece un punto de entrada rápido para la investigación, ya que toda la información relevante se ubica y el portátil se puede iniciar para la depuración interactiva.

Infraestructura portátil

El soporte de estos casos de uso a escala de Netflix requiere una amplia infraestructura de soporte. Vamos a presentar brevemente algunos de los proyectos de los que hablaremos.

nteract es una interfaz de usuario de próxima generación basada en React para portátiles Jupyter. Proporciona una interfaz simple e intuitiva y ofrece varias mejoras sobre la interfaz de usuario clásica de Jupyter, como barras de herramientas de celdas en línea, celdas arrastrables y desplegables, y un explorador de datos incorporado.

Papermill es una biblioteca para parametrizar, ejecutar y analizar cuadernos Jupyter. Con él, puede generar múltiples cuadernos con diferentes conjuntos de parámetros y ejecutarlos simultáneamente. Papermill también puede ayudar a recopilar y resumir métricas de una colección de cuadernos.

Commuter es un servicio ligero, escalable verticalmente para ver y compartir portátiles. Proporciona una versión compatible con Jupyter de la API de contenido y hace que sea trivial leer cuadernos almacenados localmente o en Amazon S3. También ofrece un explorador de directorios para buscar y compartir cuadernos.

Titus es una plataforma de administración de contenedores que proporciona una ejecución de contenedores escalable y confiable e integración nativa de la nube con Amazon AWS. Titus fue construido internamente en Netflix y se usa en producción para potenciar los sistemas de transmisión, recomendación y contenido de Netflix.

Exploramos esta arquitectura en nuestra siguiente publicación de blog, Scheduling Notebooks at Netflix. A los fines de esta publicación, solo presentaremos tres de sus componentes fundamentales: almacenamiento, cómputo e interfaz.

Infraestructura de portátiles en Netflix

Almacenamiento

La plataforma de datos de Netflix se basa en Amazon S3 y EFS para el almacenamiento en la nube, que las computadoras portátiles tratan como sistemas de archivos virtuales. Esto significa que cada usuario tiene un directorio de inicio en EFS, que contiene un espacio de trabajo personal para portátiles. Este espacio de trabajo es donde almacenamos cualquier cuaderno creado o cargado por un usuario. Aquí también se produce toda la actividad de lectura y escritura cuando un usuario inicia un cuaderno de forma interactiva. Confiamos en una combinación de [espacio de trabajo + nombre de archivo] para formar el espacio de nombres del cuaderno, p. /efs/users/kylek/notebooks/MySparkJob.ipynb. Utilizamos este espacio de nombres para ver, compartir y programar cuadernos. Esta convención evita colisiones y facilita la identificación del usuario y la ubicación de la computadora portátil en el volumen EFS.

Podemos confiar en la ruta del espacio de trabajo para abstraer la complejidad del almacenamiento basado en la nube de los usuarios. Por ejemplo, solo se muestra el nombre de archivo de un cuaderno en las listas de directorios, p. MySparkJob.ipynb. Se puede acceder a este mismo archivo en ~ / notebooks / MySparkJob.ipynb desde una terminal.

Almacenamiento de notebook versus acceso a notebook

Cuando el usuario programa un cuaderno, el programador copia el cuaderno del usuario de EFS a un directorio común en S3. El cuaderno en S3 se convierte en la fuente de la verdad para el planificador, o cuaderno fuente. Cada vez que el programador ejecuta una computadora portátil, crea una instancia de una nueva computadora portátil de origen. Este nuevo cuaderno es lo que realmente se ejecuta y se convierte en un registro inmutable de esa ejecución, que contiene el código, la salida y los registros de cada celda. Nos referimos a esto como el cuaderno de salida.

La colaboración es fundamental para la forma en que trabajamos en Netflix. No fue una sorpresa cuando los usuarios comenzaron a compartir las URL de los portátiles. A medida que esta práctica creció, nos encontramos con problemas frecuentes con sobrescrituras accidentales causadas por el acceso simultáneo de varias personas al mismo cuaderno. Nuestros usuarios querían una manera de compartir su cuaderno activo en un estado de solo lectura. Esto condujo a la creación de Commuter. Detrás de escena, Commuter muestra las API de Jupyter para / files y / api / contents para enumerar directorios, ver el contenido del archivo y acceder a los metadatos del archivo. Esto significa que los usuarios pueden ver de forma segura los portátiles sin afectar los trabajos de producción o los portátiles en funcionamiento.

Calcular

La gestión de los recursos informáticos es una de las partes más difíciles de trabajar con datos. Esto es especialmente cierto en Netflix, donde empleamos una arquitectura contenedorizada altamente escalable en AWS. Todos los trabajos en la Plataforma de datos se ejecutan en contenedores, incluidas consultas, canalizaciones y cuadernos. Naturalmente, queríamos abstraer la mayor cantidad posible de esta complejidad.

Se aprovisiona un contenedor cuando un usuario inicia un servidor portátil. Proporcionamos valores predeterminados razonables para los recursos del contenedor, que funcionan para ~ 87.3% de los patrones de ejecución. Cuando eso no es suficiente, los usuarios pueden solicitar más recursos utilizando una interfaz simple.

Los usuarios pueden seleccionar tanto o tan poco cálculo + memoria como necesiten

También proporcionamos un entorno de ejecución unificado con una imagen de contenedor preparada. La imagen tiene bibliotecas comunes y una matriz de núcleos predeterminados preinstalados. No todo en la imagen es estático: nuestros núcleos obtienen las versiones más recientes de Spark y las configuraciones de clúster más recientes para nuestra plataforma. Esto reduce la fricción y el tiempo de configuración de las nuevas computadoras portátiles y, en general, nos mantiene en un solo entorno de ejecución.

Bajo el capó estamos gestionando la orquestación y los entornos con Titus, nuestro servicio de gestión de contenedores Docker. Complementamos aún más ese servicio administrando la configuración e imagen del servidor particular del usuario. La imagen también incluye grupos y roles de seguridad del usuario, así como variables de entorno comunes para la identidad dentro de las bibliotecas incluidas. Esto significa que nuestros usuarios pueden pasar menos tiempo en infraestructura y más tiempo en datos.

Interfaz

Anteriormente describimos nuestra visión de que los portátiles se conviertan en la herramienta de elección para trabajar con datos. Pero esto presenta un desafío interesante: ¿cómo puede una sola interfaz admitir a todos los usuarios? Todavía no conocemos la respuesta, pero tenemos algunas ideas.

Sabemos que queremos inclinarnos hacia la simplicidad. Esto significa una interfaz de usuario intuitiva con una estética minimalista, y también requiere una experiencia de usuario reflexiva que facilite las cosas difíciles. Esta filosofía se alinea bien con los objetivos de nteract, una interfaz basada en React para portátiles Jupyter. Hace hincapié en la simplicidad y la capacidad de compilación como principios básicos de diseño, lo que lo convierte en un componente ideal para el trabajo que queremos hacer.

Una de las quejas más frecuentes que escuchamos de los usuarios es la falta de visualización de datos nativos a través de los límites del idioma, especialmente para los idiomas que no son Python. El Explorador de datos de nteract es un buen ejemplo de cómo podemos simplificar las cosas difíciles al proporcionar una forma independiente del lenguaje para explorar los datos rápidamente.

Puede ver el Explorador de datos en acción en este cuaderno de muestra en MyBinder. (tenga en cuenta: puede tardar un minuto en cargar)

Visualizar el conjunto de datos del Informe de felicidad mundial con el Explorador de datos de nteract

También presentamos soporte nativo para la parametrización, lo que facilita la programación de cuadernos y la creación de plantillas reutilizables.

Soporte nativo para portátiles parametrizados en nteract

Aunque los portátiles ya ofrecen mucho valor en Netflix, acabamos de comenzar. Sabemos que necesitamos hacer inversiones tanto en el front-end como en el back-end para mejorar la experiencia general del portátil. Nuestro trabajo durante los próximos 12 meses se centra en mejorar la confiabilidad, la visibilidad y la colaboración. El contexto es primordial para los usuarios, por eso estamos aumentando la visibilidad del estado del clúster, el estado del kernel, el historial de trabajos y más. También estamos trabajando en el control automático de versiones, la programación nativa en la aplicación, un mejor soporte para visualizar Spark DataFrames y una mayor estabilidad para nuestro núcleo Scala. Entraremos en más detalles sobre este trabajo en una futura publicación de blog.

Proyectos de código abierto

Netflix ha sido durante mucho tiempo un defensor del código abierto. Valoramos la energía, los estándares abiertos y el intercambio de ideas que surgen de las colaboraciones de código abierto. Muchas de las aplicaciones que desarrollamos para la Plataforma de datos de Netflix ya se han abierto a través de Netflix OSS. También tenemos la intención de no crear soluciones únicas o sucumbir a la mentalidad de "No inventado aquí". Siempre que sea posible, aprovechamos y contribuimos a proyectos de código abierto existentes, como Spark, Jupyter y pandas.

La infraestructura que hemos descrito se basa en gran medida en el ecosistema del Proyecto Jupyter, pero hay algunos lugares en los que divergemos. En particular, hemos elegido nteract como la interfaz de usuario del portátil para Netflix. Tomamos esta decisión por muchas razones, incluida la alineación con nuestra pila de tecnología y filosofías de diseño. A medida que superamos los límites de lo que puede hacer una computadora portátil, probablemente crearemos nuevas herramientas, bibliotecas y servicios. Estos proyectos también serán de código abierto como parte del ecosistema nteract.

Reconocemos que lo que tiene sentido para Netflix no necesariamente tiene sentido para todos. Hemos diseñado estos proyectos teniendo en cuenta la modularidad. Esto hace posible elegir y elegir solo los componentes que tengan sentido para su entorno, p. Ej. Fábrica de papel, sin requerir un compromiso con todo el ecosistema.

Que sigue

Como equipo de plataforma, nuestra responsabilidad es permitir a Netflixers hacer cosas asombrosas con los datos. Los portátiles ya están teniendo un impacto dramático en Netflix. Con las importantes inversiones que estamos haciendo en este espacio, estamos entusiasmados de ver crecer este impacto. Si desea formar parte de él, consulte nuestras ofertas de trabajo.

¡Uf! Gracias por quedarte con nosotros en esta larga publicación. Acabamos de arañar la superficie de lo que estamos haciendo con las computadoras portátiles. Esta publicación es la primera parte de una serie de cuadernos en Netflix que lanzaremos en las próximas semanas. Puede seguirnos en Medium para obtener más información de Netflix y consultar los artículos publicados actualmente a continuación:

  • Parte I: Innovación del cuaderno (esta publicación)
  • Parte II: Programación de cuadernos

Estamos encantados de patrocinar la JupyterCon de este año. Si vas a asistir, echa un vistazo a una de las 5 charlas de nuestros ingenieros o visita nuestro stand para hablar sobre Jupyter, nteract o datos con nosotros.

  • 22/8 1:30 PM - Cómo construir sobre los protocolos de Jupyter, Kyle Kelley
  • 8/23 1:50 PM - Cuadernos programados: ejecución de código manejable y rastreable, Matthew Seal
  • 8/23 2:40 PM - Notebooks @ Netflix: de análisis a ingeniería, Michelle Ufford, Kyle Kelley
  • 8/23 5:00 PM - Haciendo hermosos objetos con Jupyter, M Pacer
  • 8/24 2:40 PM - Sistema de configuración de Jupyter, M Pacer et. Alabama.
  • 8/25 9AM - 5PM JupyterCon Community Sprint Day

Hay más formas de aprender de Netflix Data y nos complace compartir:

  • @NetflixData en Twitter
  • Netflix Data habla en YouTube
  • Sitio web de Netflix Research

¡También puede mantenerse actualizado con nteract a través de su lista de correo y blog!