Tenemos una canalización de datos de Beam ejecutándose en un flujo de datos de GCP escrito con Python y Java. Al principio, teníamos algunos trabajos de vigas de pitón simples y directos que funcionaban muy bien. Así que recientemente decidimos transformar más haz de java en trabajo de haz de python. Cuando tenemos un trabajo más complicado, especialmente el trabajo que requiere ventanas en el haz, notamos que hay una lentitud significativa en el trabajo de Python que en el trabajo de Java, que termina usando más CPU y memoria y cuesta mucho más.
algunos ejemplos de código de python se ven así:
step1 = ( read_from_pub_sub | "MapKey" >> beam.Map(lambda elem: (elem.data[key], elem)) | "WindowResults" >> beam.WindowInto( beam.window.SlidingWindows(360,90), allowed_lateness=args.allowed_lateness, ) | "GroupById" >> beam.GroupByKey()Y el código Java es como:
PCollection<DataStructure> step1 = message .apply( "MapKey", MapElements.into( TypeDescriptors.kvs( TypeDescriptors.strings(), TypeDescriptor.of(DataStructure.class))) .via(event -> KV.of(event.key, event))) .apply( "WindowResults", Window.<KV<String, CustomInterval>>into( SlidingWindows.of(Duration.standardSeconds(360)) .every(Duration.standardSeconds(90))) .withAllowedLateness(Duration.standardSeconds(this.allowedLateness)) .discardingFiredPanes()) .apply("GroupById", GroupByKey.<String, DataStructure>create())Nos dimos cuenta de que Python siempre usa como 3 veces más CPU y memoria de lo que necesita Java. Hicimos algunas pruebas experimentales que solo ejecutaron la entrada JSON y la salida JSON, con los mismos resultados. No estamos seguros de que sea solo porque Python, en general, es más lento que Java o porque la forma en que GCP Dataflow ejecuta Beam Python y Java es diferente. Cualquier experiencia similar, pruebas y razones por las que esto es apreciado.
Sí, este es un factor de rendimiento muy normal entre Python y Java. De hecho, para muchos programas el factor puede ser 10x o mucho más.
Los detalles del programa pueden cambiar radicalmente el rendimiento relativo. Aquí hay algunas cosas a considerar:
Si prefiere Python por su sintaxis concisa o su ecosistema de bibliotecas, el enfoque para lograr velocidad es usar bibliotecas C optimizadas o Cython para el procesamiento central, por ejemplo, usando pandas/numpy/etc. Si utilizala nueva API de marco de datos compatible con Pandas de Beam , obtendrá automáticamente este beneficio.