Categorías
Python

Cartilla en Python decoradores

 

Tabla de Contenidos Conceptos

  • grandes volúmenes de datos en PythonLambda Functionsfilter (), del mapa (), y reducir () Establece Funciones
  • Lambda filtro
  • (), del mapa (), y reducir ()
  • Establece
  • Hello World en PySpark
  • ¿Qué es la chispa?
  • ¿Qué es PySpark? API
  • PySpark y estructuras de datos
  • Instalación PySpark
  • Correr PySpark ProgramsJupyter NotebookCommand-Line InterfaceClusterPySpark Shell
  • Jupyter Notebook
  • de línea de comandos de interfaz
  • Cluster
  • PySpark Shell
  • Combinando PySpark con otras herramientas
  • pasos a seguir para Procesamiento real Big Data
  • Conclusión
  • Lambda funciones de filtro
  • (), del mapa (), y reducir ()
  • Establece
  • Jupyter Notebook
  • de línea de comandos de interfaz
  • Cluster
  • PySpark Shell

se está volviendo más común a situaciones cara, donde la cantidad de datos es demasiado grande como para manejar en una sola máquina. Afortunadamente, las tecnologías tales como la chispa de Apache, Hadoop, y otros han sido desarrollados para resolver este problema exacto. La potencia de estos sistemas puede ser aprovechado directamente desde Python usando PySpark!

eficientemente manejando bases de datos de gigabytes y más es bien dentro del alcance de cualquier desarrollador de Python , si usted es un científico de datos, un desarrollador web, o cualquier otra cosa.

En este tutorial, aprenderá: conceptos

  • Lo Python se pueden aplicar a los grandes datos
  • Cómo utilizar Spark Apache y PySpark
  • Cómo escribir programas básicos PySpark
  • cómo ejecutar programas en PySpark pequeños conjuntos de datos a nivel local
  • dónde ir después de tomar sus habilidades PySpark a un sistema distribuido de experiencia

gratuito: Haga clic aquí para obtener acceso a un capítulo de trucos Python: El libro que le muestra las mejores prácticas de Python con ejemplos simples que usted se puede aplicar de inmediato a escribir código más bonito + Pythonic. Conceptos

grandes volúmenes de datos en Python

A pesar de su popularidad como simplemente un lenguaje de script, Python expone varios paradigmas de programación como la programación orientada matriz de programación orientado a objetos, programación asincrónica, y muchos otros. Un paradigma que es de particular interés para los aspirantes a profesionales de Big Data es la programación funcional. La programación funcional

es un paradigma común cuando se trata de grandes volúmenes de datos. Escribir en un funcionales marcas manera durante vergonzosamente código paralelo. Esto significa que es más fácil de tomar su código y hacer que se ejecute en varias CPUs o incluso máquinas completamente diferentes. Puede evitar las restricciones de memoria y CPU físicas de una sola estación de trabajo ejecutando en varios sistemas a la vez.

Este es el poder del ecosistema PySpark, lo que le permite tomar el código funcional y lo distribuye de forma automática a través de todo un conjunto de ordenadores.

Por suerte para los programadores de Python, muchas de las ideas centrales de la programación funcional están disponibles en la biblioteca estándar de Python y muebles empotrados. Usted puede aprender muchos de los conceptos necesarios para el procesamiento de grandes volúmenes de datos sin tener que abandonar la comodidad de Python.

La idea central de la programación funcional es que los datos deben ser manipulados por funciones sin mantener ningún estado externo. Esto significa que su código evita las variables globales y siempre devuelve nuevos datos en lugar de la manipulación de los datos en el lugar.

Otra idea común en la programación funcional es funciones anónimas. Python expone funciones anónimas utilizando la palabra clave lambda, que no debe confundirse con las funciones AWS Lambda.

Ahora que usted sabe algunos de los términos y conceptos, se puede explorar cómo esas ideas se manifiestan en el ecosistema Python. Funciones

Lambda

funciones lambda en Python se definen en línea y se limitan a una sola expresión. Es probable que haya visto las funciones lambda cuando se utiliza la función integrada de ordenados ():

