Documentos de Académico
Documentos de Profesional
Documentos de Cultura
T 1
T 1
com/uber-big-data-platform/
Antes de 2014, nuestra cantidad limitada de datos podría caber en algunas bases
de datos tradicionales de procesamiento de transacciones en línea (OLTP) (en
nuestro caso, MySQL y PostgreSQL). Para aprovechar estos datos, nuestros
ingenieros tuvieron que acceder a cada base de datos o tabla individualmente, y
se dejó a los usuarios escribir su propio código si necesitaban combinar datos
de diferentes bases de datos. En ese momento, no teníamos acceso global ni
una vista global de todos nuestros datos almacenados. De hecho, nuestros datos
estaban dispersos en diferentes bases de datos OLTP, el tamaño total de los
datos era del orden de unos pocos terabytes, y la latencia para acceder a estos
datos fue muy rápida (a menudo, por minuto). La Figura 1, a continuación,
proporciona una visión general de nuestra arquitectura de datos antes de 2014:
Figura 1: Antes de 2014, la cantidad total de datos almacenados en Uber era lo
suficientemente pequeña como para caber en algunas bases de datos OLTP tradicionales.
No hubo una vista global de los datos, y el acceso a los datos fue rápido ya que cada base
de datos fue consultada directamente.
El uso de SQL como una interfaz estándar simple permitió a los operadores de
la ciudad interactuar fácilmente con los datos sin conocer las tecnologías
subyacentes. Además, diferentes equipos de ingeniería comenzaron a construir
servicios y productos adaptados a las necesidades de los usuarios que fueron
informados por estos datos (es decir, uberPool, precios iniciales, etc.) y se
formaron nuevos equipos para usar y servir mejor estos datos (es decir, nuestro
aprendizaje automático y equipos de experimentación).
Limitaciones
Por otro lado, el uso generalizado de nuestro almacén de datos y los datos
entrantes revelaron algunas limitaciones. Como los datos se ingirieron a través
de trabajos ETL ad hoc y carecíamos de un mecanismo de comunicación de
esquema formal, la confiabilidad de los datos se convirtió en una preocupación.
La mayoría de nuestros datos fuente estaban en formato JSON, y los trabajos
de ingestión no eran resistentes a los cambios en el código del productor.
Además de incorporar un lago de datos Hadoop, también hicimos que todos los
servicios de datos en este ecosistema sean escalables horizontalmente,
mejorando así la eficiencia y la estabilidad de nuestra plataforma Big Data. En
particular, tener esta escalabilidad horizontal universal para abordar las
necesidades comerciales inmediatas nos permitió concentrar nuestra energía en
la construcción de la próxima generación de la plataforma de datos en lugar de
la resolución de problemas ad hoc.
Limitaciones
A principios de 2017, nuestra plataforma de Big Data fue utilizada por equipos
de ingeniería y operaciones en toda la empresa, lo que les permitió acceder a
datos nuevos e históricos, todo en un solo lugar. Los usuarios pueden acceder
fácilmente a los datos en Hive, Presto, Spark, Vertica, Notebook y más
opciones de almacén a través de un único portal de interfaz de usuario
adaptado a sus necesidades. Con más de 100 petabytes de datos en HDFS,
100,000 vcores en nuestro clúster de cómputo, 100,000 consultas de Presto
por día, 10,000 trabajos de Spark por día y 20,000 consultas de Hive por día,
nuestra arquitectura de análisis de Hadoop estaba golpeando las limitaciones
de escalabilidad y muchos servicios se vieron afectados por altas latencia de
datos.
ETL y modelado más rápidos: al igual que la ingestión de datos sin procesar,
los trabajos de modelado y ETL se basaron en instantáneas, lo que requiere
que nuestra plataforma reconstruya las tablas derivadas en cada ejecución.
Para reducir la latencia de datos para tablas modeladas, los trabajos ETL
también debían ser incrementales. Esto requería que los trabajos de ETL
extrajeran gradualmente solo los datos modificados de la tabla de origen sin
procesar y actualicen la tabla de salida derivada anterior en lugar de reconstruir
la tabla de salida completa cada poca hora.
Introduciendo Hudi
Con Hudi, los usuarios pueden simplemente pasar su última marca de tiempo de
punto de control y recuperar todos los registros que se han actualizado desde
entonces, independientemente de si estas actualizaciones son registros nuevos
agregados a particiones de fechas recientes o actualizaciones a datos más
antiguos (por ejemplo, un nuevo viaje que ocurre hoy versus un viaje actualizado
de hace 6 meses), sin ejecutar una consulta costosa que escanea toda la tabla
fuente.
Figura 5: La tercera generación de nuestra plataforma Big Data incorpora una ingesta de
datos más rápida e incremental (utilizando nuestro marco Marmaray de código abierto),
así como un almacenamiento y servicio de datos más eficientes a través de nuestra
biblioteca Hudi de código abierto.
Figura 6: Una tabla sin procesar que se está actualizando a través de Hudi Writer se
puede leer en dos modos diferentes: la última vista de modo que devuelve el último
valor para todos los registros y la vista de modo incremental que devuelve solo los
registros actualizados desde la última lectura.
Los usuarios generalmente alternan entre estas dos vistas de tabla según sus
necesidades. Cuando ejecutan una consulta ad hoc para analizar datos
basados en el último estado, utilizan la última vista de modo de la tabla (por
ejemplo, para obtener el número semanal total de viajes por ciudad en los EE.
UU.). Por otro lado, cuando un usuario tiene un trabajo iterativo o una consulta
que necesita obtener solo registros nuevos o modificados desde su última
ejecución, utiliza la vista de modo incremental. Ambas vistas están disponibles
para todas las tablas de Hadoop en todo momento, y los usuarios pueden
cambiar entre diferentes modos según sus necesidades.
Modelo de datos estandarizado
Además de proporcionar diferentes vistas de la misma tabla, también
estandarizamos nuestro modelo de datos para proporcionar dos tipos de tablas
para todos los datos sin procesar de Hadoop:
1. Tabla de historial de cambios. Contiene el historial de todos los registros de
cambios recibidos para una tabla ascendente específica. Esta tabla permite a
los usuarios escanear el historial de cambios para una tabla determinada y se
puede combinar por clave para proporcionar el último valor para cada fila.
2. Tabla de instantáneas fusionadas. Contiene la última vista fusionada de las
tablas aguas arriba. Esta tabla contiene la vista fusionada compactada de todos
los registros de cambios históricos recibidos por clave.
La Figura 7, a continuación, muestra cómo se generan las diferentes tablas sin
procesar de Hive para un almacén de datos de origen ascendente específico
utilizando la secuencia de registros de cambios dados:
Para mejorar la calidad de los datos, identificamos dos áreas clave para la
mejora. Primero, queremos evitar datos que no se ajusten al esquema cuando
algunos de los almacenes de datos ascendentes no imponen o verifican
obligatoriamente el esquema de datos antes del almacenamiento (por ejemplo,
almacenar un valor clave donde el valor es un blob JSON). Esto da como
resultado que ingresen datos incorrectos a nuestro ecosistema Hadoop, lo que
afecta a todos los usuarios intermedios que también dependen de estos datos.
Para evitar una afluencia de datos incorrectos, estamos haciendo la transición
de todos los almacenes de datos ascendentes para realizar verificaciones de
esquema obligatorias en el contenido de datos y rechazar las entradas de
datos si hay algún problema (por ejemplo, no confirmar con el esquema) con
los datos.
La segunda área que encontramos problemática fue la calidad del contenido
real de los datos. Si bien el uso de esquemas garantiza que los datos
contengan los tipos de datos correctos, no verifican los valores de datos reales
(por ejemplo, un número entero en lugar de un número positivo entre [0,150]).
Para mejorar la calidad de los datos, estamos ampliando nuestro servicio de
esquemas para admitir comprobaciones semánticas. Estas verificaciones
semánticas (en otras palabras, tipos de datos específicos de Uber) nos
permiten agregar restricciones adicionales en el contenido de datos real más
allá de la verificación básica de tipos estructurales.
Latencia de datos
Eficiencia de datos
Escalabilidad y confiabilidad