Both sides previous revisionPrevious revisionNext revision | Previous revision |
inv:desenvolvemento:amazon_elastic_mapreduce [2015/05/25 17:13] – ismael.rodriguez | inv:desenvolvemento:amazon_elastic_mapreduce [2018/10/03 09:40] (actual) – [Configuración del cluster] diego.cougil |
---|
====== Amazon Elastic MapReduce ====== | ====== Amazon Elastic MapReduce ====== |
| Amazon Elastic MapReduce ([[http://aws.amazon.com/elasticmapreduce/|Amazon EMR]]) es un servicio web para la configuración y despliegue de un cluster basado en instancias de máquinas en el servicio Amazon Elastic Compute Cloud ([[http://aws.amazon.com/ec2/|Amazon EC2]]) y que es gestionado mediante [[https://hadoop.apache.org/|Hadoop]]. También se puede ejecutar en Amazon EMR otros marcos de trabajo distribuidos como [[https://spark.apache.org/|Spark]], e interactuar con los datos en otros almacenes de datos como [[http://aws.amazon.com/s3/|Amazon S3]]. |
Amazon Elastic MapReduce ([[http://aws.amazon.com/elasticmapreduce/|Amazon EMR]]) es un servicio web para la configuración y depliegue de un cluster basado en instancias de máquinas en el servicio Amazon Elastic Compute Cloud ([[http://aws.amazon.com/ec2/|Amazon EC2]]) y que es gestionado mediante [[https://hadoop.apache.org/|Hadoop]]. También se puede ejecutar en Amazon EMR otros marcos de trabajo distribuídos como [[https://spark.apache.org/|Spark]], e interactuar con los datos en otros almacenes de datos como [[http://aws.amazon.com/s3/|Amazon S3]]. | |
| |
===== Creación de un cluster con EMR ===== | ===== Creación de un cluster con EMR ===== |
Amazon Elastic MapReduce (Amazon EMR) is a web service that makes it easy to process vast amounts of data quickly and cost-effectively. Amazon EMR uses Hadoop, an open source framework, to distribute your data and processing across a resizable cluster of Amazon EC2 instances. It can also run other distributed frameworks such as Spark and Presto. Amazon EMR is used in a variety of applications, including log analysis, web indexing, data warehousing, machine learning, financial analysis, scientific simulation, and bioinformatics. | Un cluster EMR suele tener un ciclo de vida totalmente automatizado y que se establece en el momento de su creación. El proceso general sería: |
| * Lanzamiento de las instancias EC2 de las que se compone el cluster |
Amazon EMR has made enhancements to Hadoop and other open-source applications to work seamlessly with AWS. For example, Hadoop clusters running on Amazon EMR use Amazon Elastic Compute Cloud instances as virtual Linux servers for the master and slave nodes, Amazon Simple Storage Service for bulk storage of input and output data, and Amazon CloudWatch to monitor cluster performance and raise alarms. You can also move data into and out of Amazon DynamoDB using Amazon EMR and Hive. All of this is orchestrated by Amazon EMR control software that launches and manages the Hadoop cluster. | * Ejecución de los scripts de instalación, tanto automáticos de amazon (como las imágenes preconfiguradas [[http://aws.amazon.com/es/amazon-linux-ami/|AMI]]) como los añadidos por el usuario en las acciones de inicialización (Bootstrap actions). |
| * Trabajos a realizar (Steps) normalmente consistentes en carga de datos de entrada, procesamiento de los mismos, y almacenado de los resultados. |
| * Apagado automático del cluster una vez se han terminado todos los steps. |
| |
Open-source projects that run on top of the Hadoop architecture can also be run on Amazon EMR. The most popular applications, such as Hive (a SQL-like scripting language for data warehousing and analysis), Pig (a scripting language for data analysis and transformation), HBase (a columnar, NoSQL data store), DistCp (a tool for copying large data sets), Ganglia (a monitoring framework), Impala (a distributed SQL-like query language), and Hue (a web interface for analyzing data), are already integrated with Amazon EMR. By running Hadoop on Amazon EMR you get the benefits of the cloud: the ability to inexpensively provision clusters of virtual servers within minutes. You can scale the number of virtual servers in your cluster to manage your computation needs, and only pay for what you use. | En las siguientes subsecciones se explica todo lo básico para poder lanzar un cluster EMR y analizar los resultados de las ejecuciones. |
| |
You can run your cluster as a transient process: one that launches the cluster, loads the input data, processes the data, stores the output results, and then automatically shuts down. This is the standard model for a cluster that is performing a periodic processing task. Shutting down the cluster automatically ensures that you are only billed for the time required to process your data. The other model for running a cluster is as a long-running cluster. In this model, you launch a cluster and submit jobs interactively using the command line or you submit units of work called steps. From there you might interactively query the data, use the cluster as a data warehouse, or do periodic processing on a large data set. In this model, the cluster persists even when there are no steps or jobs queued for processing. | ==== Almacenamiento con S3 ==== |
==== Almacenamento con S3 ==== | |
Amazon EMR puede hacer uso de Amazon S3 como almacenamiento de los datos de entrada, los ficheros de log y los datos de salida. Para más información sobre este tipo de sistema de almacenamiento visita la [[http://wiki.apache.org/hadoop/AmazonS3|wiki de amazon]]. | Amazon EMR puede hacer uso de Amazon S3 como almacenamiento de los datos de entrada, los ficheros de log y los datos de salida. Para más información sobre este tipo de sistema de almacenamiento visita la [[http://wiki.apache.org/hadoop/AmazonS3|wiki de amazon]]. |
| |
| |
Una vez creado el contenedor, suele ser una buena práctica organizarlo de la siguiente manera: | Una vez creado el contenedor, suele ser una buena práctica organizarlo de la siguiente manera: |
* Crear una carpeta ''Log'' donde guardar los logs de los despliegues de máquinas EC2, así como de las ejecuciones de los diferentes trabajos. | * Crear una carpeta ''log'' donde guardar los logs de los despliegues de máquinas EC2, así como de las ejecuciones de los diferentes trabajos. |
* Crear una carpeta ''input'' para tener almacenados todos los datos de entrada. | * Crear una carpeta ''input'' para tener almacenados todos los datos de entrada. |
* Crear una carpeta ''output'' que servirá para guardar los resultados de las ejecuciones. | * Crear una carpeta ''output'' que servirá para guardar los resultados de las ejecuciones. |
{{ :inv:desenvolvemento:s3_data.png?nolink&300 |}} | {{ :inv:desenvolvemento:s3_data.png?nolink&300 |}} |
| |
==== Configuración do cluster ==== | ==== Configuración del cluster ==== |
==== Logs ==== | Una vez se dispone de un contenedor S3, ya es posible lanzar un cluster EMR plenamente útil. Después de pulsar en ''Create cluster'' en la consola de EMR, lo primero que hay que hacer es la configuración general del cluster: nombre del cluster y donde almacenar los logs (directorio ''log'' que hemos creado previamente en el bucket S3). |
| {{ :inv:desenvolvemento:emr_conf.png?nolink&700 |}} |
| |
===== Spark sobre EMR ====== | El siguiente paso es la configuración del software que estará disponible en el cluster. En primer lugar se elige la distribución de Hadoop preconfigurada por amazon (versión mayor que emr-4.0.0). Además, es posible añadir software adicional que proporciona Amazon. Es importante que entre este software se encuentre Spark. |
==== Instalar Spark ==== | {{ :inv:desenvolvemento:emr.png?nolink&700 |}} |
| |
| Es importante configurar Spark para que use todos los recursos disponibles en los nodos. Para ello, una configuración básica para introducir en ''Edit software settings'': |
<code bash> | <code bash> |
s3://support.elasticmapreduce/spark/install-spark | [{"classification":"spark","properties":{"maximizeResourceAllocation":"true"}},{"classification":"spark-defaults","properties":{"spark.network.timeout":"500s"}}] |
</code> | </code> |
| |
==== Executar un traballo ==== | Una vez configurado el software, se continúa con la configuración del hardware. La configuración más típica se compone por un nodo ''Master'' donde se lanzarán los trabajos y 1 o más instancias ''Core'' que harán de workers dentro del cluster hadoop (para realizar, por ejemplo, las tareas de mapper). Dependiendo del tipo de necesidad, amazon pone a disposición varios tipos de [[http://aws.amazon.com/ec2/instance-types/#instance-details|instancias EC2]]. |
* **Step type**: Custom JAR | {{ :inv:desenvolvemento:emr_hw.png?nolink&700 |}} |
* **JAR Location**: <code bash>s3://<CLUSTER_REGION>.elasticmapreduce/libs/script-runner/script-runner.jar</code> | |
* **Arguments**: <code bash>/home/hadoop/spark/bin/spark-submit --deploy-mode cluster --master yarn-cluster --class <MAIN_CLASS> s3://<BUCKET>/<FILE_JAR> <JAR_OPTIONS></code> | |
| |
===== Java 8 en EMR ===== | También es posible añadir un par de [[https://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-access-ssh.html|claves de acceso]] previamente generadas para poder acceder al master mediante ssh. |
| {{ :inv:desenvolvemento:emr_key.png?nolink&700 |}} |
| |
| Además del software preconfigurado por amazon, se pueden realizar más acciones de instalación de software o configuración mediante acciones de lanzamiento (Bootstrap actions). |
| {{ :inv:desenvolvemento:emr_bootstrap.png?nolink&700 |}} |
| Para añadir una nueva acción de lanzamiento, es necesario indicar donde está almacenado el script dentro de un bucket S3 y los argumentos necesarios para ejecutar la acción. |
| {{ :inv:desenvolvemento:emr_bootstrap_new.png?nolink&400 |}} |
| |
| Por último, aunque es posible añadir trabajos una vez desplegado el cluster, el procedimiento habitual y más seguro es añadir los trabajos (''Steps'') a realizar en el cluster antes de su lanzamiento. |
| {{ :inv:desenvolvemento:emr_steps.png?nolink&700 |}} |
| Por ejemplo, para añadir la ejecución de un archivo ''jar'' de Java mediante Hadoop, es necesario indicar donde está almacenado el programa dentro de un bucket S3 y los argumentos del mismo. La acción a realizar al terminar el trabajo suele ser el apagado del cluster. Sin embargo, si existiesen varios steps, esta acción sería utilizada solo por el último step. |
| {{ :inv:desenvolvemento:emr_steps_new.png?nolink&600 |}} |
| |
| |
| ==== Logs ==== |
| Durante el despliegue y ejecución del cluster, se irán generando una serie de logs que serán guardados en la carpeta indicada dentro del contenedor S3 ([[http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-manage-view-web-log-files.html#emr-manage-view-web-log-files-s3|más información]]). |
| |
| De entre los logs generados, cabe destacar: |
| * ''/<clusterID>/node/'' contiene los logs de ejecución de los bootstrap actions para cada uno de los nodos, así como el estado de las instancias. |
| * ''/<cluasterID>/steps/'' contiene los logs generados por ejecutar cada uno de los trabajos añadidos como steps. Dentro de estas carpetas se pueden observar los siguientes archivos de log: |
| * controller — Información sobre el procesamiento del trabajo. |
| * syslog — Describe la ejecución del trabajo mediante hadoop. |
| * stderr — La salida estandar de error del trabajo (en Spark suele ser aquí donde están los logs generados por la ejecución del trabajo) |
| * stdout — La salida estandar del trabajo. |
| |
| |
| |
| ===== Spark sobre EMR ====== |
| Desde la versión 4 de la imagen de Hadoop de Amazon (''emr-4.0.0''), Spark está totalmente integrado y solamente es necesario añadir como ''Step'' un ''Spark application''. |
| |
| |
| ==== Ejecutar un trabajo ==== |
| Para ejecutar un trabajo sobre Spark, las opciones son las siguientes (sustituir los argumentos entre <> por sus valores reales): |
| * **Step type**: Spark application |
| * **Deploy mode**: Cluster |
| * **Spark-submit options**: ''--class <MainClass>'' |
| * **Applicaiton location**: Ruta al archivo en una unidad S3. |
| * **Arguments**: Argumentos necesarios del programa JAR anterior. |
| {{ :inv:desenvolvemento:step.png?nolink&700 |}} |
| ==== Lectura y escritura en S3 ==== |
| Spark es capaz de leer y escribir mediante el protocolo s3 sin necesidad de realizar cambios. |
| |
| ===== Java 8 en EMR ===== |
| La última versión de EMR (emr-4.0.0) contiene como versión java 7. Para aquellos que usan java 8 (algo común en este tipo de entorno, por el uso de funciones lambda), pueden instalarlo en el cluster mediante un script ejecutado como bootstrap action. Para ello, solo es necesario almacenar en el contenedor S3 el siguiente script (([[https://gist.github.com/ericeijkelenboom/9951500|Bootstrap script for installing Java 8 on an Amazon Elastic MapReduce instance (AMI 3.0.1)]])), para luego añadirlo como acción bootstrap a la hora de lanzar un nuevo cluster: |
<code bash> | <code bash> |
# Check java version | # Check java version |
if [ "$JAVA_VER" -lt 18 ] | if [ "$JAVA_VER" -lt 18 ] |
then | then |
# Download jdk 8 | # Figure out how many versions of Java and javac we currently have |
echo "Downloading and installing jdk 8" | NR_OF_JRE_OPTIONS=$(echo 0 | alternatives --config java 2>/dev/null | grep 'There ' | awk '{print $3}' | tail -1) |
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8-b132/jdk-8-linux-x64.rpm" | NR_OF_SDK_OPTIONS=$(echo 0 | alternatives --config javac 2>/dev/null | grep 'There ' | awk '{print $3}' | tail -1) |
| |
# Silent install | # Silent install javac (includes jre) |
sudo yum -y install jdk-8-linux-x64.rpm | sudo yum -y install java-1.8.0-devel |
| |
# Figure out how many versions of Java we currently have | echo "Found $NR_OF_JRE_OPTIONS existing versions of java. Adding new version." |
NR_OF_OPTIONS=$(echo 0 | alternatives --config java 2>/dev/null | grep 'There ' | awk '{print $3}' | tail -1) | echo "Found $NR_OF_SDK_OPTIONS existing versions of javac. Adding new version." |
| |
echo "Found $NR_OF_OPTIONS existing versions of java. Adding new version." | # Make java 8 the default |
| echo $(($NR_OF_JRE_OPTIONS + 1)) | sudo alternatives --config java |
| echo $(($NR_OF_SDK_OPTIONS + 1)) | sudo alternatives --config javac |
| |
# Make the new java version available via /etc/alternatives | # Fix wrong links |
sudo alternatives --install /usr/bin/java java /usr/java/default/bin/java 1 | sudo rm /etc/alternatives/java_sdk_openjdk;sudo ln -s /usr/lib/jvm/java-1.8.0-openjdk.x86_64 /etc/alternatives/java_sdk_openjdk |
| sudo rm /etc/alternatives/java_sdk_openjdk_exports;sudo ln -s /usr/lib/jvm-exports/java-1.8.0-openjdk.x86_64 /etc/alternatives/java_sdk_openjdk_exports |
# Make java 8 the default | |
echo $(($NR_OF_OPTIONS + 1)) | sudo alternatives --config java | |
| |
# Set some variables | |
export JAVA_HOME=/usr/java/default/bin/java | |
export JRE_HOME=/usr/java/default/jre | |
export PATH=$PATH:/usr/java/default/bin | |
fi | fi |
| |
JAVA_VER=$(java -version 2>&1 | sed 's/java version "\(.*\)\.\(.*\)\..*"/\1\2/; 1q') | JAVA_VER=$(java -version 2>&1 | sed 's/java version "\(.*\)\.\(.*\)\..*"/\1\2/; 1q') |
| |
| echo "" |
echo "Java version is $JAVA_VER!" | echo "Java version is $JAVA_VER!" |
echo "JAVA_HOME: $JAVA_HOME" | echo "JAVA_HOME: $JAVA_HOME" |