>>> x = ['Python', 'programming', 'is', 'awesome!']
>>> print(sorted(x))
['Python', 'awesome!', 'is', 'programming']
>>> print(sorted(x, key=lambda arg: arg.lower()))
['awesome!', 'is', 'programming', 'Python']

El parámetro clave para la ordenada se llama para cada elemento en el iterable. Esto hace que la clasificación entre mayúsculas y minúsculas cambiando todas las cadenas en minúsculas antes la clasificación se lleva a cabo.

Este es un caso de uso común para las funciones lambda, pequeñas funciones anónimas que mantienen ningún estado externo. existen

Otras funciones de programación funcionales comunes en Python, así, como filtro (), del mapa (), y reducir (). Todas estas funciones pueden hacer uso de las funciones lambda o funciones estándar definidos con def de una manera similar.

filtro

(), del mapa (), y reducir ()

El filtro incorporado (), del mapa (), y reducir () funciones son comunes en la programación funcional. Pronto veremos que estos conceptos pueden constituir una parte importante de la funcionalidad de un programa PySpark.

Es importante entender estas funciones en un contexto núcleo de Python. A continuación, podrás traducir ese conocimiento en programas PySpark y la API de chispa. Filtro

() filtra los elementos de un iterable en base a una condición, expresada típicamente como una función lambda: Filtro

>>> x = ['Python', 'programming', 'is', 'awesome!']
>>> print(list(filter(lambda arg: len(arg) < 8, x))) ['Python', 'is']

() toma un iterable, llama a la función lambda en cada artículo, y vuelve los artículos en el que el lambda retorna true .

Nota: lista de marcación () es necesario porque el filtro () es también un iterable. filter () sólo le da los valores a medida que bucle sobre ellas. lista () Las fuerzas de todos los artículos en la memoria a la vez en lugar de tener que utilizar un bucle.

Puede imaginar el uso de filtro () para reemplazar un patrón común para bucle como la siguiente:

def is_less_than_8_characters(item):
return len(item) < 8 x = ['Python', 'programming', 'is', 'awesome!'] results = [] for item in x: if is_less_than_8_characters(item): results.append(item) print(results)

Este código recoge todas las cadenas que tienen menos de 8 caracteres. El código es más detallado que el ejemplo filter (), pero realiza la misma función con los mismos resultados.

Otra ventaja menos evidente de filtro () es que devuelve un iterable. Este filtro de medios () no requiere que el equipo tiene suficiente memoria para contener todos los elementos de la iterable a la vez. Esto es cada vez más importante con conjuntos de datos grandes que pueden crecer rápidamente a varios gigabytes de tamaño. mapa

() es similar al filtro () en que se aplica una función a cada elemento en un iterable, pero siempre produce un mapeo 1-a-1 de los artículos originales. El nueva iterable que el mapa () devuelve siempre tendrán el mismo número de elementos que el iterable original, que no era el caso con filtro (): mapa

>>> x = ['Python', 'programming', 'is', 'awesome!']
>>> print(list(map(lambda arg: arg.upper(), x)))
['PYTHON', 'PROGRAMMING', 'IS', 'AWESOME!']

() llama automáticamente la función lambda sobre todos los temas, de manera efectiva la sustitución de un bucle como la siguiente:

results = []

x = ['Python', 'programming', 'is', 'awesome!']
for item in x:
results.append(item.upper())

print(results)

el bucle tiene el mismo resultado que el ejemplo del mapa (), que recoge todos los elementos en su forma mayúscula. Sin embargo, como con el ejemplo filter (), MAP () devuelve una iterable, que a su vez hace que sea posible procesar grandes conjuntos de datos que son demasiado grandes para caber completamente en la memoria.

Finalmente, el último del trío funcional en la biblioteca estándar de Python es reducir (). Al igual que con el filtro () y mapa (), reducir () aplica una función a los elementos de un iterable.

Una vez más, la función que se aplica puede ser una función estándar de Python creado con la palabra clave def o una función lambda.

Sin embargo, reducir () no devuelve un nuevo iterable. En su lugar, reducir () utiliza la función llamada para reducir el iterable a un solo valor:

>>> from functools import reduce
>>> x = ['Python', 'programming', 'is', 'awesome!']
>>> print(reduce(lambda val1, val2: val1 + val2, x))
Pythonprogrammingisawesome!

Este código combina todos los elementos de la iterable, de izquierda a derecha, en un solo elemento. No hay ninguna llamada a la lista () aquí porque reduce () ya se devuelve un solo elemento.

Nota: Python 3.x trasladó la incorporada en reducir la función () en el paquete functools.

lambda, map (), filter (), y reducir () son conceptos que existen en muchos idiomas y se pueden utilizar en los programas regulares de Python. Pronto, verá estos conceptos se extienden a la API PySpark para procesar grandes cantidades de datos.

Conjuntos Conjuntos

son otra pieza común de funcionalidad que existe en la norma Python y es ampliamente útil en el procesamiento de grandes volúmenes de datos. Los conjuntos son muy similares a las listas excepto que no tienen ningún pedido y no pueden contener valores duplicados. Se puede pensar en un conjunto lo más similar a las teclas en un diccionario de Python.

Hola Mundo en PySpark

Como en cualquier tutorial de programación buena, tendrá que empezar con un ejemplo Hello World. A continuación se PySpark equivalente:

import pyspark
sc = pyspark.SparkContext('local[*]')

txt = sc.textFile('file:////usr/share/doc/python/copyright')
print(txt.count())

python_lines = txt.filter(lambda line: 'python' in line.lower())
print(python_lines.count())

no se preocupe por todos los detalles todavía. La idea principal es tener en cuenta que un programa PySpark no es muy diferente de un programa regular de Python.

Nota: Este programa es probable que lanzar una excepción en su sistema si usted no tiene instalado todavía PySpark o no tiene el archivo del copyright especificado, que verá cómo hacerlo más adelante.

Vas a aprender todos los detalles de este programa pronto, pero se fije bien. El programa cuenta el número total de líneas y el número de líneas que tienen la palabra pitón en un archivo con el nombre de autor.

Recuerde, un programa PySpark no es muy diferente de un habitual Python programa , pero el modelo de ejecución pueden ser muy diferentes de un programa regular de Python, especialmente si se está ejecutando en un clúster.

No puede haber un montón de cosas que suceden detrás de las escenas que distribuyen el procesamiento a través de múltiples nodos, si estás en un clúster. Sin embargo, por ahora, pensar en el programa como un programa Python que utiliza la biblioteca PySpark.

Ahora que ya hemos visto algunos conceptos comunes funcionales que existen en Python, así como un programa PySpark simple, es el momento de sumergirse más profundamente en la chispa y PySpark.

¿Qué es la chispa?

Apache Spark se compone de varios componentes, de modo describiendo puede ser difícil. En su esencia, Spark es un motor de genérico para el procesamiento de grandes cantidades de datos.

Spark está escrito en Scala y se ejecuta en la JVM. Spark se ha incorporado en los componentes para el procesamiento de datos de streaming, aprendizaje automático, procesamiento gráfico, e incluso interactuar con los datos a través de SQL.

En esta guía, sólo se va a aprender acerca de los componentes de la base de chispa para el procesamiento de grandes volúmenes de datos. Sin embargo, todos los demás componentes, tales como el aprendizaje de máquina, SQL, y así sucesivamente están disponibles para proyectos de Python a través de PySpark también.

¿Qué es PySpark?

Spark se implementa en Scala, un lenguaje que se ejecuta en la JVM, por lo que ¿cómo se puede acceder a toda la funcionalidad que a través de Python?

PySpark es la respuesta.

La versión actual de PySpark es 2.4.3 y funciona con Python 2.7, 3.3, o superior.

Se puede pensar en PySpark como un contenedor basado en Python en la parte superior de la API de Scala. Esto significa que tiene dos conjuntos de documentación para hacer referencia a:

El PySpark documentos de la API tienen ejemplos, pero a menudo usted querrá hacer referencia a la documentación Scala y traducir el código en la sintaxis de Python para sus programas PySpark. Por suerte, Scala es un lenguaje de programación basado en las funciones de fácil lectura.

PySpark comunica con el API basada en Scala Spark través de la biblioteca Py4J. Py4J no es específico de PySpark o chispa. Py4J permite que cualquier programa de Python para hablar con código basado en JVM.

Hay dos razones por las que PySpark se basa en el paradigma funcional:

Otra forma de pensar de PySpark es una biblioteca que permite el procesamiento de grandes cantidades de datos en una única máquina o un grupo de máquinas.

En un contexto de Python, pensar en PySpark tiene una manera de manejar el procesamiento en paralelo sin la necesidad de la rosca o módulos de multiprocesamiento. Toda la comunicación complicada y la sincronización entre hilos, procesos, e incluso diferentes CPUs es manejado por chispa.

PySpark API y estructuras de datos

para interactuar con PySpark, se crean estructuras de datos especializadas llamadas resilientes Conjuntos de datos distribuidas (DDR).

DDR ocultar toda la complejidad de la transformación y distribución de datos de forma automática a través de múltiples nodos por un programador si se está ejecutando en un clúster.

Para entender mejor las estructuras de datos de la API y PySpark, recuperar el programa Hello World mencionó anteriormente:

import pyspark
sc = pyspark.SparkContext('local[*]')

txt = sc.textFile('file:////usr/share/doc/python/copyright')
print(txt.count())

python_lines = txt.filter(lambda line: 'python' in line.lower())
print(python_lines.count())

El punto de entrada de cualquier programa PySpark es un objeto SparkContext. Este objeto le permite conectarse a un clúster de chispa y crear DDR. La locales [*] cadena es una cadena especial que indica que está utilizando un cluster locales , que es otra forma de decir que se está ejecutando en el modo de un solo equipo. El * indica chispa para crear el mayor número de subprocesos de trabajo como núcleos lógicos en su máquina.

Creación de una SparkContext puede ser más complicado cuando se está utilizando un clúster. Para conectarse a un clúster de chispa, puede que tenga que manejar la autenticación y algunas otras piezas de información específica a su clúster. Puede configurar los detalles de manera similar a lo siguiente:

conf = pyspark.SparkConf()
conf.setMaster('spark://head_node:56887')
conf.set('spark.authenticate', True)
conf.set('spark.authenticate.secret', 'secret-key')
sc = SparkContext(conf=conf)

puede empezar a crear DDR vez que haya una SparkContext.

Puede crear DDR en un número de maneras, pero una forma común es la función PySpark PARALLELIZE (). PARALLELIZE () puede transformar algunas estructuras de datos como listas de Python y las tuplas en DDR, que le da la funcionalidad que les hace tolerante a fallos y distribuida.

Para entender mejor DDR, considere otro ejemplo. El siguiente código crea un iterador de 10.000 elementos y luego utiliza PARALLELIZE () para distribuir esos datos en 2 particiones:

>>> big_list = range(10000)
>>> rdd = sc.parallelize(big_list, 2)
>>> odds = rdd.filter(lambda x: x % 2 != 0)
>>> odds.take(5)
[1, 3, 5, 7, 9]

PARALLELIZE () vueltas que iterador en un distribuidos conjunto de números y todos ustedes da la capacidad de la infraestructura del chispa.

Tenga en cuenta que este código se utiliza el método de la RDD filtro () en lugar de Python de filtro incorporado (), que ya hemos visto anteriormente. El resultado es el mismo, pero lo que está sucediendo detrás de las escenas es drásticamente diferente. Al utilizar el método de filtro RDD (), que la operación se produce de una manera distribuida a través de varias CPUs o computadoras.

Una vez más, imaginar esto como Spark haciendo el trabajo de multiprocesamiento para usted, todo encapsulado en la estructura de datos RDD.

toma () es una manera de ver el contenido de la RDD, pero sólo un pequeño subconjunto. tomar () tira de ese subconjunto de datos del sistema de distribuido en una sola máquina.

toma () es importante para la depuración debido a la inspección de todo el conjunto de datos en una sola máquina puede no ser posible. DDR están optimizados para ser utilizado en grandes volúmenes de datos por lo que en un escenario del mundo real una sola máquina puede no tener suficiente memoria RAM para contener todo el conjunto de datos.

Nota: Spark imprime temporalmente la información a la salida estándar cuando se ejecuta ejemplos de este tipo en la cáscara, que verá cómo hacerlo pronto. Su salida estándar puede mostrar temporalmente algo como [Etapa 0:> (0 + 1) / 1].

La salida estándar de texto demuestra cómo Spark es dividir los DDR y el procesamiento de sus datos en varias etapas a través de diferentes CPUs y máquinas.

Otra forma de crear DDR es leer en un archivo con los archivos de texto (), que se ha visto en los ejemplos anteriores. DDR son una de las estructuras de datos fundamentales para el uso de PySpark muchas de las funciones de los DDR de retorno de la API.

Una de las diferencias clave entre DDR y otras estructuras de datos es que el procesamiento se retrasa hasta que se solicite el resultado. Esto es similar a un generador de Python. Los desarrolladores en el ecosistema Python suelen utilizar el término evaluación perezosa para explicar este comportamiento.

Puede apilar múltiples transformaciones en la misma RDD sin ningún suceso procesamiento. Esta funcionalidad es posible porque Spark mantiene un gráfico acíclico dirigido de las transformaciones. El gráfico subyacente sólo se activa cuando se solicitan los resultados finales. En el ejemplo anterior, sin cálculo se llevó a cabo hasta que solicitó los resultados llamando a otra (de).

Existen múltiples maneras de solicitar los resultados de un RDD. Usted puede solicitar explícitamente resultados para ser evaluados y se recogieron a un único nodo de clúster mediante cobro revertido () en un RDD. También se puede solicitar de forma implícita los resultados de varias maneras, una de las cuales estaba usando count () como se vio anteriormente.

Nota: Tenga cuidado al usar estos métodos, ya que tiran de todo el conjunto de datos en la memoria, que no va a funcionar si el conjunto de datos es demasiado grande para caber en la memoria RAM de una sola máquina.

Una vez más, consulte la documentación de la API para PySpark aún más detalles sobre toda la funcionalidad posible.

Instalación PySpark

Por lo general, se encontrará con programas PySpark en un clúster Hadoop, pero se soportan otras opciones de implementación de clúster. Usted puede leer el modo de clúster visión general de la chispa para más detalles.

Nota: la creación de uno de estos grupos puede ser difícil y está fuera del alcance de esta guía. Lo ideal sería que su equipo tiene algunas DevOps asistente ingenieros para ayudar a conseguir que el trabajo. Si no es así, Hadoop publica una guía para ayudarle.

En esta guía, verá varias formas de ejecutar programas PySpark en su máquina local. Esto es útil para probar y aprender, pero usted rápidamente quiere tomar sus nuevos programas y ejecutarlos en un clúster de verdad procesar grandes volúmenes de datos.

veces la creación de PySpark por sí mismo puede ser un reto también, porque de todas las dependencias necesarias.

PySpark se ejecuta en la parte superior de la JVM y requiere una gran cantidad de infraestructura subyacente de Java para funcionar. Una vez dicho esto, vivimos en la era de estibador, lo que hace que la experimentación con PySpark mucho más fácil.

Aún mejor, los desarrolladores increíbles detrás Jupyter haber hecho todo el trabajo pesado para usted. Publican un Dockerfile que incluye todas las dependencias PySpark junto con Jupyter. Por lo tanto, se puede experimentar directamente en un cuaderno Jupyter!

Nota: cuadernos Jupyter tienen mucha funcionalidad. Compruebe outJupyter Notebook: Una introducción para muchos más detalles sobre el uso de cuadernos de manera efectiva.

En primer lugar, tendrá que instalar estibador. Echar un vistazo a Estibador en Acción - ajustador, más feliz, más productivo si no se ha configurado acoplable todavía.

Nota: las imágenes la ventana acoplable pueden ser bastante grandes, así que asegúrate de que estás bien con el uso de hasta alrededor de 5 GB de espacio en disco para utilizar PySpark y Jupyter.

A continuación, puede ejecutar el siguiente comando para descargar y ejecutar automáticamente un recipiente acoplable con una configuración de un solo nodo PySpark pre-construidos. Este comando puede tardar unos minutos debido a que descarga las imágenes directamente desde DockerHub junto con todos los requisitos para Spark, PySpark y Jupyter:

$ docker run -p 8888:8888 jupyter/pyspark-notebook

Una vez que el comando detiene la producción de impresión, que tiene un contenedor en ejecución que tiene todo lo necesario para la prueba a cabo sus programas PySpark en un entorno de un solo nodo.

Para detener su contenedor, escriba Ctrl + C en la misma ventana que ha escrito la orden de marcha en ventana acoplable.

Ahora es el momento para finalmente ejecutar algunos programas!

Ejecución de Programas PySpark

Hay una serie de formas de ejecutar programas PySpark, dependiendo de si usted prefiere una línea de comandos o una interfaz más visual. Para una interfaz de línea de comandos, puede utilizar el comando de encendido por presentar, el shell estándar de Python, o la cáscara PySpark especializado.

En primer lugar, verá la interfaz más visual con un cuaderno Jupyter.

Jupyter Notebook

Puede ejecutar su programa en un cuaderno Jupyter ejecutando el siguiente comando para iniciar el contenedor del estibador que ha descargado previamente (si no está ya en ejecución):

$ docker run -p 8888:8888 jupyter/pyspark-notebook
Executing the command: jupyter notebook
[I 08:04:22.869 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime
otebook_cookie_secret
[I 08:04:25.022 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.7/site-packages/jupyterlab
[I 08:04:25.022 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 08:04:25.027 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 08:04:25.028 NotebookApp] The Jupyter Notebook is running at:
[I 08:04:25.029 NotebookApp] http://(4d5ab7a93902 or 127.0.0.1):8888/?token=80149acebe00b2c98242aa9b87d24739c78e562f849e4437
[I 08:04:25.029 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:04:25.037 NotebookApp]

To access the notebook, open this file in a browser:
file:///home/jovyan/.local/share/jupyter/runtime
bserver-6-open.html
Or copy and paste one of these URLs:
http://(4d5ab7a93902 or 127.0.0.1):8888/?token=80149acebe00b2c98242aa9b87d24739c78e562f849e4437

Ahora usted tiene un recipiente corriendo con PySpark. Tenga en cuenta que al final de la ventana acoplable ejecutar la salida del comando menciona una URL local.

Nota: El resultado de los comandos ventana acoplable será ligeramente diferente en cada máquina porque las fichas, los ID de contenedores, y los nombres de contenedores se generan todo al azar.

Usted necesidad de utilizar esa URL para conectarse al contenedor acoplable corriendo Jupyter en un navegador web. Copiar y pegar la URL desde su salida directamente en su navegador web. Aquí está un ejemplo de la URL que verá probablemente:

$ http://127.0.0.1:8888/?token=80149acebe00b2c98242aa9b87d24739c78e562f849e4437

La URL en la que a continuación se probable variar ligeramente en su máquina, pero una vez que se conecte a esa URL en su navegador, puede acceder a un entorno portátil Jupyter, que debe ser similar a esto:

Desde la página de cuaderno Jupyter, puede utilizar el botón nueva en el extremo derecho para crear un nuevo terminal de Python 3. A continuación, puede probar algo de código, como el ejemplo Hello World desde antes:

import pyspark
sc = pyspark.SparkContext('local[*]')

txt = sc.textFile('file:////usr/share/doc/python/copyright')
print(txt.count())

python_lines = txt.filter(lambda line: 'python' in line.lower())
print(python_lines.count())

Esto es lo que se ejecuta ese código se verá así en el cuaderno Jupyter:

Hay mucho sucediendo detrás de las escenas aquí, por lo que puede tome unos segundos para que los resultados que se vea. La respuesta no aparecerá inmediatamente después de hacer clic en la celda.

de línea de comandos de interfaz

la interfaz de línea de comandos ofrece una variedad de maneras de presentar los programas PySpark incluyendo la cáscara PySpark y el comando de encendido por presentar. Para utilizar estos CLI se acerca, primero debe conectarse a la línea de comandos del sistema que tiene instalado PySpark.

Para conectarse a la línea de comandos de la configuración del estibador, que necesita para iniciar el recipiente como antes y luego adjuntar a dicho contenedor. Una vez más, para iniciar el contenedor, puede ejecutar el siguiente comando:

$ docker run -p 8888:8888 jupyter/pyspark-notebook

Una vez que tenga el recipiente en marcha del estibador, necesita conectarse a ella a través de la cáscara en lugar de un cuaderno Jupyter. Para ello, ejecute el siguiente comando para encontrar el nombre del contenedor:

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d5ab7a93902 jupyter/pyspark-notebook "tini -g -- start-no…" 12 seconds ago Up 10 seconds 0.0.0.0:8888->8888cp kind_edison

Este comando le mostrará todos los contenedores en ejecución. Encontrar el ID de contenedor del contenedor se ejecuta la imagen jupyter / pyspark-portátil y utilizarlo para conectarse a la shell bash el interior del contenedor :

$ docker exec -it 4d5ab7a93902 bash
jovyan@4d5ab7a93902:~$

Ahora usted debe estar conectado a un indicador bash en el interior del contenedor . Puede verificar que las cosas están funcionando, porque el símbolo de su concha pasará a ser algo similar a jovyan @ 4d5ab7a93902, pero utilizando el identificador único de su contenedor.

Nota: Reemplazar 4d5ab7a93902 con el contenedor ID utiliza en su máquina.

Cluster

Puede utilizar el comando de encendido por presentar instalado junto con chispa para enviar código PySpark a un clúster mediante la línea de comandos. Este comando toma un programa PySpark o Scala y lo ejecuta en un clúster. Esto es probablemente cómo va a ejecutar sus trabajos de procesamiento de grandes volúmenes de datos reales.

Nota: El camino a estos comandos depende del lugar donde se instaló la chispa y es probable que sólo funciona al usar el recipiente del estibador hace referencia.

Para ejecutar el ejemplo Hello World (o cualquier programa PySpark) con el recipiente acoplable funcionamiento, primero acceso la cáscara como se describe anteriormente. Una vez que estás en la SHELL del recipiente puede crear archivos utilizando el editor de textos nano.

Para crear el archivo en la carpeta actual, simplemente nano de lanzamiento con el nombre del archivo que desea crear:

$ nano hello_world.py

Type en el contenido del ejemplo Hello World y guardar el archivo tecleando Ctrl + X y siguiendo el proceso de almacenamiento indicaciones:

por último, se puede ejecutar el código a través de la chispa con el comando pyspark a presentar:

$ /usr/local/spark/bin/spark-submit hello_world.py

Este comando resulta en mucho de salida de forma predeterminada por lo que puede ser difícil ver la salida de su programa. Se puede controlar el nivel de detalle de registro tanto dentro de su programa de PySpark cambiando el nivel de la variable de SparkContext. Para hacer eso, poner esta línea cerca de la parte superior de la secuencia de comandos:

sc.setLogLevel('WARN')

Esto omitir algunos de la salida de la chispa a presentar para que pueda ver con mayor claridad la salida de su programa. Sin embargo, en un escenario del mundo real, se le quiere poner ninguna salida en un archivo, base de datos o alguna mecanismo distinto de almacenamiento para la depuración más fácil después.

Por suerte, un programa PySpark aún tiene acceso a toda la biblioteca estándar de Python, por lo que el ahorro de sus resultados a un archivo no es un problema:

import pyspark
sc = pyspark.SparkContext('local[*]')

txt = sc.textFile('file:////usr/share/doc/python/copyright')
python_lines = txt.filter(lambda line: 'python' in line.lower())

with open('results.txt', 'w') as file_obj:
file_obj.write(f'Number of lines: {txt.count()}\n')
file_obj.write(f'Number of lines with python: {python_lines.count()}\n')

Ahora los resultados están en un archivo separado llamado results.txt para facilitar la referencia más adelante.

Nota: los usos anteriores de clave F-strings, que se introdujeron en Python 3.6.

PySpark Shell

Otra forma PySpark específica para ejecutar sus programas está utilizando la cáscara siempre consigo mismo PySpark. Una vez más, el uso de la configuración del estibador, se puede conectar a la CLI del recipiente como se ha descrito anteriormente. A continuación, puede ejecutar la terminal de Python especializado con el siguiente comando:

$ /usr/local/spark/bin/pyspark
Python 3.7.3 | packaged by conda-forge | (default, Mar 27 2019, 23:01:00)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.1
/_/

Using Python version 3.7.3 (default, Mar 27 2019 23:01:00)
SparkSession available as 'spark'.

Ahora está en el entorno de la cáscara Pyspark dentro de su contenedor estibador, y se puede probar un código similar al ejemplo cuaderno Jupyter:

>>> txt = sc.textFile('file:////usr/share/doc/python/copyright')
>>> print(txt.count())
316

Ahora se puede trabajar en la cáscara Pyspark igual que lo haría con su cáscara normal de Python.

Nota: Usted no tiene que crear una variable SparkContext en el ejemplo Pyspark cáscara. La cáscara PySpark crea automáticamente una variable, sc, para conectar al motor de chispa en el modo de un solo nodo.

Usted debe crear su propio SparkContext al presentar programas PySpark reales con chispa someter o un cuaderno Jupyter.

También puede utilizar el terminal de Python estándar para ejecutar sus programas, siempre y cuando PySpark se instala en ese entorno Python. El contenedor del estibador que ha estado usando no tiene PySpark habilitado para el entorno estándar de Python. Por lo tanto, debe utilizar uno de los métodos anteriores para utilizar PySpark en el contenedor del estibador.

combinación con otras herramientas PySpark

Como ya vimos, PySpark incluye bibliotecas adicionales para hacer cosas como el aprendizaje automático y SQL-como la manipulación de grandes conjuntos de datos. Sin embargo, también se pueden utilizar otras bibliotecas científicas comunes como NumPy y pandas.

Debe instalar éstos en el mismo entorno en cada nodo de clúster , y luego su programa puede utilizarlos como de costumbre. A continuación, usted es libre de utilizar todos los trucos pandas idiomáticas familiares que ya conoce.

Recuerde: tramas de datos pandas son evaluados con entusiasmo por lo que todos los datos tendrán que caber en la memoria en una sola máquina .

Próximos pasos para el Real Big Data Processing

Poco después de aprender los conceptos básicos PySpark, seguramente querrá comenzar a analizar enormes cantidades de datos que probablemente no va a funcionar cuando se está utilizando el modo de una sola máquina. Instalación y mantenimiento de un grupo Spark es camino fuera del alcance de esta guía y es probable que un trabajo a tiempo completo en sí mismo.

Por lo tanto, podría ser el momento para visitar el departamento de TI de su oficina o mirada en una solución de clúster Spark alojada. Una posible solución es acogido Databricks.

Databricks le permite alojar sus datos con Microsoft Azure o AWS y tiene una versión de prueba de 14 días. Después

tiene un clúster de chispa de trabajo, tendrá que obtener todos sus datos intothat clúster para el análisis. Spark tiene un número de maneras de importar datos:

Incluso puede leer los datos directamente desde un sistema de archivos de red, que es cómo funcionaban los ejemplos anteriores.

no hay escasez de maneras de conseguir el acceso a todos sus datos, ya sea que esté usando una solución alojada como Databricks o en su propio grupo de máquinas.

Conclusión

PySpark es un buen punto de entrada de Big Data Processing.

En este tutorial, aprendido que usted no tiene que gastar un montón de tiempo a aprender por adelantado si está familiarizado con algunos conceptos de programación funcionales como mapa (), filter (), y Python básico. De hecho, se puede usar todo el Python que ya sabe que incluye herramientas conocidas como NumPy y pandas directamente en sus programas PySpark.

Ahora son capaces de:

  • Comprender incorporado conceptos de Python que se aplican a los programas PySpark Big Data
  • escritura básicas programas
  • Run PySpark en pequeños conjuntos de datos con su equipo local
  • Explore las soluciones más capaces Big Data como una cúmulo chispa u otra costumbre, solución alojada

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *